Import Cobalt 2.13418
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc
index 4870df4..a6df61e 100644
--- a/src/cobalt/browser/browser_module.cc
+++ b/src/cobalt/browser/browser_module.cc
@@ -202,6 +202,8 @@
}
void BrowserModule::Navigate(const GURL& url) {
+ web_module_loaded_.Reset();
+
// Always post this as a task in case this is being called from the WebModule.
self_message_loop_->PostTask(
FROM_HERE, base::Bind(&BrowserModule::NavigateInternal, weak_this_, url));
@@ -218,8 +220,6 @@
void BrowserModule::NavigateInternal(const GURL& url) {
DCHECK_EQ(MessageLoop::current(), self_message_loop_);
- web_module_loaded_.Reset();
-
// First try the registered handlers (e.g. for h5vcc://). If one of these
// handles the URL, we don't use the web module.
if (TryURLHandlers(url)) {
@@ -284,9 +284,11 @@
web_module_loaded_.Signal();
}
+#if defined(ENABLE_WEBDRIVER)
bool BrowserModule::WaitForLoad(const base::TimeDelta& timeout) {
return web_module_loaded_.TimedWait(timeout);
}
+#endif
#if defined(ENABLE_SCREENSHOT)
void BrowserModule::RequestScreenshotToFile(const FilePath& path,
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h
index 1535261..669738a 100644
--- a/src/cobalt/browser/browser_module.h
+++ b/src/cobalt/browser/browser_module.h
@@ -127,10 +127,12 @@
// Called when the WebModule's Window.onload event is fired.
void OnLoad();
+#if defined(ENABLE_WEBDRIVER)
// Wait for the onload event to be fired with the specified timeout. If the
// webmodule is not currently loading the document, this will return
// immediately.
bool WaitForLoad(const base::TimeDelta& timeout);
+#endif
// Glue function to deal with the production of the main render tree,
// and will manage handing it off to the renderer.
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index 7a68bfa..a0e7819 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-13391
\ No newline at end of file
+13418
\ No newline at end of file
diff --git a/src/cobalt/script/mozjs/mozjs_global_environment.cc b/src/cobalt/script/mozjs/mozjs_global_environment.cc
index 992716f..d7456fe 100644
--- a/src/cobalt/script/mozjs/mozjs_global_environment.cc
+++ b/src/cobalt/script/mozjs/mozjs_global_environment.cc
@@ -236,6 +236,58 @@
return success;
}
+bool MozjsGlobalEnvironment::EvaluateScript(
+ const scoped_refptr<SourceCode>& source_code,
+ const scoped_refptr<Wrappable>& owning_object,
+ base::optional<OpaqueHandleHolder::Reference>* out_opaque_handle) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ JSAutoRequest auto_request(context_);
+ JSAutoCompartment auto_compartment(context_, global_object_proxy_);
+ JSExceptionState* previous_exception_state = JS_SaveExceptionState(context_);
+ JS::RootedValue result_value(context_);
+ if (!EvaluateScriptInternal(source_code, &result_value)) {
+ return false;
+ }
+ if (out_opaque_handle) {
+ JS::RootedObject js_object(context_);
+ JS_ValueToObject(context_, result_value, js_object.address());
+ MozjsObjectHandleHolder mozjs_object_holder(js_object, context_,
+ wrapper_factory());
+ out_opaque_handle->emplace(owning_object.get(), mozjs_object_holder);
+ }
+ JS_RestoreExceptionState(context_, previous_exception_state);
+ return true;
+}
+
+bool MozjsGlobalEnvironment::EvaluateScriptInternal(
+ const scoped_refptr<SourceCode>& source_code,
+ JS::MutableHandleValue out_result) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(global_object_proxy_);
+ MozjsSourceCode* mozjs_source_code =
+ base::polymorphic_downcast<MozjsSourceCode*>(source_code.get());
+
+ const std::string& script = mozjs_source_code->source_utf8();
+ const base::SourceLocation location = mozjs_source_code->location();
+
+ JS::RootedObject global_object(
+ context_, js::GetProxyTargetObject(global_object_proxy_));
+
+ size_t length = script.size();
+ jschar* inflated_buffer =
+ js::InflateUTF8String(context_, script.c_str(), &length);
+ DCHECK(inflated_buffer);
+ bool success = false;
+ if (inflated_buffer) {
+ success = JS_EvaluateUCScript(context_, global_object, inflated_buffer,
+ length, location.file_path.c_str(),
+ location.line_number, out_result.address());
+ js_free(inflated_buffer);
+ }
+
+ return success;
+}
+
std::vector<StackFrame> MozjsGlobalEnvironment::GetStackTrace(int max_frames) {
DCHECK(thread_checker_.CalledOnValidThread());
return util::GetStackTrace(context_, max_frames);
@@ -319,7 +371,7 @@
if (global_object_proxy_ && garbage_collection_count_ == 1) {
DCHECK(!opaque_root_state_);
JSAutoRequest auto_request(context_);
- JSAutoCompartment auto_comparment(context_, global_object_proxy_);
+ JSAutoCompartment auto_compartment(context_, global_object_proxy_);
// Get the current state of opaque root relationships. Keep this object
// alive for the duration of the GC phase to ensure that reachability
// between roots and reachable objects is maintained.
diff --git a/src/cobalt/script/mozjs/mozjs_global_environment.h b/src/cobalt/script/mozjs/mozjs_global_environment.h
index 54f75de..d13d7f0 100644
--- a/src/cobalt/script/mozjs/mozjs_global_environment.h
+++ b/src/cobalt/script/mozjs/mozjs_global_environment.h
@@ -56,10 +56,7 @@
bool EvaluateScript(const scoped_refptr<SourceCode>& script_utf8,
const scoped_refptr<Wrappable>& owning_object,
base::optional<OpaqueHandleHolder::Reference>*
- out_opaque_handle) OVERRIDE {
- NOTIMPLEMENTED();
- return false;
- }
+ out_opaque_handle) OVERRIDE;
std::vector<StackFrame> GetStackTrace(int max_frames = 0) OVERRIDE;
@@ -133,7 +130,10 @@
// with an error that eval() is disabled.
static JSBool CheckEval(JSContext* context);
- protected:
+ private:
+ bool EvaluateScriptInternal(const scoped_refptr<SourceCode>& source_code,
+ JS::MutableHandleValue out_result);
+
static void ReportErrorHandler(JSContext* context, const char* message,
JSErrorReport* report);