Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(117)

Unified Diff: chrome/renderer/extensions/schema_generated_bindings.cc

Issue 8540012: Enable extension APIs for content scripts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/extensions/schema_generated_bindings.h ('k') | chrome/renderer/renderer_resources.grd » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/extensions/schema_generated_bindings.cc
diff --git a/chrome/renderer/extensions/extension_process_bindings.cc b/chrome/renderer/extensions/schema_generated_bindings.cc
similarity index 91%
rename from chrome/renderer/extensions/extension_process_bindings.cc
rename to chrome/renderer/extensions/schema_generated_bindings.cc
index c1aa392ec2ef07f16ce53f9f891f86a7a65ccbbb..e85e4a384b95f34a48e8359466bf12d80473fc56 100644
--- a/chrome/renderer/extensions/extension_process_bindings.cc
+++ b/chrome/renderer/extensions/schema_generated_bindings.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/renderer/extensions/extension_process_bindings.h"
+#include "chrome/renderer/extensions/schema_generated_bindings.h"
#include <map>
#include <set>
@@ -23,6 +23,7 @@
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/extensions/extension_set.h"
#include "chrome/common/extensions/url_pattern.h"
+#include "chrome/common/extensions/api/extension_api.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/chrome_view_types.h"
@@ -35,10 +36,10 @@
#include "chrome/renderer/extensions/event_bindings.h"
#include "chrome/renderer/extensions/extension_dispatcher.h"
#include "chrome/renderer/extensions/extension_helper.h"
-#include "chrome/renderer/extensions/renderer_extension_bindings.h"
+#include "chrome/renderer/extensions/miscellaneous_bindings.h"
#include "chrome/renderer/extensions/user_script_slave.h"
-#include "chrome/renderer/static_v8_external_string_resource.h"
#include "content/public/renderer/render_view.h"
+#include "content/public/renderer/v8_value_converter.h"
#include "grit/common_resources.h"
#include "grit/renderer_resources.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebBlob.h"
@@ -51,6 +52,8 @@
#include "v8/include/v8.h"
#include "webkit/glue/webkit_glue.h"
+using content::V8ValueConverter;
+using extensions::ExtensionAPI;
using WebKit::WebFrame;
using WebKit::WebView;
@@ -59,7 +62,7 @@ namespace {
const char* kExtensionDeps[] = {
"extensions/event.js",
"extensions/json_schema.js",
- "extensions/renderer_extension_bindings.js",
+ "extensions/miscellaneous_bindings.js",
"extensions/apitest.js"
};
@@ -161,18 +164,25 @@ class ExtensionViewAccumulator : public content::RenderViewVisitor {
class ExtensionImpl : public ChromeV8Extension {
public:
explicit ExtensionImpl(ExtensionDispatcher* extension_dispatcher)
- : ChromeV8Extension("extensions/extension_process_bindings.js",
- IDR_EXTENSION_PROCESS_BINDINGS_JS,
+ : ChromeV8Extension("extensions/schema_generated_bindings.js",
+ IDR_SCHEMA_GENERATED_BINDINGS_JS,
arraysize(kExtensionDeps),
kExtensionDeps,
extension_dispatcher) {
}
- ~ExtensionImpl() {}
+
+ ~ExtensionImpl() {
+ // TODO(aa): It seems that v8 never deletes us, so this doesn't get called.
+ // Leaving this in here in case v8's implementation ever changes.
+ if (!extension_api_.IsEmpty())
+ extension_api_.Dispose();
+ }
virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
- v8::Handle<v8::String> name) {
+ v8::Handle<v8::String> name) OVERRIDE {
if (name->Equals(v8::String::New("GetExtensionAPIDefinition"))) {
- return v8::FunctionTemplate::New(GetExtensionAPIDefinition);
+ return v8::FunctionTemplate::New(GetExtensionAPIDefinition,
+ v8::External::New(this));
} else if (name->Equals(v8::String::New("GetExtensionViews"))) {
return v8::FunctionTemplate::New(GetExtensionViews,
v8::External::New(this));
@@ -211,10 +221,24 @@ class ExtensionImpl : public ChromeV8Extension {
private:
static v8::Handle<v8::Value> GetExtensionAPIDefinition(
const v8::Arguments& args) {
- return v8::String::NewExternal(
- new StaticV8ExternalAsciiStringResource(
- ResourceBundle::GetSharedInstance().GetRawDataResource(
- IDR_EXTENSION_API_JSON)));
+ ExtensionImpl* self = GetFromArguments<ExtensionImpl>(args);
+ if (!self->extension_api_.IsEmpty())
+ return self->extension_api_;
+
+ v8::Persistent<v8::Context> context(v8::Context::New());
+ v8::Context::Scope context_scope(context);
+
+ scoped_ptr<V8ValueConverter> v8_value_converter(V8ValueConverter::create());
+ self->extension_api_ = v8::Persistent<v8::Array>::New(
+ v8::Handle<v8::Array>::Cast(
+ v8_value_converter->ToV8Value(
+ ExtensionAPI::GetInstance()->value(), context)));
+ CHECK(!self->extension_api_.IsEmpty());
+
+ // The persistent extension_api_ will keep the context alive.
+ context.Dispose();
+
+ return self->extension_api_;
}
static v8::Handle<v8::Value> GetExtensionViews(const v8::Arguments& args) {
@@ -458,8 +482,7 @@ class ExtensionImpl : public ChromeV8Extension {
return v8::Undefined();
}
- // TODO(aa): add this to ChromeV8Context.
- if (!v8_extension->CheckPermissionForCurrentRenderView(name))
+ if (!v8_extension->CheckCurrentContextAccessToExtensionAPI(name))
return v8::Undefined();
GURL source_url;
@@ -480,6 +503,7 @@ class ExtensionImpl : public ChromeV8Extension {
ExtensionHostMsg_Request_Params params;
params.name = name;
params.arguments.Swap(value_args);
+ params.extension_id = current_context->extension_id();
params.source_url = source_url;
params.request_id = request_id;
params.has_callback = has_callback;
@@ -589,11 +613,18 @@ class ExtensionImpl : public ChromeV8Extension {
return v8::Undefined();
return v8::Integer::New(renderview->GetRoutingId());
}
+
+ // Cached JS Array representation of extension_api.json. We store this so that
+ // we don't have to parse it over and over again for every context that uses
+ // it.
+ v8::Persistent<v8::Array> extension_api_;
};
} // namespace
-v8::Extension* ExtensionProcessBindings::Get(
+namespace extensions {
+
+v8::Extension* SchemaGeneratedBindings::Get(
ExtensionDispatcher* extension_dispatcher) {
static v8::Extension* extension = new ExtensionImpl(extension_dispatcher);
CHECK_EQ(extension_dispatcher,
@@ -602,13 +633,12 @@ v8::Extension* ExtensionProcessBindings::Get(
}
// static
-void ExtensionProcessBindings::HandleResponse(
- const ChromeV8ContextSet& contexts,
- int request_id,
- bool success,
- const std::string& response,
- const std::string& error,
- std::string* extension_id) {
+void SchemaGeneratedBindings::HandleResponse(const ChromeV8ContextSet& contexts,
+ int request_id,
+ bool success,
+ const std::string& response,
+ const std::string& error,
+ std::string* extension_id) {
PendingRequestMap::iterator request =
g_pending_requests.Get().find(request_id);
if (request == g_pending_requests.Get().end()) {
@@ -654,7 +684,7 @@ void ExtensionProcessBindings::HandleResponse(
}
// static
-bool ExtensionProcessBindings::HasPendingRequests(
+bool SchemaGeneratedBindings::HasPendingRequests(
const std::string& extension_id) {
for (PendingRequestMap::const_iterator it = g_pending_requests.Get().begin();
it != g_pending_requests.Get().end(); ++it) {
@@ -663,3 +693,5 @@ bool ExtensionProcessBindings::HasPendingRequests(
}
return false;
}
+
+} // namespace
« no previous file with comments | « chrome/renderer/extensions/schema_generated_bindings.h ('k') | chrome/renderer/renderer_resources.grd » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698