summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authormek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-23 01:17:26 +0000
committermek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-23 01:17:26 +0000
commit8865feaad093faa5703ce0e1f0b5ff36fd65f0ad (patch)
tree7e57fed0d722fdcd7ef2f6a7491282c5cfdf5f3e /chrome/renderer
parent95ab88d95e0883fd8e42d1ec7cd234afa68e7114 (diff)
downloadchromium_src-8865feaad093faa5703ce0e1f0b5ff36fd65f0ad.zip
chromium_src-8865feaad093faa5703ce0e1f0b5ff36fd65f0ad.tar.gz
chromium_src-8865feaad093faa5703ce0e1f0b5ff36fd65f0ad.tar.bz2
Pass user gesture state along with chrome.runtime.sendMessage.
BUG=308631 Review URL: https://codereview.chromium.org/29493002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230270 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/extensions/dispatcher.cc49
-rw-r--r--chrome/renderer/extensions/dispatcher.h3
-rw-r--r--chrome/renderer/extensions/extension_helper.cc3
-rw-r--r--chrome/renderer/extensions/extension_helper.h3
-rw-r--r--chrome/renderer/extensions/messaging_bindings.cc17
-rw-r--r--chrome/renderer/extensions/messaging_bindings.h3
-rw-r--r--chrome/renderer/resources/extensions/test_custom_bindings.js15
7 files changed, 85 insertions, 8 deletions
diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc
index ac0f8f5..3d011c6 100644
--- a/chrome/renderer/extensions/dispatcher.cc
+++ b/chrome/renderer/extensions/dispatcher.cc
@@ -18,6 +18,7 @@
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/crash_keys.h"
#include "chrome/common/extensions/api/extension_api.h"
+#include "chrome/common/extensions/api/messaging/message.h"
#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_messages.h"
@@ -92,6 +93,7 @@
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
#include "third_party/WebKit/public/web/WebScopedUserGesture.h"
#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
+#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
#include "third_party/WebKit/public/web/WebView.h"
#include "ui/base/layout.h"
#include "ui/base/resource/resource_bundle.h"
@@ -160,6 +162,49 @@ class TestFeaturesNativeHandler : public ObjectBackedNativeHandler {
}
};
+class UserGesturesNativeHandler : public ObjectBackedNativeHandler {
+ public:
+ explicit UserGesturesNativeHandler(ChromeV8Context* context)
+ : ObjectBackedNativeHandler(context) {
+ RouteFunction("IsProcessingUserGesture",
+ base::Bind(&UserGesturesNativeHandler::IsProcessingUserGesture,
+ base::Unretained(this)));
+ RouteFunction("RunWithUserGesture",
+ base::Bind(&UserGesturesNativeHandler::RunWithUserGesture,
+ base::Unretained(this)));
+ RouteFunction("RunWithoutUserGesture",
+ base::Bind(&UserGesturesNativeHandler::RunWithoutUserGesture,
+ base::Unretained(this)));
+ }
+
+ private:
+ void IsProcessingUserGesture(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ args.GetReturnValue().Set(v8::Boolean::New(
+ WebKit::WebUserGestureIndicator::isProcessingUserGesture()));
+ }
+
+ void RunWithUserGesture(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ WebKit::WebScopedUserGesture user_gesture;
+ CHECK_EQ(args.Length(), 1);
+ CHECK(args[0]->IsFunction());
+ v8::Handle<v8::Value> no_args;
+ context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]),
+ 0, &no_args);
+ }
+
+ void RunWithoutUserGesture(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ WebKit::WebUserGestureIndicator::consumeUserGesture();
+ CHECK_EQ(args.Length(), 1);
+ CHECK(args[0]->IsFunction());
+ v8::Handle<v8::Value> no_args;
+ context()->CallFunction(v8::Handle<v8::Function>::Cast(args[0]),
+ 0, &no_args);
+ }
+};
+
class V8ContextNativeHandler : public ObjectBackedNativeHandler {
public:
V8ContextNativeHandler(ChromeV8Context* context, Dispatcher* dispatcher)
@@ -539,7 +584,7 @@ void Dispatcher::OnDispatchOnConnect(
}
void Dispatcher::OnDeliverMessage(int target_port_id,
- const std::string& message) {
+ const Message& message) {
MessagingBindings::DeliverMessage(
v8_context_set_.GetAll(),
target_port_id,
@@ -1076,6 +1121,8 @@ void Dispatcher::DidCreateScriptContext(
scoped_ptr<NativeHandler>(new V8ContextNativeHandler(context, this)));
module_system->RegisterNativeHandler("test_features",
scoped_ptr<NativeHandler>(new TestFeaturesNativeHandler(context)));
+ module_system->RegisterNativeHandler("user_gestures",
+ scoped_ptr<NativeHandler>(new UserGesturesNativeHandler(context)));
int manifest_version = extension ? extension->manifest_version() : 1;
bool send_request_disabled =
diff --git a/chrome/renderer/extensions/dispatcher.h b/chrome/renderer/extensions/dispatcher.h
index 7238c4d..e9ba78ca 100644
--- a/chrome/renderer/extensions/dispatcher.h
+++ b/chrome/renderer/extensions/dispatcher.h
@@ -51,6 +51,7 @@ class Extension;
class FilteredEventRouter;
class RequestSender;
class UserScriptSlave;
+struct Message;
// Dispatches extension control messages sent to the renderer and stores
// renderer extension related state.
@@ -163,7 +164,7 @@ class Dispatcher : public content::RenderProcessObserver {
const base::DictionaryValue& source_tab,
const ExtensionMsg_ExternalConnectionInfo& info,
const std::string& tls_channel_id);
- void OnDeliverMessage(int target_port_id, const std::string& message);
+ void OnDeliverMessage(int target_port_id, const Message& message);
void OnDispatchOnDisconnect(int port_id, const std::string& error_message);
void OnSetFunctionNames(const std::vector<std::string>& names);
void OnSetSystemFont(const std::string& font_family,
diff --git a/chrome/renderer/extensions/extension_helper.cc b/chrome/renderer/extensions/extension_helper.cc
index 4eaf7a8..f717a78 100644
--- a/chrome/renderer/extensions/extension_helper.cc
+++ b/chrome/renderer/extensions/extension_helper.cc
@@ -12,6 +12,7 @@
#include "base/message_loop/message_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/api/messaging/message.h"
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
@@ -281,7 +282,7 @@ void ExtensionHelper::OnExtensionDispatchOnConnect(
}
void ExtensionHelper::OnExtensionDeliverMessage(int target_id,
- const std::string& message) {
+ const Message& message) {
MessagingBindings::DeliverMessage(dispatcher_->v8_context_set().GetAll(),
target_id,
message,
diff --git a/chrome/renderer/extensions/extension_helper.h b/chrome/renderer/extensions/extension_helper.h
index 68ac896e..a5f48ab 100644
--- a/chrome/renderer/extensions/extension_helper.h
+++ b/chrome/renderer/extensions/extension_helper.h
@@ -29,6 +29,7 @@ class ListValue;
namespace extensions {
class Dispatcher;
+struct Message;
// RenderView-level plumbing for extension features.
class ExtensionHelper
@@ -87,7 +88,7 @@ class ExtensionHelper
const ExtensionMsg_ExternalConnectionInfo& info,
const std::string& tls_channel_id);
void OnExtensionDeliverMessage(int target_port_id,
- const std::string& message);
+ const Message& message);
void OnExtensionDispatchOnDisconnect(int port_id,
const std::string& error_message);
void OnExecuteCode(const ExtensionMsg_ExecuteCode_Params& params);
diff --git a/chrome/renderer/extensions/messaging_bindings.cc b/chrome/renderer/extensions/messaging_bindings.cc
index 94275e7..c06422f 100644
--- a/chrome/renderer/extensions/messaging_bindings.cc
+++ b/chrome/renderer/extensions/messaging_bindings.cc
@@ -13,6 +13,7 @@
#include "base/lazy_instance.h"
#include "base/message_loop/message_loop.h"
#include "base/values.h"
+#include "chrome/common/extensions/api/messaging/message.h"
#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/extensions/manifest_handlers/externally_connectable.h"
#include "chrome/common/extensions/message_bundle.h"
@@ -28,6 +29,8 @@
#include "content/public/renderer/v8_value_converter.h"
#include "grit/renderer_resources.h"
#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h"
+#include "third_party/WebKit/public/web/WebScopedUserGesture.h"
+#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
#include "v8/include/v8.h"
// Message passing API example (in a content script):
@@ -112,7 +115,10 @@ class ExtensionImpl : public extensions::ChromeV8Extension {
}
renderview->Send(new ExtensionHostMsg_PostMessage(
- renderview->GetRoutingID(), port_id, *v8::String::AsciiValue(args[1])));
+ renderview->GetRoutingID(), port_id,
+ extensions::Message(
+ *v8::String::AsciiValue(args[1]),
+ WebKit::WebUserGestureIndicator::isProcessingUserGesture())));
}
// Forcefully disconnects a port.
@@ -314,8 +320,12 @@ void MessagingBindings::DispatchOnConnect(
void MessagingBindings::DeliverMessage(
const ChromeV8ContextSet::ContextSet& contexts,
int target_port_id,
- const std::string& message,
+ const Message& message,
content::RenderView* restrict_to_render_view) {
+ scoped_ptr<WebKit::WebScopedUserGesture> web_user_gesture;
+ if (message.user_gesture)
+ web_user_gesture.reset(new WebKit::WebScopedUserGesture);
+
v8::HandleScope handle_scope(v8::Isolate::GetCurrent());
// TODO(kalman): pass in the full ChromeV8ContextSet; call ForEach.
@@ -343,7 +353,8 @@ void MessagingBindings::DeliverMessage(
continue;
std::vector<v8::Handle<v8::Value> > arguments;
- arguments.push_back(v8::String::New(message.c_str(), message.size()));
+ arguments.push_back(v8::String::New(message.data.c_str(),
+ message.data.size()));
arguments.push_back(port_id_handle);
(*it)->module_system()->CallModuleMethod("messaging",
"dispatchOnMessage",
diff --git a/chrome/renderer/extensions/messaging_bindings.h b/chrome/renderer/extensions/messaging_bindings.h
index 12e2096..c9ebd83 100644
--- a/chrome/renderer/extensions/messaging_bindings.h
+++ b/chrome/renderer/extensions/messaging_bindings.h
@@ -24,6 +24,7 @@ class Extension;
namespace extensions {
class ChromeV8Extension;
class Dispatcher;
+struct Message;
// Manually implements JavaScript bindings for extension messaging.
//
@@ -56,7 +57,7 @@ class MessagingBindings {
static void DeliverMessage(
const ChromeV8ContextSet::ContextSet& context_set,
int target_port_id,
- const std::string& message,
+ const Message& message,
content::RenderView* restrict_to_render_view);
// Dispatches the onDisconnect event in response to the channel being closed.
diff --git a/chrome/renderer/resources/extensions/test_custom_bindings.js b/chrome/renderer/resources/extensions/test_custom_bindings.js
index 7df6f5d..fe60eb2 100644
--- a/chrome/renderer/resources/extensions/test_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/test_custom_bindings.js
@@ -12,6 +12,7 @@ var GetExtensionAPIDefinitionsForTest =
requireNative('apiDefinitions').GetExtensionAPIDefinitionsForTest;
var GetAvailability = requireNative('v8_context').GetAvailability;
var GetAPIFeatures = requireNative('test_features').GetAPIFeatures;
+var userGestures = requireNative('user_gestures');
binding.registerCustomHook(function(api) {
var chromeTest = api.compiledApi;
@@ -326,6 +327,20 @@ binding.registerCustomHook(function(api) {
apiFunctions.setHandleRequest('getApiFeatures', function() {
return GetAPIFeatures();
});
+
+ apiFunctions.setHandleRequest('isProcessingUserGesture', function() {
+ return userGestures.IsProcessingUserGesture();
+ });
+
+ apiFunctions.setHandleRequest('runWithUserGesture', function(callback) {
+ chromeTest.assertEq(typeof(callback), 'function');
+ return userGestures.RunWithUserGesture(callback);
+ });
+
+ apiFunctions.setHandleRequest('runWithoutUserGesture', function(callback) {
+ chromeTest.assertEq(typeof(callback), 'function');
+ return userGestures.RunWithoutUserGesture(callback);
+ });
});
exports.binding = binding.generate();