Index: chrome/browser/extensions/extension_function.cc |
diff --git a/chrome/browser/extensions/extension_function.cc b/chrome/browser/extensions/extension_function.cc |
index ef9d0480db97ec1c2cf861fa3682c3b1920e4052..fbb6c03ae5eee52030ec865000461ed80727b8b3 100644 |
--- a/chrome/browser/extensions/extension_function.cc |
+++ b/chrome/browser/extensions/extension_function.cc |
@@ -9,6 +9,7 @@ |
#include "chrome/browser/extensions/extension_function_dispatcher.h" |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/renderer_host/chrome_render_message_filter.h" |
#include "chrome/common/extensions/extension_messages.h" |
#include "content/browser/renderer_host/render_process_host.h" |
#include "content/browser/renderer_host/render_view_host.h" |
@@ -42,7 +43,7 @@ void UIThreadExtensionFunction::RenderViewHostTracker::Observe( |
ExtensionFunction::ExtensionFunction() |
: request_id_(-1), |
- profile_id_(0), |
+ profile_id_(Profile::kInvalidProfileId), |
has_callback_(false), |
include_incognito_(false), |
user_gesture_(false), |
@@ -57,6 +58,10 @@ UIThreadExtensionFunction* ExtensionFunction::AsUIThreadExtensionFunction() { |
return NULL; |
} |
+IOThreadExtensionFunction* ExtensionFunction::AsIOThreadExtensionFunction() { |
+ return NULL; |
+} |
+ |
void ExtensionFunction::SetArgs(const ListValue* args) { |
DCHECK(!args_.get()); // Should only be called once. |
args_.reset(args->DeepCopy()); |
@@ -84,8 +89,34 @@ bool ExtensionFunction::HasOptionalArgument(size_t index) { |
return args_->Get(index, &value) && !value->IsType(Value::TYPE_NULL); |
} |
+void ExtensionFunction::SendResponseImpl(base::ProcessHandle process, |
+ IPC::Message::Sender* ipc_sender, |
+ int routing_id, |
+ bool success) { |
+ DCHECK(ipc_sender); |
+ if (bad_message_) { |
+ HandleBadMessage(process); |
+ return; |
+ } |
+ |
+ ipc_sender->Send(new ExtensionMsg_Response( |
+ routing_id, request_id_, success, GetResult(), GetError())); |
+} |
+ |
+void ExtensionFunction::HandleBadMessage(base::ProcessHandle process) { |
+ LOG(ERROR) << "bad extension message " << name_ << " : terminating renderer."; |
+ if (RenderProcessHost::run_renderer_in_process()) { |
+ // In single process mode it is better if we don't suicide but just crash. |
+ CHECK(false); |
+ } else { |
+ NOTREACHED(); |
+ UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_EFD")); |
+ if (process) |
+ base::KillProcess(process, ResultCodes::KILLED_BAD_MESSAGE, false); |
+ } |
+} |
UIThreadExtensionFunction::UIThreadExtensionFunction() |
- : profile_(NULL) { |
+ : render_view_host_(NULL), profile_(NULL) { |
} |
UIThreadExtensionFunction::~UIThreadExtensionFunction() { |
@@ -113,29 +144,35 @@ Browser* UIThreadExtensionFunction::GetCurrentBrowser() { |
void UIThreadExtensionFunction::SendResponse(bool success) { |
if (!render_view_host_ || !dispatcher()) |
return; |
- if (bad_message_) { |
- HandleBadMessage(); |
- return; |
- } |
- render_view_host_->Send(new ExtensionMsg_Response( |
- render_view_host_->routing_id(), request_id_, success, |
- GetResult(), GetError())); |
+ SendResponseImpl(render_view_host_->process()->GetHandle(), |
+ render_view_host_, |
+ render_view_host_->routing_id(), |
+ success); |
} |
-void UIThreadExtensionFunction::HandleBadMessage() { |
- LOG(ERROR) << "bad extension message " << name_ << " : terminating renderer."; |
- if (RenderProcessHost::run_renderer_in_process()) { |
- // In single process mode it is better if we don't suicide but just crash. |
- CHECK(false); |
- } else { |
- NOTREACHED(); |
- UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_EFD")); |
- if (render_view_host_) { |
- base::KillProcess(render_view_host_->process()->GetHandle(), |
- ResultCodes::KILLED_BAD_MESSAGE, false); |
- } |
- } |
+IOThreadExtensionFunction::IOThreadExtensionFunction() |
+ : routing_id_(-1) { |
+} |
+ |
+IOThreadExtensionFunction::~IOThreadExtensionFunction() { |
+} |
+ |
+IOThreadExtensionFunction* |
+IOThreadExtensionFunction::AsIOThreadExtensionFunction() { |
+ return this; |
+} |
+ |
+void IOThreadExtensionFunction::Destruct() const { |
+ BrowserThread::DeleteOnIOThread::Destruct(this); |
+} |
+ |
+void IOThreadExtensionFunction::SendResponse(bool success) { |
+ if (!ipc_sender()) |
+ return; |
+ |
+ SendResponseImpl(ipc_sender()->peer_handle(), |
+ ipc_sender(), routing_id_, success); |
} |
AsyncExtensionFunction::AsyncExtensionFunction() { |
@@ -153,3 +190,13 @@ SyncExtensionFunction::~SyncExtensionFunction() { |
void SyncExtensionFunction::Run() { |
SendResponse(RunImpl()); |
} |
+ |
+SyncIOThreadExtensionFunction::SyncIOThreadExtensionFunction() { |
+} |
+ |
+SyncIOThreadExtensionFunction::~SyncIOThreadExtensionFunction() { |
+} |
+ |
+void SyncIOThreadExtensionFunction::Run() { |
+ SendResponse(RunImpl()); |
+} |