diff options
author | mek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-23 01:17:26 +0000 |
---|---|---|
committer | mek@chromium.org <mek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-23 01:17:26 +0000 |
commit | 8865feaad093faa5703ce0e1f0b5ff36fd65f0ad (patch) | |
tree | 7e57fed0d722fdcd7ef2f6a7491282c5cfdf5f3e /chrome/renderer | |
parent | 95ab88d95e0883fd8e42d1ec7cd234afa68e7114 (diff) | |
download | chromium_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.cc | 49 | ||||
-rw-r--r-- | chrome/renderer/extensions/dispatcher.h | 3 | ||||
-rw-r--r-- | chrome/renderer/extensions/extension_helper.cc | 3 | ||||
-rw-r--r-- | chrome/renderer/extensions/extension_helper.h | 3 | ||||
-rw-r--r-- | chrome/renderer/extensions/messaging_bindings.cc | 17 | ||||
-rw-r--r-- | chrome/renderer/extensions/messaging_bindings.h | 3 | ||||
-rw-r--r-- | chrome/renderer/resources/extensions/test_custom_bindings.js | 15 |
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(); |