diff options
Diffstat (limited to 'chrome/renderer/extensions/chrome_v8_extension.cc')
-rw-r--r-- | chrome/renderer/extensions/chrome_v8_extension.cc | 101 |
1 files changed, 98 insertions, 3 deletions
diff --git a/chrome/renderer/extensions/chrome_v8_extension.cc b/chrome/renderer/extensions/chrome_v8_extension.cc index 791b1f5..35b5153 100644 --- a/chrome/renderer/extensions/chrome_v8_extension.cc +++ b/chrome/renderer/extensions/chrome_v8_extension.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -33,6 +33,11 @@ static base::LazyInstance<ChromeV8Extension::InstanceSet> g_instances = // static +base::StringPiece ChromeV8Extension::GetStringResource(int resource_id) { + return ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id); +} + +// static content::RenderView* ChromeV8Extension::GetCurrentRenderView() { WebFrame* webframe = WebFrame::frameForCurrentContext(); DCHECK(webframe) << "RetrieveCurrentFrame called when not in a V8 context."; @@ -48,8 +53,27 @@ content::RenderView* ChromeV8Extension::GetCurrentRenderView() { return renderview; } -ChromeV8Extension::ChromeV8Extension(ExtensionDispatcher* extension_dispatcher) - : extension_dispatcher_(extension_dispatcher) { +ChromeV8Extension::ChromeV8Extension(const char* name, int resource_id, + ExtensionDispatcher* extension_dispatcher) + : v8::Extension(name, + GetStringResource(resource_id).data(), + 0, // num dependencies + NULL, // dependencies array + GetStringResource(resource_id).size()), // source length + extension_dispatcher_(extension_dispatcher) { + g_instances.Get().insert(this); +} + +ChromeV8Extension::ChromeV8Extension(const char* name, int resource_id, + int dependency_count, + const char** dependencies, + ExtensionDispatcher* extension_dispatcher) + : v8::Extension(name, + GetStringResource(resource_id).data(), + dependency_count, + dependencies, + GetStringResource(resource_id).size()), + extension_dispatcher_(extension_dispatcher) { g_instances.Get().insert(this); } @@ -62,6 +86,19 @@ const ChromeV8Extension::InstanceSet& ChromeV8Extension::GetAll() { return g_instances.Get(); } +void ChromeV8Extension::ContextWillBeReleased(ChromeV8Context* context) { + handlers_.erase(context); +} + +ChromeV8ExtensionHandler* ChromeV8Extension::GetHandler( + ChromeV8Context* context) const { + HandlerMap::const_iterator iter = handlers_.find(context); + if (iter == handlers_.end()) + return NULL; + else + return iter->second.get(); +} + const Extension* ChromeV8Extension::GetExtensionForCurrentRenderView() const { content::RenderView* renderview = GetCurrentRenderView(); if (!renderview) @@ -115,3 +152,61 @@ bool ChromeV8Extension::CheckCurrentContextAccessToExtensionAPI( return true; } + +v8::Handle<v8::FunctionTemplate> + ChromeV8Extension::GetNativeFunction(v8::Handle<v8::String> name) { + if (name->Equals(v8::String::New("GetChromeHidden"))) { + return v8::FunctionTemplate::New(GetChromeHidden); + } + + if (name->Equals(v8::String::New("Print"))) { + return v8::FunctionTemplate::New(Print); + } + + return v8::FunctionTemplate::New(HandleNativeFunction, + v8::External::New(this)); +} + +// static +v8::Handle<v8::Value> ChromeV8Extension::HandleNativeFunction( + const v8::Arguments& arguments) { + ChromeV8Extension* self = GetFromArguments<ChromeV8Extension>(arguments); + ChromeV8Context* context = + self->extension_dispatcher()->v8_context_set().GetCurrent(); + CHECK(context) << "Unknown V8 context. Maybe a native function is getting " + << "called during parse of a v8 extension, before the context " + << "has been registered."; + + ChromeV8ExtensionHandler* handler = self->GetHandler(context); + if (!handler) { + handler = self->CreateHandler(context); + if (handler) + self->handlers_[context] = linked_ptr<ChromeV8ExtensionHandler>(handler); + } + CHECK(handler) << "No handler for v8 extension: " << self->name(); + + std::string name = *v8::String::AsciiValue(arguments.Callee()->GetName()); + return handler->HandleNativeFunction(name, arguments); +} + +ChromeV8ExtensionHandler* ChromeV8Extension::CreateHandler( + ChromeV8Context* context) { + return NULL; +} + +v8::Handle<v8::Value> ChromeV8Extension::GetChromeHidden( + const v8::Arguments& args) { + return ChromeV8Context::GetOrCreateChromeHidden(v8::Context::GetCurrent()); +} + +v8::Handle<v8::Value> ChromeV8Extension::Print(const v8::Arguments& args) { + if (args.Length() < 1) + return v8::Undefined(); + + std::vector<std::string> components; + for (int i = 0; i < args.Length(); ++i) + components.push_back(*v8::String::Utf8Value(args[i]->ToString())); + + LOG(ERROR) << JoinString(components, ','); + return v8::Undefined(); +} |