diff options
author | meacer@chromium.org <meacer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-04 01:02:50 +0000 |
---|---|---|
committer | meacer@chromium.org <meacer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-04 01:02:50 +0000 |
commit | 0df4943035da98d69ba18ce7e6ed40e6576419cf (patch) | |
tree | d7d0dfcd1e0f1068872897bb69970b450749a12d | |
parent | 6fd3297ea71e0b86afc97242d331c2568c7d5e79 (diff) | |
download | chromium_src-0df4943035da98d69ba18ce7e6ed40e6576419cf.zip chromium_src-0df4943035da98d69ba18ce7e6ed40e6576419cf.tar.gz chromium_src-0df4943035da98d69ba18ce7e6ed40e6576419cf.tar.bz2 |
Pass user gestures with chrome.tabs.executeScript.
BUG=340816
TEST=ExecuteScriptApiTest.UserGesture
Review URL: https://codereview.chromium.org/154893002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@254623 0039d316-1c4b-4281-b951-d872f2087c98
10 files changed, 64 insertions, 0 deletions
diff --git a/chrome/browser/extensions/api/execute_code_function.cc b/chrome/browser/extensions/api/execute_code_function.cc index ab5bf37..63cb338 100644 --- a/chrome/browser/extensions/api/execute_code_function.cc +++ b/chrome/browser/extensions/api/execute_code_function.cc @@ -150,6 +150,7 @@ bool ExecuteCodeFunction::Execute(const std::string& code_string) { IsWebView() ? ScriptExecutor::WEB_VIEW_PROCESS : ScriptExecutor::DEFAULT_PROCESS, file_url_, + user_gesture_, has_callback() ? ScriptExecutor::JSON_SERIALIZED_RESULT : ScriptExecutor::NO_RESULT, base::Bind(&ExecuteCodeFunction::OnExecuteCodeFinished, this)); diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc index 94bb271..a809ab2 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chrome/browser/extensions/api/tabs/tabs_api.cc @@ -1376,6 +1376,7 @@ bool TabsUpdateFunction::UpdateURL(const std::string &url_string, ScriptExecutor::MAIN_WORLD, ScriptExecutor::DEFAULT_PROCESS, GURL(), + user_gesture_, ScriptExecutor::NO_RESULT, base::Bind(&TabsUpdateFunction::OnExecuteCodeFinished, this)); diff --git a/chrome/browser/extensions/execute_script_apitest.cc b/chrome/browser/extensions/execute_script_apitest.cc index f28ba8c..598a75c 100644 --- a/chrome/browser/extensions/execute_script_apitest.cc +++ b/chrome/browser/extensions/execute_script_apitest.cc @@ -98,3 +98,9 @@ IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, ExecuteScriptCallback) { ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionTest("executescript/callback")) << message_; } + +IN_PROC_BROWSER_TEST_F(ExecuteScriptApiTest, UserGesture) { + SetupDelayedHostResolver(); + ASSERT_TRUE(StartEmbeddedTestServer()); + ASSERT_TRUE(RunExtensionTest("executescript/user_gesture")) << message_; +} diff --git a/chrome/browser/extensions/script_executor.cc b/chrome/browser/extensions/script_executor.cc index e29ca99..9436250 100644 --- a/chrome/browser/extensions/script_executor.cc +++ b/chrome/browser/extensions/script_executor.cc @@ -117,6 +117,7 @@ void ScriptExecutor::ExecuteScript( ScriptExecutor::WorldType world_type, ScriptExecutor::ProcessType process_type, const GURL& file_url, + bool user_gesture, ScriptExecutor::ResultType result_type, const ExecuteScriptCallback& callback) { ExtensionMsg_ExecuteCode_Params params; @@ -130,6 +131,7 @@ void ScriptExecutor::ExecuteScript( params.is_web_view = (process_type == WEB_VIEW_PROCESS); params.file_url = file_url; params.wants_result = (result_type == JSON_SERIALIZED_RESULT); + params.user_gesture = user_gesture; // Handler handles IPCs and deletes itself on completion. new Handler(script_observers_, web_contents_, params, callback); diff --git a/chrome/browser/extensions/script_executor.h b/chrome/browser/extensions/script_executor.h index 8dcc1ac..03c1f55 100644 --- a/chrome/browser/extensions/script_executor.h +++ b/chrome/browser/extensions/script_executor.h @@ -87,6 +87,7 @@ class ScriptExecutor { WorldType world_type, ProcessType process_type, const GURL& file_url, + bool user_gesture, ResultType result_type, const ExecuteScriptCallback& callback); diff --git a/chrome/common/extensions/extension_messages.h b/chrome/common/extensions/extension_messages.h index c116774..e43b3c8 100644 --- a/chrome/common/extensions/extension_messages.h +++ b/chrome/common/extensions/extension_messages.h @@ -131,6 +131,9 @@ IPC_STRUCT_BEGIN(ExtensionMsg_ExecuteCode_Params) // The URL of the file that was injected, if any. IPC_STRUCT_MEMBER(GURL, file_url) + + // Whether the code to be executed should be associated with a user gesture. + IPC_STRUCT_MEMBER(bool, user_gesture) IPC_STRUCT_END() // Struct containing the data for external connections to extensions. Used to diff --git a/chrome/renderer/extensions/user_script_scheduler.cc b/chrome/renderer/extensions/user_script_scheduler.cc index e8e4941..58a1b4e 100644 --- a/chrome/renderer/extensions/user_script_scheduler.cc +++ b/chrome/renderer/extensions/user_script_scheduler.cc @@ -24,6 +24,7 @@ #include "third_party/WebKit/public/platform/WebVector.h" #include "third_party/WebKit/public/web/WebDocument.h" #include "third_party/WebKit/public/web/WebFrame.h" +#include "third_party/WebKit/public/web/WebScopedUserGesture.h" #include "third_party/WebKit/public/web/WebView.h" #include "v8/include/v8.h" @@ -166,6 +167,10 @@ void UserScriptScheduler::ExecuteCodeImpl( std::string error; + scoped_ptr<blink::WebScopedUserGesture> gesture; + if (params.user_gesture) + gesture.reset(new blink::WebScopedUserGesture); + for (std::vector<WebFrame*>::iterator frame_it = frame_vector.begin(); frame_it != frame_vector.end(); ++frame_it) { WebFrame* child_frame = *frame_it; diff --git a/chrome/test/data/extensions/api_test/executescript/user_gesture/manifest.json b/chrome/test/data/extensions/api_test/executescript/user_gesture/manifest.json new file mode 100644 index 0000000..e30704d --- /dev/null +++ b/chrome/test/data/extensions/api_test/executescript/user_gesture/manifest.json @@ -0,0 +1,10 @@ +{ + "version": "1.0.0.0", + "manifest_version": 2, + "name": "user_gesture test", + "description": "Test user gesture passing within executeScript", + "background": { + "scripts": ["test.js"] + }, + "permissions": ["tabs", "http://b.com/"] +} diff --git a/chrome/test/data/extensions/api_test/executescript/user_gesture/test.html b/chrome/test/data/extensions/api_test/executescript/user_gesture/test.html new file mode 100644 index 0000000..18ecdcb --- /dev/null +++ b/chrome/test/data/extensions/api_test/executescript/user_gesture/test.html @@ -0,0 +1 @@ +<html></html> diff --git a/chrome/test/data/extensions/api_test/executescript/user_gesture/test.js b/chrome/test/data/extensions/api_test/executescript/user_gesture/test.js new file mode 100644 index 0000000..7e89c64 --- /dev/null +++ b/chrome/test/data/extensions/api_test/executescript/user_gesture/test.js @@ -0,0 +1,34 @@ +// Copyright 2014 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. + +var relativePath = + '/extensions/api_test/executescript/run_at/test.html'; +var testUrl = 'http://b.com:PORT' + relativePath; + +chrome.test.getConfig(function(config) { + testUrl = testUrl.replace(/PORT/, config.testServer.port); + chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { + if (changeInfo.status != 'complete') + return; + chrome.tabs.onUpdated.removeListener(arguments.callee); + + chrome.test.runTests([ + function passUserGestureToExecutedScript() { + chrome.runtime.onMessage.addListener( + chrome.test.callbackPass(function(request, sender, sendResponse) { + // The script executed by executeScript should run in a + // user gesture context. + chrome.test.assertTrue(request.user_gesture); + }) + ); + var code = "chrome.runtime.sendMessage({" + + " user_gesture: chrome.test.isProcessingUserGesture()});" + chrome.test.runWithUserGesture(function() { + chrome.tabs.executeScript(tabId, {code: code}); + }); + } + ]); + }); + chrome.tabs.create({ url: testUrl }); +}); |