Index: chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.cc |
diff --git a/chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.cc b/chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aa9e884f73155c14e31db5b6a2d8ee736d00ed38 |
--- /dev/null |
+++ b/chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.cc |
@@ -0,0 +1,120 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.h" |
+ |
+#include <stdio.h> |
+ |
+#include "base/values.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/common/chrome_browser_plugin_messages.h" |
+#include "chrome/common/extensions/api/tabs.h" |
+#include "chrome/common/extensions/extension_messages.h" |
+#include "chrome/common/extensions/value_builder.h" |
+#include "content/public/browser/browser_plugin/browser_plugin_guest.h" |
+ |
+using extensions::api::tabs::InjectDetails; |
+ |
+ChromeBrowserPluginGuestObserver::ChromeBrowserPluginGuestObserver( |
+ content::BrowserPluginGuest* guest) |
+ : content::BrowserPluginGuestObserver(guest), |
+ script_executor_(new extensions::ScriptExecutor( |
+ guest->GetWebContents(), &script_observers_)) { |
+ AddRef(); |
+ guest->RequestMessageFromEmbedder( |
+ ChromeBrowserPluginHostMsg_ExecuteScript::ID); |
+ |
+ // Install a component extension to support executeScript in guests. |
+ scoped_ptr<base::DictionaryValue> manifest = extensions::DictionaryBuilder() |
+ .Set("name", "BrowserPlugin") |
+ .Set("version", "1") |
+ .Set("description", "BrowserPlugin Extension API") |
+ .Set("permissions", extensions::ListBuilder() |
+ .Append("tabs") |
+ .Append("http://*/*") |
+ .Append("https://*/*")) |
+ .Build(); |
+ |
+ std::string error; |
+ extension_ = extensions::Extension::Create( |
+ FilePath(), extensions::Extension::COMPONENT, *manifest, |
+ extensions::Extension::NO_FLAGS, &error); |
+ CHECK(extension_); |
+ |
+ std::vector<ExtensionMsg_Loaded_Params> extensions; |
+ extensions.push_back(ExtensionMsg_Loaded_Params(extension_)); |
+ Send(new ExtensionMsg_Loaded(extensions)); |
+} |
+ |
+ChromeBrowserPluginGuestObserver::~ChromeBrowserPluginGuestObserver() { |
+} |
+ |
+void ChromeBrowserPluginGuestObserver::OnDestruct() { |
+ Release(); |
+} |
+ |
+bool ChromeBrowserPluginGuestObserver::OnMessageReceivedFromEmbedder( |
+ const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(ChromeBrowserPluginGuestObserver, message) |
+ IPC_MESSAGE_HANDLER(ChromeBrowserPluginHostMsg_ExecuteScript, |
+ OnExecuteScript) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+void ChromeBrowserPluginGuestObserver::OnExecuteScript( |
+ int instance_id, int request_id, const base::ListValue& list) { |
+ // |details| are not optional. |
+ const DictionaryValue* details_value = NULL; |
+ if (!list.GetDictionary(0, &details_value)) |
+ return; |
+ scoped_ptr<InjectDetails> details(new InjectDetails()); |
+ if (!InjectDetails::Populate(*details_value, details.get())) |
+ return; |
+ extensions::ScriptExecutor::FrameScope frame_scope = |
+ details->all_frames.get() && *details->all_frames ? |
+ extensions::ScriptExecutor::ALL_FRAMES : |
+ extensions::ScriptExecutor::TOP_FRAME; |
+ |
+ extensions::UserScript::RunLocation run_at = |
+ extensions::UserScript::UNDEFINED; |
+ switch (details->run_at) { |
+ case InjectDetails::RUN_AT_NONE: |
+ case InjectDetails::RUN_AT_DOCUMENT_IDLE: |
+ run_at = extensions::UserScript::DOCUMENT_IDLE; |
+ break; |
+ case InjectDetails::RUN_AT_DOCUMENT_START: |
+ run_at = extensions::UserScript::DOCUMENT_START; |
+ break; |
+ case InjectDetails::RUN_AT_DOCUMENT_END: |
+ run_at = extensions::UserScript::DOCUMENT_END; |
+ break; |
+ } |
+ CHECK_NE(extensions::UserScript::UNDEFINED, run_at); |
+ |
+ script_executor_->ExecuteScript( |
+ extension_->id(), |
+ extensions::ScriptExecutor::JAVASCRIPT, |
+ *details->code.get(), |
+ frame_scope, |
+ run_at, |
+ extensions::ScriptExecutor::ISOLATED_WORLD, |
+ base::Bind( |
+ &ChromeBrowserPluginGuestObserver::OnExecuteCodeFinished, |
+ this, request_id)); |
+} |
+ |
+void ChromeBrowserPluginGuestObserver::OnExecuteCodeFinished( |
+ int request_id, |
+ const std::string& error, |
+ int32 on_page_id, |
+ const GURL& on_url, |
+ const ListValue& result) { |
+ SendMessageToEmbedder(new ChromeBrowserPluginHostMsg_ExecuteScript_Response( |
+ browser_plugin_guest()->GetEmbedderWebContents()->GetRoutingID(), |
+ instance_id(), request_id, result)); |
+} |
+ |