Index: chrome/renderer/extensions/chrome_v8_context.cc |
diff --git a/chrome/renderer/extensions/chrome_v8_context.cc b/chrome/renderer/extensions/chrome_v8_context.cc |
index 47171c8cecb9e4bb88f996f4023928a5d876c67f..42b241abb9c338600e1402f4af4d90d05baa0476 100644 |
--- a/chrome/renderer/extensions/chrome_v8_context.cc |
+++ b/chrome/renderer/extensions/chrome_v8_context.cc |
@@ -4,7 +4,6 @@ |
#include "chrome/renderer/extensions/chrome_v8_context.h" |
-#include "base/debug/trace_event.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/strings/string_split.h" |
@@ -19,6 +18,7 @@ |
#include "content/public/renderer/render_view.h" |
#include "content/public/renderer/v8_value_converter.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebScopedMicrotaskSuppression.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
#include "v8/include/v8.h" |
@@ -27,11 +27,7 @@ using content::V8ValueConverter; |
namespace extensions { |
namespace { |
- |
const char kChromeHidden[] = "chromeHidden"; |
-const char kValidateCallbacks[] = "validateCallbacks"; |
-const char kValidateAPI[] = "validateAPI"; |
- |
} // namespace |
ChromeV8Context::ChromeV8Context(v8::Handle<v8::Context> v8_context, |
@@ -55,7 +51,7 @@ ChromeV8Context::~ChromeV8Context() { |
} |
void ChromeV8Context::Invalidate() { |
- if (v8_context_.get().IsEmpty()) |
+ if (!is_valid()) |
return; |
if (module_system_) |
module_system_->Invalidate(); |
@@ -77,16 +73,6 @@ v8::Handle<v8::Value> ChromeV8Context::GetOrCreateChromeHidden( |
if (hidden.IsEmpty() || hidden->IsUndefined()) { |
hidden = v8::Object::New(); |
global->SetHiddenValue(v8::String::New(kChromeHidden), hidden); |
- |
- if (DCHECK_IS_ON()) { |
- // Tell bindings.js to validate callbacks and events against their schema |
- // definitions. |
- v8::Local<v8::Object>::Cast(hidden)->Set( |
- v8::String::New(kValidateCallbacks), v8::True()); |
- // Tell bindings.js to validate API for ambiguity. |
- v8::Local<v8::Object>::Cast(hidden)->Set( |
- v8::String::New(kValidateAPI), v8::True()); |
- } |
} |
DCHECK(hidden->IsObject()); |
@@ -105,52 +91,23 @@ content::RenderView* ChromeV8Context::GetRenderView() const { |
return NULL; |
} |
-bool ChromeV8Context::CallChromeHiddenMethod( |
- const std::string& function_name, |
+v8::Local<v8::Value> ChromeV8Context::CallFunction( |
+ v8::Handle<v8::Function> function, |
int argc, |
- v8::Handle<v8::Value>* argv, |
- v8::Handle<v8::Value>* result) const { |
- // ChromeV8ContextSet calls Invalidate() and then schedules a task to delete |
- // this object. This check prevents a race from attempting to execute script |
- // on a NULL web_frame_. |
- if (!web_frame_) |
- return false; |
- |
- v8::Context::Scope context_scope(v8_context_.get()); |
- |
- // Look up the function name, which may be a sub-property like |
- // "Port.dispatchOnMessage" in the hidden global variable. |
- v8::Local<v8::Value> value = v8::Local<v8::Value>::New(GetChromeHidden()); |
- if (value.IsEmpty()) |
- return false; |
- |
- std::vector<std::string> components; |
- base::SplitStringDontTrim(function_name, '.', &components); |
- for (size_t i = 0; i < components.size(); ++i) { |
- if (!value.IsEmpty() && value->IsObject()) { |
- value = v8::Local<v8::Object>::Cast(value)->Get( |
- v8::String::New(components[i].c_str())); |
- } |
- } |
- |
- if (value.IsEmpty() || !value->IsFunction()) { |
- VLOG(1) << "Could not execute chrome hidden method: " << function_name; |
- return false; |
- } |
- |
- TRACE_EVENT1("v8", "v8.callChromeHiddenMethod", |
- "function_name", function_name); |
+ v8::Handle<v8::Value> argv[]) const { |
+ v8::HandleScope handle_scope; |
+ WebKit::WebScopedMicrotaskSuppression suppression; |
+ if (!is_valid()) |
+ return handle_scope.Close(v8::Undefined()); |
- v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value); |
- v8::Handle<v8::Value> result_temp = |
+ v8::Handle<v8::Object> global = v8_context()->Global(); |
+ if (!web_frame_) |
+ return handle_scope.Close(function->Call(global, argc, argv)); |
+ return handle_scope.Close( |
web_frame_->callFunctionEvenIfScriptDisabled(function, |
- v8::Object::New(), |
+ global, |
argc, |
- argv); |
- if (result) |
- *result = result_temp; |
- |
- return true; |
+ argv)); |
} |
bool ChromeV8Context::IsAnyFeatureAvailableToContext( |
@@ -171,8 +128,7 @@ Feature::Availability ChromeV8Context::GetAvailability( |
} |
void ChromeV8Context::DispatchOnUnloadEvent() { |
- v8::HandleScope handle_scope; |
- CallChromeHiddenMethod("dispatchOnUnload", 0, NULL, NULL); |
+ module_system_->CallModuleMethod("on_unload", "dispatch"); |
} |
std::string ChromeV8Context::GetContextTypeDescription() { |
@@ -207,9 +163,9 @@ void ChromeV8Context::OnResponseReceived(const std::string& name, |
v8::String::New(error.c_str()) |
}; |
- v8::Handle<v8::Value> retval; |
- CHECK(CallChromeHiddenMethod("handleResponse", arraysize(argv), argv, |
- &retval)); |
+ v8::Handle<v8::Value> retval = module_system_->CallModuleMethod( |
+ "sendRequest", "handleResponse", arraysize(argv), argv); |
+ |
// In debug, the js will validate the callback parameters and return a |
// string if a validation error has occured. |
if (DCHECK_IS_ON()) { |
@@ -220,4 +176,8 @@ void ChromeV8Context::OnResponseReceived(const std::string& name, |
} |
} |
+bool ChromeV8Context::is_valid() const { |
+ return !v8_context_.get().IsEmpty(); |
+} |
+ |
} // namespace extensions |