Refactor extension bindings to share code, avoid exposing hidden variables
globally, and avoid using the DOM load/unload events.
- moved callback handling into event_bindings.js (ports will use it).
- added chromeHidden, a V8 hidden value, to keep all internal variables that
need to be accessible to native code.
- changed context registration to occur always at extension load, instead of
DOM load.
- added an internal unload event that doesn't disable SuddenTermination.
This is a rework of my earlier CL http://codereview.chromium.org/125280 which was reverted because of a perf regression. I believe the perf problem was caused by the call into javascript I did on page load to handle context registration - this CL avoids that.
Review URL: http://codereview.chromium.org/147033
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19634 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/renderer/extensions/renderer_extension_bindings.cc b/chrome/renderer/extensions/renderer_extension_bindings.cc
index 0931c8c0..f719797 100644
--- a/chrome/renderer/extensions/renderer_extension_bindings.cc
+++ b/chrome/renderer/extensions/renderer_extension_bindings.cc
@@ -14,6 +14,9 @@
#include "chrome/renderer/render_view.h"
#include "grit/renderer_resources.h"
+using bindings_utils::GetStringResource;
+using bindings_utils::ExtensionBase;
+
// Message passing API example (in a content script):
// var extension =
// new chrome.Extension('00123456789abcdef0123456789abcdef0123456');
@@ -28,10 +31,10 @@
const char* kExtensionDeps[] = { EventBindings::kName };
-class ExtensionImpl : public v8::Extension {
+class ExtensionImpl : public ExtensionBase {
public:
ExtensionImpl()
- : v8::Extension(RendererExtensionBindings::kName,
+ : ExtensionBase(RendererExtensionBindings::kName,
GetStringResource<IDR_RENDERER_EXTENSION_BINDINGS_JS>(),
arraysize(kExtensionDeps), kExtensionDeps) {
}
@@ -44,7 +47,7 @@
} else if (name->Equals(v8::String::New("PostMessage"))) {
return v8::FunctionTemplate::New(PostMessage);
}
- return v8::Handle<v8::FunctionTemplate>();
+ return ExtensionBase::GetNativeFunction(name);
}
// Creates a new messaging channel to the given extension.
@@ -52,7 +55,7 @@
const v8::Arguments& args) {
// Get the current RenderView so that we can send a routed IPC message from
// the correct source.
- RenderView* renderview = GetRenderViewForCurrentContext();
+ RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext();
if (!renderview)
return v8::Undefined();
@@ -68,7 +71,7 @@
// Sends a message along the given channel.
static v8::Handle<v8::Value> PostMessage(const v8::Arguments& args) {
- RenderView* renderview = GetRenderViewForCurrentContext();
+ RenderView* renderview = bindings_utils::GetRenderViewForCurrentContext();
if (!renderview)
return v8::Undefined();