| Index: chrome/renderer/render_view.cc
|
| ===================================================================
|
| --- chrome/renderer/render_view.cc (revision 26435)
|
| +++ chrome/renderer/render_view.cc (working copy)
|
| @@ -37,6 +37,7 @@
|
| #include "chrome/renderer/audio_message_filter.h"
|
| #include "chrome/renderer/devtools_agent.h"
|
| #include "chrome/renderer/devtools_client.h"
|
| +#include "chrome/renderer/extension_groups.h"
|
| #include "chrome/renderer/extensions/event_bindings.h"
|
| #include "chrome/renderer/extensions/extension_process_bindings.h"
|
| #include "chrome/renderer/extensions/renderer_extension_bindings.h"
|
| @@ -442,6 +443,8 @@
|
| IPC_MESSAGE_HANDLER(ViewMsg_SetActive, OnSetActive)
|
| IPC_MESSAGE_HANDLER(ViewMsg_SetEditCommandsForNextKeyEvent,
|
| OnSetEditCommandsForNextKeyEvent);
|
| + IPC_MESSAGE_HANDLER(ViewMsg_ExecuteCode,
|
| + OnExecuteCode)
|
|
|
| // Have the super handle all other messages.
|
| IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message))
|
| @@ -2079,6 +2082,14 @@
|
| frame, UserScript::DOCUMENT_START);
|
| }
|
|
|
| + while (!pending_code_execution_queue_.empty()) {
|
| + scoped_refptr<CodeExecutionInfo> info =
|
| + pending_code_execution_queue_.front();
|
| + OnExecuteCode(info->request_id, info->extension_id, info->is_js_code,
|
| + info->code_string);
|
| + pending_code_execution_queue_.pop();
|
| + }
|
| +
|
| // Notify the browser about non-blank documents loading in the top frame.
|
| GURL url = frame->url();
|
| if (url.is_valid() && url.spec() != chrome::kAboutBlankURL) {
|
| @@ -3480,6 +3491,35 @@
|
| edit_commands_ = edit_commands;
|
| }
|
|
|
| +void RenderView::OnExecuteCode(int request_id, const std::string& extension_id,
|
| + bool is_js_code,
|
| + const std::string& code_string) {
|
| + if (is_loading_) {
|
| + scoped_refptr<CodeExecutionInfo> info = new CodeExecutionInfo(
|
| + request_id, extension_id, is_js_code, code_string);
|
| + pending_code_execution_queue_.push(info);
|
| + return;
|
| + }
|
| + WebFrame* main_frame = webview() ? webview()->GetMainFrame() : NULL;
|
| + if (!main_frame) {
|
| + Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, false));
|
| + return;
|
| + }
|
| +
|
| + if (is_js_code) {
|
| + std::vector<WebScriptSource> sources;
|
| + sources.push_back(
|
| + WebScriptSource(WebString::fromUTF8(code_string)));
|
| + UserScriptSlave::InsertInitExtensionCode(&sources, extension_id);
|
| + main_frame->executeScriptInNewWorld(&sources.front(), sources.size(),
|
| + EXTENSION_GROUP_CONTENT_SCRIPTS);
|
| + } else {
|
| + main_frame->insertStyleText(WebString::fromUTF8(code_string), WebString());
|
| + }
|
| +
|
| + Send(new ViewMsg_ExecuteCodeFinished(routing_id_, request_id, true));
|
| +}
|
| +
|
| void RenderView::DidHandleKeyEvent() {
|
| edit_commands_.clear();
|
| }
|
|
|