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 322cd98516fe6ef79a99cf8424b064e4f196edc1..56ba37ff7a29b828a1dd11d708a741f07b1ed53f 100644 |
--- a/chrome/renderer/extensions/chrome_v8_context.cc |
+++ b/chrome/renderer/extensions/chrome_v8_context.cc |
@@ -14,6 +14,17 @@ |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
#include "v8/include/v8.h" |
+namespace { |
+ |
+const char kChromeHidden[] = "chromeHidden"; |
+ |
+#ifndef NDEBUG |
+const char kValidateCallbacks[] = "validateCallbacks"; |
+#endif |
+ |
+} // namespace |
+ |
+ |
ChromeV8Context::ChromeV8Context(v8::Handle<v8::Context> v8_context, |
WebKit::WebFrame* web_frame, |
const std::string& extension_id) |
@@ -31,6 +42,34 @@ ChromeV8Context::~ChromeV8Context() { |
v8_context_.Dispose(); |
} |
+// static |
+v8::Handle<v8::Value> ChromeV8Context::GetOrCreateChromeHidden( |
+ v8::Handle<v8::Context> context) { |
+ v8::Local<v8::Object> global = context->Global(); |
+ v8::Local<v8::Value> hidden = global->GetHiddenValue( |
+ v8::String::New(kChromeHidden)); |
+ |
+ if (hidden.IsEmpty() || hidden->IsUndefined()) { |
+ hidden = v8::Object::New(); |
+ global->SetHiddenValue(v8::String::New(kChromeHidden), hidden); |
+ |
+#ifndef NDEBUG |
+ // Tell schema_generated_bindings.js to validate callbacks and events |
+ // against their schema definitions in api/extension_api.json. |
+ v8::Local<v8::Object>::Cast(hidden) |
+ ->Set(v8::String::New(kValidateCallbacks), v8::True()); |
+#endif |
+ } |
+ |
+ DCHECK(hidden->IsObject()); |
+ return v8::Local<v8::Object>::Cast(hidden); |
+} |
+ |
+v8::Handle<v8::Value> ChromeV8Context::GetChromeHidden() const { |
+ v8::Local<v8::Object> global = v8_context_->Global(); |
+ return global->GetHiddenValue(v8::String::New(kChromeHidden)); |
+} |
+ |
content::RenderView* ChromeV8Context::GetRenderView() const { |
if (web_frame_ && web_frame_->view()) |
return content::RenderView::FromWebView(web_frame_->view()); |
@@ -47,8 +86,10 @@ bool ChromeV8Context::CallChromeHiddenMethod( |
// 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( |
- ChromeV8Extension::GetChromeHidden(v8_context_)); |
+ 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) { |