// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/webdriver/script_executor_params.h"

#include "base/stringprintf.h"
#include "cobalt/script/source_code.h"

namespace cobalt {
namespace webdriver {

ScriptExecutorParams::GCPreventedParams ScriptExecutorParams::Create(
    const scoped_refptr<script::GlobalEnvironment>& global_environment,
    const std::string& function_body, const std::string& json_args,
    base::optional<base::TimeDelta> async_timeout) {
  scoped_refptr<ScriptExecutorParams> params(new ScriptExecutorParams());
  DCHECK(!params->prevent_gc_until_create_complete_);
  params->prevent_gc_until_create_complete_.reset(
      new script::GlobalEnvironment::ScopedPreventGarbageCollection(
          global_environment, params));
  params->json_args_ = json_args;

  if (async_timeout) {
    int async_timeout_ms = async_timeout->InMilliseconds();
    params->async_timeout_ = async_timeout_ms;
  }

  std::string function =
      StringPrintf("(function() {\n%s\n})", function_body.c_str());
  scoped_refptr<script::SourceCode> function_source =
      script::SourceCode::CreateSourceCode(
          function.c_str(), base::SourceLocation("[webdriver]", 1, 1));

  if (!global_environment->EvaluateScript(function_source, params.get(),

                                          &params->function_object_)) {
    DLOG(ERROR) << "Failed to create Function object";
  }
  return {params, global_environment.get()};
}

}  // namespace webdriver
}  // namespace cobalt
