| Index: chrome/renderer/extensions/chrome_v8_extension.cc
|
| ===================================================================
|
| --- chrome/renderer/extensions/chrome_v8_extension.cc (revision 125813)
|
| +++ chrome/renderer/extensions/chrome_v8_extension.cc (working copy)
|
| @@ -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::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,11 +53,30 @@
|
| 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);
|
| +}
|
| +
|
| ChromeV8Extension::~ChromeV8Extension() {
|
| g_instances.Get().erase(this);
|
| }
|
| @@ -62,6 +86,19 @@
|
| 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 @@
|
|
|
| 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();
|
| +}
|
|
|