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

Unified Diff: chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.cc

Issue 11693009: Browser Plugin: Implement ExecuteScript (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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/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));
+}
+
« no previous file with comments | « chrome/browser/browser_plugin/chrome_browser_plugin_guest_observer.h ('k') | chrome/browser/chrome_content_browser_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698