diff options
author | cduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-07 06:31:55 +0000 |
---|---|---|
committer | cduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-07 06:31:55 +0000 |
commit | 1e73bb01af4255521f957d3f2a603d179001226b (patch) | |
tree | 7755029f0d11712a807d01c110d9c603c488ccaf /chrome/renderer/extensions/chrome_v8_extension.cc | |
parent | d8bc3ecdc9f5f95de468d3b24ec59b124694ae05 (diff) | |
download | chromium_src-1e73bb01af4255521f957d3f2a603d179001226b.zip chromium_src-1e73bb01af4255521f957d3f2a603d179001226b.tar.gz chromium_src-1e73bb01af4255521f957d3f2a603d179001226b.tar.bz2 |
Set up V8 bindings for extension/app APIs when they're first used, not on
context creation. This should gives us a significant reduction in extension/app
startup time and slightly better memory usage.
It also gives us better error messages, the chance to complete the
implementation of API features, and eventually the ability to expose select
extension APIs (e.g. extension.sendMessage) to web pages.
Resubmitting: changes made to resubmit this patch reviewed in: https://codereview.chromium.org/12378077/
BUG=163678,120070,55316,177163
TBR=ben@chromium.org
Review URL: https://chromiumcodereview.appspot.com/11571014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@186643 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/extensions/chrome_v8_extension.cc')
-rw-r--r-- | chrome/renderer/extensions/chrome_v8_extension.cc | 59 |
1 files changed, 13 insertions, 46 deletions
diff --git a/chrome/renderer/extensions/chrome_v8_extension.cc b/chrome/renderer/extensions/chrome_v8_extension.cc index a5cbf03..2a3e7d6d 100644 --- a/chrome/renderer/extensions/chrome_v8_extension.cc +++ b/chrome/renderer/extensions/chrome_v8_extension.cc @@ -25,61 +25,28 @@ using WebKit::WebView; namespace extensions { -namespace { - -static base::LazyInstance<ChromeV8Extension::InstanceSet> g_instances = - LAZY_INSTANCE_INITIALIZER; - -} // namespace - -// static -content::RenderView* ChromeV8Extension::GetCurrentRenderView() { - WebFrame* webframe = WebFrame::frameForCurrentContext(); - DCHECK(webframe) << "RetrieveCurrentFrame called when not in a V8 context."; - if (!webframe) - return NULL; - - WebView* webview = webframe->view(); - if (!webview) - return NULL; // can happen during closing - - content::RenderView* renderview = content::RenderView::FromWebView(webview); - DCHECK(renderview) << "Encountered a WebView without a WebViewDelegate"; - return renderview; -} - -ChromeV8Extension::ChromeV8Extension(Dispatcher* dispatcher) - // TODO(svenpanne) It would be nice to remove the GetCurrent() call and use - // an additional constructor parameter instead, but this would involve too - // many changes for now. - : NativeHandler(v8::Isolate::GetCurrent()), +ChromeV8Extension::ChromeV8Extension(Dispatcher* dispatcher, + v8::Handle<v8::Context> context) + : ObjectBackedNativeHandler(context), dispatcher_(dispatcher) { - g_instances.Get().insert(this); + CHECK(dispatcher); } ChromeV8Extension::~ChromeV8Extension() { - g_instances.Get().erase(this); } -// static -const ChromeV8Extension::InstanceSet& ChromeV8Extension::GetAll() { - return g_instances.Get(); +ChromeV8Context* ChromeV8Extension::GetContext() { + return dispatcher_->v8_context_set().GetByV8Context(v8_context()); } -const Extension* ChromeV8Extension::GetExtensionForCurrentRenderView() const { - content::RenderView* renderview = GetCurrentRenderView(); - if (!renderview) - return NULL; // this can happen as a tab is closing. - - WebDocument document = renderview->GetWebView()->mainFrame()->document(); - GURL url = document.url(); - const ExtensionSet* extensions = dispatcher_->extensions(); - if (!extensions->ExtensionBindingsAllowed( - ExtensionURLInfo(document.securityOrigin(), url))) - return NULL; +content::RenderView* ChromeV8Extension::GetRenderView() { + ChromeV8Context* context = GetContext(); + return context ? context->GetRenderView() : NULL; +} - return extensions->GetExtensionOrAppByURL( - ExtensionURLInfo(document.securityOrigin(), url)); +const Extension* ChromeV8Extension::GetExtensionForRenderView() { + ChromeV8Context* context = GetContext(); + return context ? context->extension() : NULL; } } // namespace extensions |