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

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

Issue 9903010: Extract ExtensionRequestSender from SchemaGeneratedBindings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: respond to comments Created 8 years, 9 months 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
Index: chrome/renderer/extensions/schema_generated_bindings.cc
diff --git a/chrome/renderer/extensions/schema_generated_bindings.cc b/chrome/renderer/extensions/schema_generated_bindings.cc
index e88ac152362667be88ec64159a864412b7868dfb..e58e100c0a660cfa3c0d94d3d29b8ea791109b5c 100644
--- a/chrome/renderer/extensions/schema_generated_bindings.cc
+++ b/chrome/renderer/extensions/schema_generated_bindings.cc
@@ -11,7 +11,6 @@
#include "base/callback.h"
#include "base/command_line.h"
#include "base/json/json_reader.h"
-#include "base/lazy_instance.h"
#include "base/memory/scoped_ptr.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
@@ -28,6 +27,7 @@
#include "chrome/renderer/extensions/chrome_v8_context_set.h"
#include "chrome/renderer/extensions/event_bindings.h"
#include "chrome/renderer/extensions/extension_dispatcher.h"
+#include "chrome/renderer/extensions/extension_request_sender.h"
#include "chrome/renderer/extensions/miscellaneous_bindings.h"
#include "chrome/renderer/extensions/user_script_slave.h"
#include "content/public/renderer/render_thread.h"
@@ -35,9 +35,6 @@
#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/WebDocument.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/resource/resource_bundle.h"
@@ -51,65 +48,13 @@ using extensions::Feature;
using WebKit::WebFrame;
using WebKit::WebSecurityOrigin;
-namespace {
-
-// Contains info relevant to a pending API request.
-struct PendingRequest {
- public :
- PendingRequest(v8::Persistent<v8::Context> context, const std::string& name,
- const std::string& extension_id)
- : context(context), name(name), extension_id(extension_id) {
- }
- v8::Persistent<v8::Context> context;
- std::string name;
- std::string extension_id;
-};
-
-class PendingRequestMap {
- public:
- PendingRequestMap() {
- }
-
- void InsertRequest(int request_id, PendingRequest* pending_request) {
- pending_requests_[request_id].reset(pending_request);
- }
-
- PendingRequest* GetPendingRequest(int request_id) {
- PendingRequests::iterator i = pending_requests_.find(request_id);
- if (i == pending_requests_.end()) {
- return NULL;
- }
- return i->second.get();
- }
-
- void RemoveRequest(int request_id) {
- PendingRequest* request = GetPendingRequest(request_id);
- if (!request)
- return;
- request->context.Dispose();
- request->context.Clear();
- pending_requests_.erase(request_id);
- }
-
- private:
- typedef std::map<int, linked_ptr<PendingRequest> > PendingRequests;
- PendingRequests pending_requests_;
-
- DISALLOW_COPY_AND_ASSIGN(PendingRequestMap);
-};
-
-// TODO(koz): Make this owned by ExtensionDispatcher and pass it into
-// SchemaGeneratedBindings.
-base::LazyInstance<PendingRequestMap> g_pending_requests =
- LAZY_INSTANCE_INITIALIZER;
-
-} // namespace
-
namespace extensions {
SchemaGeneratedBindings::SchemaGeneratedBindings(
- ExtensionDispatcher* extension_dispatcher)
- : ChromeV8Extension(extension_dispatcher) {
+ ExtensionDispatcher* extension_dispatcher,
+ ExtensionRequestSender* request_sender)
+ : ChromeV8Extension(extension_dispatcher),
+ request_sender_(request_sender) {
RouteFunction("GetExtensionAPIDefinition",
base::Bind(&SchemaGeneratedBindings::GetExtensionAPIDefinition,
base::Unretained(this)));
@@ -161,67 +106,16 @@ v8::Handle<v8::Value> SchemaGeneratedBindings::GetNextRequestId(
v8::Handle<v8::Value> SchemaGeneratedBindings::StartRequestCommon(
const v8::Arguments& args, ListValue* value_args) {
-
- const ChromeV8ContextSet& contexts =
- extension_dispatcher()->v8_context_set();
- ChromeV8Context* current_context = contexts.GetCurrent();
- if (!current_context)
- return v8::Undefined();
-
- // Get the current RenderView so that we can send a routed IPC message from
- // the correct source.
- content::RenderView* renderview = current_context->GetRenderView();
- if (!renderview)
- return v8::Undefined();
-
std::string name = *v8::String::AsciiValue(args[0]);
- const std::set<std::string>& function_names =
- extension_dispatcher_->function_names();
- if (function_names.find(name) == function_names.end()) {
- NOTREACHED() << "Unexpected function " << name <<
- ". Did you remember to register it with ExtensionFunctionRegistry?";
- return v8::Undefined();
- }
-
- if (!CheckCurrentContextAccessToExtensionAPI(name))
- return v8::Undefined();
-
- GURL source_url;
- WebSecurityOrigin source_origin;
- WebFrame* webframe = current_context->web_frame();
- if (webframe) {
- source_url = webframe->document().url();
- source_origin = webframe->document().securityOrigin();
- }
-
int request_id = args[2]->Int32Value();
bool has_callback = args[3]->BooleanValue();
bool for_io_thread = args[4]->BooleanValue();
- v8::Persistent<v8::Context> v8_context =
- v8::Persistent<v8::Context>::New(v8::Context::GetCurrent());
- DCHECK(!v8_context.IsEmpty());
- g_pending_requests.Get().InsertRequest(request_id, new PendingRequest(
- v8_context, name, current_context->extension_id()));
-
- 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.source_origin = source_origin.toString();
- params.request_id = request_id;
- params.has_callback = has_callback;
- params.user_gesture =
- webframe ? webframe->isProcessingUserGesture() : false;
- if (for_io_thread) {
- renderview->Send(new ExtensionHostMsg_RequestForIOThread(
- renderview->GetRoutingID(), params));
- } else {
- renderview->Send(new ExtensionHostMsg_Request(
- renderview->GetRoutingID(), params));
- }
-
+ request_sender_->StartRequest(name,
+ request_id,
+ has_callback,
+ for_io_thread,
+ value_args);
return v8::Undefined();
}
@@ -310,53 +204,4 @@ v8::Handle<v8::Value> SchemaGeneratedBindings::SetIconCommon(
return StartRequestCommon(args, &list_value);
}
-// static
-void SchemaGeneratedBindings::HandleResponse(const ChromeV8ContextSet& contexts,
- int request_id,
- bool success,
- const std::string& response,
- const std::string& error,
- std::string* extension_id) {
- PendingRequest* request =
- g_pending_requests.Get().GetPendingRequest(request_id);
- if (!request) {
- // This should not be able to happen since we only remove requests when they
- // are handled.
- LOG(ERROR) << "Could not find specified request id: " << request_id;
- return;
- }
-
- ChromeV8Context* v8_context =
- contexts.GetByV8Context(request->context);
- if (!v8_context)
- return; // The frame went away.
-
- v8::HandleScope handle_scope;
- v8::Handle<v8::Value> argv[5];
- argv[0] = v8::Integer::New(request_id);
- argv[1] = v8::String::New(request->name.c_str());
- argv[2] = v8::Boolean::New(success);
- argv[3] = v8::String::New(response.c_str());
- argv[4] = v8::String::New(error.c_str());
-
- v8::Handle<v8::Value> retval;
- CHECK(v8_context->CallChromeHiddenMethod("handleResponse",
- arraysize(argv),
- argv,
- &retval));
- // In debug, the js will validate the callback parameters and return a
- // string if a validation error has occured.
-#ifndef NDEBUG
- if (!retval.IsEmpty() && !retval->IsUndefined()) {
- std::string error = *v8::String::AsciiValue(retval);
- DCHECK(false) << error;
- }
-#endif
-
- // Save the extension id before erasing the request.
- *extension_id = request->extension_id;
-
- g_pending_requests.Get().RemoveRequest(request_id);
-}
-
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698