summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/extensions/chrome_v8_extension.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/extensions/chrome_v8_extension.cc')
-rw-r--r--chrome/renderer/extensions/chrome_v8_extension.cc101
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();
+}