diff options
-rw-r--r-- | chrome/browser/external_tab/external_tab_container_win.cc | 23 | ||||
-rw-r--r-- | chrome/browser/external_tab/external_tab_container_win.h | 13 | ||||
-rw-r--r-- | chrome/browser/intents/register_intent_handler_helper.cc | 30 | ||||
-rw-r--r-- | chrome/browser/ui/browser.cc | 21 | ||||
-rw-r--r-- | chrome/browser/ui/browser.h | 32 | ||||
-rw-r--r-- | content/browser/web_contents/web_contents_impl.cc | 17 | ||||
-rw-r--r-- | content/browser/web_contents/web_contents_impl.h | 11 | ||||
-rw-r--r-- | content/common/intents_messages.h | 19 | ||||
-rw-r--r-- | content/common/view_messages.h | 5 | ||||
-rw-r--r-- | content/public/browser/web_contents_delegate.h | 23 | ||||
-rw-r--r-- | content/renderer/notification_provider.cc | 4 | ||||
-rw-r--r-- | content/renderer/render_view_browsertest.cc | 17 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 21 | ||||
-rw-r--r-- | webkit/glue/web_intent_service_data.cc | 13 | ||||
-rw-r--r-- | webkit/glue/web_intent_service_data.h | 10 |
15 files changed, 136 insertions, 123 deletions
diff --git a/chrome/browser/external_tab/external_tab_container_win.cc b/chrome/browser/external_tab/external_tab_container_win.cc index 4cb512d..9c06ad8 100644 --- a/chrome/browser/external_tab/external_tab_container_win.cc +++ b/chrome/browser/external_tab/external_tab_container_win.cc @@ -736,18 +736,17 @@ void ExternalTabContainer::JSOutOfMemory(WebContents* tab) { void ExternalTabContainer::RegisterProtocolHandler(WebContents* tab, const std::string& protocol, const GURL& url, - const string16& title) { - Browser::RegisterProtocolHandlerHelper(tab, protocol, url, title); -} - -void ExternalTabContainer::RegisterIntentHandler(WebContents* tab, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) { - Browser::RegisterIntentHandlerHelper( - tab, action, type, href, title, disposition); + const string16& title, + bool user_gesture) { + Browser::RegisterProtocolHandlerHelper(tab, protocol, url, title, + user_gesture); +} + +void ExternalTabContainer::RegisterIntentHandler( + WebContents* tab, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) { + Browser::RegisterIntentHandlerHelper(tab, data, user_gesture); } void ExternalTabContainer::WebIntentDispatch( diff --git a/chrome/browser/external_tab/external_tab_container_win.h b/chrome/browser/external_tab/external_tab_container_win.h index 2cb8f82..52413b3 100644 --- a/chrome/browser/external_tab/external_tab_container_win.h +++ b/chrome/browser/external_tab/external_tab_container_win.h @@ -176,13 +176,12 @@ class ExternalTabContainer : public content::WebContentsDelegate, virtual void RegisterProtocolHandler(content::WebContents* tab, const std::string& protocol, const GURL& url, - const string16& title) OVERRIDE; - virtual void RegisterIntentHandler(content::WebContents* tab, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) OVERRIDE; + const string16& title, + bool user_gesture) OVERRIDE; + virtual void RegisterIntentHandler( + content::WebContents* tab, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) OVERRIDE; virtual void WebIntentDispatch( content::WebContents* tab, content::WebIntentsDispatcher* intents_dispatcher) OVERRIDE; diff --git a/chrome/browser/intents/register_intent_handler_helper.cc b/chrome/browser/intents/register_intent_handler_helper.cc index abfd47f..88c1f96 100644 --- a/chrome/browser/intents/register_intent_handler_helper.cc +++ b/chrome/browser/intents/register_intent_handler_helper.cc @@ -17,14 +17,12 @@ using content::WebContents; // static -void Browser::RegisterIntentHandlerHelper(WebContents* tab, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) { - TabContentsWrapper* tcw = TabContentsWrapper::GetCurrentWrapperForContents( - tab); +void Browser::RegisterIntentHandlerHelper( + WebContents* tab, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) { + TabContentsWrapper* tcw = + TabContentsWrapper::GetCurrentWrapperForContents(tab); if (!tcw || tcw->profile()->IsOffTheRecord()) return; @@ -34,24 +32,10 @@ void Browser::RegisterIntentHandlerHelper(WebContents* tab, FaviconService* favicon_service = tcw->profile()->GetFaviconService(Profile::EXPLICIT_ACCESS); - // |href| can be relative to originating URL. Resolve if necessary. - GURL service_url(href); - if (!service_url.is_valid()) { - const GURL& url = tab->GetURL(); - service_url = url.Resolve(href); - } - - webkit_glue::WebIntentServiceData service; - service.service_url = service_url; - service.action = action; - service.type = type; - service.title = title; - service.setDisposition(disposition); - RegisterIntentHandlerInfoBarDelegate::MaybeShowIntentInfoBar( tcw->infobar_tab_helper(), WebIntentsRegistryFactory::GetForProfile(tcw->profile()), - service, + data, favicon_service, tab->GetURL()); } diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 785af04..3d5c55c 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc @@ -186,6 +186,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/point.h" #include "webkit/glue/web_intent_data.h" +#include "webkit/glue/web_intent_service_data.h" #include "webkit/glue/webkit_glue.h" #include "webkit/glue/window_open_disposition.h" #include "webkit/plugins/webplugininfo.h" @@ -2235,7 +2236,8 @@ void Browser::JSOutOfMemoryHelper(WebContents* tab) { void Browser::RegisterProtocolHandlerHelper(WebContents* tab, const std::string& protocol, const GURL& url, - const string16& title) { + const string16& title, + bool user_gesture) { TabContentsWrapper* tcw = TabContentsWrapper::GetCurrentWrapperForContents( tab); if (!tcw || tcw->profile()->IsOffTheRecord()) @@ -3601,17 +3603,16 @@ void Browser::JSOutOfMemory(WebContents* tab) { void Browser::RegisterProtocolHandler(WebContents* tab, const std::string& protocol, const GURL& url, - const string16& title) { - RegisterProtocolHandlerHelper(tab, protocol, url, title); + const string16& title, + bool user_gesture) { + RegisterProtocolHandlerHelper(tab, protocol, url, title, user_gesture); } -void Browser::RegisterIntentHandler(WebContents* tab, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) { - RegisterIntentHandlerHelper(tab, action, type, href, title, disposition); +void Browser::RegisterIntentHandler( + WebContents* tab, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) { + RegisterIntentHandlerHelper(tab, data, user_gesture); } void Browser::WebIntentDispatch( diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index b7f5e51..05a74418 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h @@ -86,6 +86,10 @@ namespace ui { class WebDialogDelegate; } +namespace webkit_glue { +struct WebIntentServiceData; +} + class Browser : public TabStripModelDelegate, public TabStripModelObserver, public content::WebContentsDelegate, @@ -649,15 +653,16 @@ class Browser : public TabStripModelDelegate, static void RegisterProtocolHandlerHelper(content::WebContents* tab, const std::string& protocol, const GURL& url, - const string16& title); + const string16& title, + bool user_gesture); // Helper function to register an intent handler. - static void RegisterIntentHandlerHelper(content::WebContents* tab, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition); + // |data| is the registered handler data. |user_gesture| is true if the call + // was made in the context of a user gesture. + static void RegisterIntentHandlerHelper( + content::WebContents* tab, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture); // Helper function to handle find results. static void FindReplyHelper(content::WebContents* tab, @@ -967,13 +972,12 @@ class Browser : public TabStripModelDelegate, virtual void RegisterProtocolHandler(content::WebContents* tab, const std::string& protocol, const GURL& url, - const string16& title) OVERRIDE; - virtual void RegisterIntentHandler(content::WebContents* tab, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) OVERRIDE; + const string16& title, + bool user_gesture) OVERRIDE; + virtual void RegisterIntentHandler( + content::WebContents* tab, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) OVERRIDE; virtual void WebIntentDispatch( content::WebContents* tab, content::WebIntentsDispatcher* intents_dispatcher) OVERRIDE; diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index ef1d9b1..218f6f9 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -72,6 +72,7 @@ #include "ui/gfx/monitor.h" #include "ui/gfx/screen.h" #include "webkit/glue/web_intent_data.h" +#include "webkit/glue/web_intent_service_data.h" #include "webkit/glue/webpreferences.h" #if defined(OS_MACOSX) @@ -1737,13 +1738,10 @@ void WebContentsImpl::SetFocusToLocationBar(bool select_all) { delegate_->SetFocusToLocationBar(select_all); } -void WebContentsImpl::OnRegisterIntentService(const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) { - delegate_->RegisterIntentHandler( - this, action, type, href, title, disposition); +void WebContentsImpl::OnRegisterIntentService( + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) { + delegate_->RegisterIntentHandler(this, data, user_gesture); } void WebContentsImpl::OnWebIntentDispatch( @@ -2038,12 +2036,13 @@ void WebContentsImpl::OnJSOutOfMemory() { void WebContentsImpl::OnRegisterProtocolHandler(const std::string& protocol, const GURL& url, - const string16& title) { + const string16& title, + bool user_gesture) { ChildProcessSecurityPolicyImpl* policy = ChildProcessSecurityPolicyImpl::GetInstance(); if (policy->IsPseudoScheme(protocol) || policy->IsDisabledScheme(protocol)) return; - delegate_->RegisterProtocolHandler(this, protocol, url, title); + delegate_->RegisterProtocolHandler(this, protocol, url, title, user_gesture); } void WebContentsImpl::OnFindReply(int request_id, diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index b63e1b2..e52a21d 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -64,6 +64,7 @@ WebContentsView* CreateWebContentsView( namespace webkit_glue { struct WebIntentData; +struct WebIntentServiceData; } class CONTENT_EXPORT WebContentsImpl @@ -466,11 +467,8 @@ class CONTENT_EXPORT WebContentsImpl const string16& user_input); // IPC message handlers. - void OnRegisterIntentService(const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition); + void OnRegisterIntentService(const webkit_glue::WebIntentServiceData& data, + bool user_gesture); void OnWebIntentDispatch(const webkit_glue::WebIntentData& intent, int intent_id); void OnDidLoadResourceFromMemoryCache(const GURL& url, @@ -501,7 +499,8 @@ class CONTENT_EXPORT WebContentsImpl void OnRegisterProtocolHandler(const std::string& protocol, const GURL& url, - const string16& title); + const string16& title, + bool user_gesture); void OnFindReply(int request_id, int number_of_matches, const gfx::Rect& selection_rect, int active_match_ordinal, bool final_update); diff --git a/content/common/intents_messages.h b/content/common/intents_messages.h index fd2866d..8e648d5 100644 --- a/content/common/intents_messages.h +++ b/content/common/intents_messages.h @@ -10,6 +10,7 @@ #include "ipc/param_traits_macros.h" #include "webkit/glue/web_intent_data.h" #include "webkit/glue/web_intent_reply_data.h" +#include "webkit/glue/web_intent_service_data.h" #undef IPC_MESSAGE_EXPORT #define IPC_MESSAGE_EXPORT CONTENT_EXPORT @@ -17,6 +18,7 @@ IPC_ENUM_TRAITS(webkit_glue::WebIntentReplyType) IPC_ENUM_TRAITS(webkit_glue::WebIntentData::DataType) +IPC_ENUM_TRAITS(webkit_glue::WebIntentServiceData::Disposition) IPC_STRUCT_TRAITS_BEGIN(webkit_glue::WebIntentData) IPC_STRUCT_TRAITS_MEMBER(action) @@ -32,6 +34,14 @@ IPC_STRUCT_TRAITS_BEGIN(webkit_glue::WebIntentData) IPC_STRUCT_TRAITS_MEMBER(data_type) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(webkit_glue::WebIntentServiceData) + IPC_STRUCT_TRAITS_MEMBER(service_url) + IPC_STRUCT_TRAITS_MEMBER(action) + IPC_STRUCT_TRAITS_MEMBER(type) + IPC_STRUCT_TRAITS_MEMBER(title) + IPC_STRUCT_TRAITS_MEMBER(disposition) +IPC_STRUCT_TRAITS_END() + // Set the intent data to be set on the service page. IPC_MESSAGE_ROUTED1(IntentsMsg_SetWebIntentData, webkit_glue::WebIntentData) @@ -53,9 +63,6 @@ IPC_MESSAGE_ROUTED2(IntentsHostMsg_WebIntentDispatch, int /* intent ID */) // Register a new service for Intents with the given action and type filter. -IPC_MESSAGE_ROUTED5(IntentsHostMsg_RegisterIntentService, - string16 /* action */, - string16 /* type */, - string16 /* href */, - string16 /* title */, - string16 /* disposition */) +IPC_MESSAGE_ROUTED2(IntentsHostMsg_RegisterIntentService, + webkit_glue::WebIntentServiceData, + bool /* user_gesture */) diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 0e461f5..0870e02 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -2021,10 +2021,11 @@ IPC_MESSAGE_ROUTED2(ViewHostMsg_SaveURLAs, IPC_MESSAGE_ROUTED0(ViewHostMsg_JSOutOfMemory) // Register a new handler for URL requests with the given scheme. -IPC_MESSAGE_ROUTED3(ViewHostMsg_RegisterProtocolHandler, +IPC_MESSAGE_ROUTED4(ViewHostMsg_RegisterProtocolHandler, std::string /* scheme */, GURL /* url */, - string16 /* title */) + string16 /* title */, + bool /* user_gesture */) // Stores new inspector setting in the profile. // TODO(jam): this should be in the chrome module diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 55a73b5..6c3b6f8 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h @@ -53,6 +53,7 @@ class HistoryAddPageArgs; namespace webkit_glue { struct WebIntentData; +struct WebIntentServiceData; } namespace content { @@ -355,18 +356,22 @@ class CONTENT_EXPORT WebContentsDelegate { virtual void JSOutOfMemory(WebContents* web_contents) {} // Register a new handler for URL requests with the given scheme. + // |user_gesture| is true if the registration is made in the context of a user + // gesture. virtual void RegisterProtocolHandler(WebContents* web_contents, const std::string& protocol, const GURL& url, - const string16& title) {} - - // Register a new handler for Intents with the given action and type filter. - virtual void RegisterIntentHandler(WebContents* web_contents, - const string16& action, - const string16& type, - const string16& href, - const string16& title, - const string16& disposition) {} + const string16& title, + bool user_gesture) {} + + // Register a new Web Intents service. + // |user_gesture| is true if the registration is made in the context of a user + // gesture. |web_contents| is the context in which the registration was + // performed, and |data| is the service record being registered. + virtual void RegisterIntentHandler( + WebContents* web_contents, + const webkit_glue::WebIntentServiceData& data, + bool user_gesture) {} // Web Intents notification handler. See WebIntentsDispatcher for // documentation of callee responsibility for the dispatcher. diff --git a/content/renderer/notification_provider.cc b/content/renderer/notification_provider.cc index 9123a32..c4de9d1 100644 --- a/content/renderer/notification_provider.cc +++ b/content/renderer/notification_provider.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// 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. @@ -69,7 +69,7 @@ void NotificationProvider::requestPermission( const WebSecurityOrigin& origin, WebNotificationPermissionCallback* callback) { // We only request permission in response to a user gesture. - if (!render_view()->GetWebView()->mainFrame()->isProcessingUserGesture()) + if (!render_view()->GetWebView()->mainFrame()->isProcessingUserGesture()) return; int id = manager_.RegisterPermissionRequest(callback); diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 507e482..faa6d3b 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc @@ -1256,16 +1256,13 @@ TEST_F(RenderViewImplTest, FindTitleForIntentsPage) { const IPC::Message* msg = render_thread_->sink().GetUniqueMessageMatching( IntentsHostMsg_RegisterIntentService::ID); ASSERT_TRUE(msg); - string16 action; - string16 type; - string16 href; - string16 title; - string16 disposition; - IntentsHostMsg_RegisterIntentService::Read( - msg, &action, &type, &href, &title, &disposition); - EXPECT_EQ(ASCIIToUTF16("a"), action); - EXPECT_EQ(ASCIIToUTF16("t"), type); - EXPECT_EQ(ASCIIToUTF16("title"), title); + webkit_glue::WebIntentServiceData service_data; + bool user_gesture = true; + IntentsHostMsg_RegisterIntentService::Read(msg, &service_data, &user_gesture); + EXPECT_EQ(ASCIIToUTF16("a"), service_data.action); + EXPECT_EQ(ASCIIToUTF16("t"), service_data.type); + EXPECT_EQ(ASCIIToUTF16("title"), service_data.title); + EXPECT_FALSE(user_gesture); } TEST_F(RenderViewImplTest, ContextMenu) { diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index b8cf211..060eb19 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -174,6 +174,7 @@ #include "webkit/glue/dom_operations.h" #include "webkit/glue/glue_serialize.h" #include "webkit/glue/webdropdata.h" +#include "webkit/glue/web_intent_service_data.h" #include "webkit/glue/webkit_constants.h" #include "webkit/glue/webkit_glue.h" #include "webkit/glue/weburlloader_impl.h" @@ -3618,16 +3619,13 @@ void RenderViewImpl::requestStorageQuota( void RenderViewImpl::registerIntentService( WebFrame* frame, const WebIntentServiceInfo& service) { - string16 title = service.title(); - if (title.empty()) - title = webview()->mainFrame()->document().title(); - + webkit_glue::WebIntentServiceData data(service); + if (data.title.empty()) + data.title = webview()->mainFrame()->document().title(); + bool user_gesture = frame->isProcessingUserGesture(); Send(new IntentsHostMsg_RegisterIntentService(routing_id_, - service.action(), - service.type(), - service.url().spec().utf16(), - title, - service.disposition())); + data, + user_gesture)); } void RenderViewImpl::dispatchIntent( @@ -5453,6 +5451,8 @@ void RenderViewImpl::registerProtocolHandler(const WebString& scheme, const WebString& base_url, const WebString& url, const WebString& title) { + bool user_gesture = (webview()->focusedFrame() && + webview()->focusedFrame()->isProcessingUserGesture()); GURL base(base_url); GURL absolute_url = base.Resolve(UTF16ToUTF8(url)); if (base.GetOrigin() != absolute_url.GetOrigin()) { @@ -5461,7 +5461,8 @@ void RenderViewImpl::registerProtocolHandler(const WebString& scheme, Send(new ViewHostMsg_RegisterProtocolHandler(routing_id_, UTF16ToUTF8(scheme), absolute_url, - title)); + title, + user_gesture)); } WebKit::WebPageVisibilityState RenderViewImpl::visibilityState() const { diff --git a/webkit/glue/web_intent_service_data.cc b/webkit/glue/web_intent_service_data.cc index e9d8d56..4367b60 100644 --- a/webkit/glue/web_intent_service_data.cc +++ b/webkit/glue/web_intent_service_data.cc @@ -1,10 +1,11 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// 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 <ostream> #include "base/utf_string_conversions.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebIntentServiceInfo.h" #include "webkit/glue/web_intent_service_data.h" namespace webkit_glue { @@ -26,6 +27,16 @@ WebIntentServiceData::WebIntentServiceData(const GURL& svc_url, disposition(WebIntentServiceData::DISPOSITION_WINDOW) { } +WebIntentServiceData::WebIntentServiceData( + const WebKit::WebIntentServiceInfo& info) + : service_url(info.url()), + action(info.action()), + type(info.type()), + title(info.title()), + disposition(WebIntentServiceData::DISPOSITION_WINDOW) { + setDisposition(info.disposition()); +} + WebIntentServiceData::~WebIntentServiceData() {} bool WebIntentServiceData::operator==(const WebIntentServiceData& other) const { diff --git a/webkit/glue/web_intent_service_data.h b/webkit/glue/web_intent_service_data.h index d23f3dd..d5a9136 100644 --- a/webkit/glue/web_intent_service_data.h +++ b/webkit/glue/web_intent_service_data.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// 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. @@ -6,10 +6,15 @@ #define WEBKIT_GLUE_WEB_INTENT_SERVICE_DATA_H_ #pragma once +#include <iosfwd> + #include "base/string16.h" #include "googleurl/src/gurl.h" #include "webkit/glue/webkit_glue_export.h" -#include <iosfwd> + +namespace WebKit { +class WebIntentServiceInfo; +} namespace webkit_glue { @@ -26,6 +31,7 @@ struct WEBKIT_GLUE_EXPORT WebIntentServiceData { const string16& action, const string16& type, const string16& title); + explicit WebIntentServiceData(const WebKit::WebIntentServiceInfo& info); ~WebIntentServiceData(); bool operator==(const WebIntentServiceData& other) const; |