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();