summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/extensions/chrome_v8_extension.cc
diff options
context:
space:
mode:
authorcduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-07 06:31:55 +0000
committercduvall@chromium.org <cduvall@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-07 06:31:55 +0000
commit1e73bb01af4255521f957d3f2a603d179001226b (patch)
tree7755029f0d11712a807d01c110d9c603c488ccaf /chrome/renderer/extensions/chrome_v8_extension.cc
parentd8bc3ecdc9f5f95de468d3b24ec59b124694ae05 (diff)
downloadchromium_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.cc59
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