Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(653)

Unified Diff: chrome/renderer/extensions/chrome_v8_context.cc

Issue 8761020: Only create chromeHidden object when needed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move GetChromeHidden to ChromeV8Context Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/extensions/chrome_v8_context.h ('k') | chrome/renderer/extensions/chrome_v8_extension.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « chrome/renderer/extensions/chrome_v8_context.h ('k') | chrome/renderer/extensions/chrome_v8_extension.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698