summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormeacer@chromium.org <meacer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-04 01:02:50 +0000
committermeacer@chromium.org <meacer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-04 01:02:50 +0000
commit0df4943035da98d69ba18ce7e6ed40e6576419cf (patch)
treed7d0dfcd1e0f1068872897bb69970b450749a12d
parent6fd3297ea71e0b86afc97242d331c2568c7d5e79 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/extensions/api/execute_code_function.cc1
-rw-r--r--chrome/browser/extensions/api/tabs/tabs_api.cc1
-rw-r--r--chrome/browser/extensions/execute_script_apitest.cc6
-rw-r--r--chrome/browser/extensions/script_executor.cc2
-rw-r--r--chrome/browser/extensions/script_executor.h1
-rw-r--r--chrome/common/extensions/extension_messages.h3
-rw-r--r--chrome/renderer/extensions/user_script_scheduler.cc5
-rw-r--r--chrome/test/data/extensions/api_test/executescript/user_gesture/manifest.json10
-rw-r--r--chrome/test/data/extensions/api_test/executescript/user_gesture/test.html1
-rw-r--r--chrome/test/data/extensions/api_test/executescript/user_gesture/test.js34
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 });
+});