Chromium Code Reviews| Index: chrome/browser/extensions/execute_code_in_tab_function.cc |
| =================================================================== |
| --- chrome/browser/extensions/execute_code_in_tab_function.cc (revision 80315) |
| +++ chrome/browser/extensions/execute_code_in_tab_function.cc (working copy) |
| @@ -17,13 +17,16 @@ |
| #include "chrome/common/extensions/extension.h" |
| #include "chrome/common/extensions/extension_constants.h" |
| #include "chrome/common/extensions/extension_error_utils.h" |
| +#include "chrome/common/extensions/extension_messages.h" |
| +#include "content/browser/renderer_host/render_view_host.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "content/common/notification_service.h" |
| namespace keys = extension_tabs_module_constants; |
| ExecuteCodeInTabFunction::ExecuteCodeInTabFunction() |
| - : execute_tab_id_(-1), |
| + : ALLOW_THIS_IN_INITIALIZER_LIST(registrar_(this)), |
| + execute_tab_id_(-1), |
| all_frames_(false) { |
| } |
| @@ -165,24 +168,46 @@ |
| } else if (function_name != TabsExecuteScriptFunction::function_name()) { |
| DCHECK(false); |
| } |
| - if (!contents->tab_contents()->ExecuteCode(request_id(), extension->id(), |
| - is_js_code, code_string, all_frames_)) { |
| - SendResponse(false); |
| + |
| + ExtensionMsg_ExecuteCode_Params params; |
| + params.request_id = request_id(); |
| + params.extension_id = extension->id(); |
| + params.is_javascript = is_js_code; |
| + params.code = code_string; |
| + params.all_frames = all_frames_; |
| + contents->render_view_host()->Send(new ExtensionMsg_ExecuteCode( |
| + contents->render_view_host()->routing_id(), params)); |
| + |
| + registrar_.Observe(contents->tab_contents()); |
| + AddRef(); // balanced in OnExecuteCodeFinished() |
| + return true; |
| +} |
| + |
| +bool ExecuteCodeInTabFunction::OnMessageReceived(const IPC::Message& message) { |
| + if (message.type() != ExtensionHostMsg_ExecuteCodeFinished::ID) |
| return false; |
| + |
| + int message_request_id; |
| + void* iter = NULL; |
| + if (!message.ReadInt(&iter, &message_request_id)) { |
| + NOTREACHED() << "malformed extension message"; |
| + return true; |
| } |
| - registrar_.Add(this, NotificationType::TAB_CODE_EXECUTED, |
| - NotificationService::AllSources()); |
| - AddRef(); // balanced in Observe() |
| + |
| + if (message_request_id != request_id()) |
|
Matt Perry
2011/04/05 19:18:33
why do this manually? can't you do this check in O
jam
2011/04/05 19:25:38
that way I can reply false and let other message E
|
| + return false; |
| + |
| + IPC_BEGIN_MESSAGE_MAP(ExecuteCodeInTabFunction, message) |
| + IPC_MESSAGE_HANDLER(ExtensionHostMsg_ExecuteCodeFinished, |
| + OnExecuteCodeFinished) |
| + IPC_END_MESSAGE_MAP() |
| return true; |
| } |
| -void ExecuteCodeInTabFunction::Observe(NotificationType type, |
| - const NotificationSource& source, |
| - const NotificationDetails& details) { |
| - std::pair<int, bool>* result_details = |
| - Details<std::pair<int, bool> >(details).ptr(); |
| - if (result_details->first == request_id()) { |
| - SendResponse(result_details->second); |
| - Release(); // balanced in Execute() |
| - } |
| +void ExecuteCodeInTabFunction::OnExecuteCodeFinished(int request_id, |
| + bool success) { |
| + SendResponse(success); |
| + |
| + registrar_.Observe(NULL); |
| + Release(); // balanced in Execute() |
| } |