diff options
-rw-r--r-- | chrome/browser/services/gcm/push_messaging_service_impl.cc | 20 | ||||
-rw-r--r-- | chrome/browser/services/gcm/push_messaging_service_impl.h | 2 | ||||
-rw-r--r-- | content/browser/push_messaging_message_filter.cc | 45 | ||||
-rw-r--r-- | content/browser/push_messaging_message_filter.h | 10 | ||||
-rw-r--r-- | content/public/browser/push_messaging_service.h | 2 | ||||
-rw-r--r-- | content/renderer/push_messaging_dispatcher.cc | 6 | ||||
-rw-r--r-- | content/renderer/push_messaging_dispatcher.h | 10 | ||||
-rw-r--r-- | content/renderer/render_frame_impl.cc | 8 | ||||
-rw-r--r-- | content/renderer/render_frame_impl.h | 11 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 8 | ||||
-rw-r--r-- | content/renderer/render_view_impl.h | 4 |
11 files changed, 68 insertions, 58 deletions
diff --git a/chrome/browser/services/gcm/push_messaging_service_impl.cc b/chrome/browser/services/gcm/push_messaging_service_impl.cc index b0bd5d4..351b97a 100644 --- a/chrome/browser/services/gcm/push_messaging_service_impl.cc +++ b/chrome/browser/services/gcm/push_messaging_service_impl.cc @@ -16,11 +16,11 @@ #include "chrome/browser/services/gcm/gcm_profile_service_factory.h" #include "chrome/browser/services/gcm/push_messaging_permission_context.h" #include "chrome/browser/services/gcm/push_messaging_permission_context_factory.h" -#include "chrome/browser/tab_contents/tab_util.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "components/gcm_driver/gcm_driver.h" #include "components/pref_registry/pref_registry_syncable.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" namespace gcm { @@ -133,7 +133,7 @@ void PushMessagingServiceImpl::Register( const std::string& app_id, const std::string& sender_id, int renderer_id, - int render_view_id, + int render_frame_id, const content::PushMessagingService::RegisterCallback& callback) { if (!gcm_profile_service_->driver()) { NOTREACHED() << "There is no GCMDriver. Has GCMProfileService shut down?"; @@ -150,10 +150,17 @@ void PushMessagingServiceImpl::Register( if (gcm_profile_service_->driver()->GetAppHandler(kAppIdPrefix) != this) gcm_profile_service_->driver()->AddAppHandler(kAppIdPrefix, this); + content::RenderFrameHost* render_frame_host = + content::RenderFrameHost::FromID(renderer_id, render_frame_id); + + // The frame doesn't exist any more, or we received a bad frame id. + if (!render_frame_host) + return; + content::WebContents* web_contents = - tab_util::GetWebContentsByID(renderer_id, render_view_id); + content::WebContents::FromRenderFrameHost(render_frame_host); - // The page doesn't exist any more. + // The page doesn't exist any more or we got a bad render frame host. if (!web_contents) return; @@ -161,9 +168,10 @@ void PushMessagingServiceImpl::Register( // implemented. int bridge_id = -1; - const PermissionRequestID id(renderer_id, render_view_id, bridge_id, GURL()); + const PermissionRequestID id( + renderer_id, web_contents->GetRoutingID(), bridge_id, GURL()); - GURL embedder = web_contents->GetURL(); + GURL embedder = web_contents->GetLastCommittedURL(); gcm::PushMessagingPermissionContext* permission_context = gcm::PushMessagingPermissionContextFactory::GetForProfile(profile_); diff --git a/chrome/browser/services/gcm/push_messaging_service_impl.h b/chrome/browser/services/gcm/push_messaging_service_impl.h index 4a049fb..5dff831 100644 --- a/chrome/browser/services/gcm/push_messaging_service_impl.h +++ b/chrome/browser/services/gcm/push_messaging_service_impl.h @@ -49,7 +49,7 @@ class PushMessagingServiceImpl : public content::PushMessagingService, const std::string& app_id, const std::string& sender_id, int renderer_id, - int router_id, + int render_frame_id, const content::PushMessagingService::RegisterCallback& callback) OVERRIDE; private: diff --git a/content/browser/push_messaging_message_filter.cc b/content/browser/push_messaging_message_filter.cc index a4075c5..ef166d7 100644 --- a/content/browser/push_messaging_message_filter.cc +++ b/content/browser/push_messaging_message_filter.cc @@ -19,7 +19,8 @@ PushMessagingMessageFilter::PushMessagingMessageFilter(int render_process_id) : BrowserMessageFilter(PushMessagingMsgStart), render_process_id_(render_process_id), service_(NULL), - weak_factory_(this) {} + weak_factory_(this) { +} PushMessagingMessageFilter::~PushMessagingMessageFilter() {} @@ -33,65 +34,57 @@ bool PushMessagingMessageFilter::OnMessageReceived( return handled; } -void PushMessagingMessageFilter::OnRegister(int render_view_id, +void PushMessagingMessageFilter::OnRegister(int render_frame_id, int callbacks_id, const std::string& sender_id) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); // TODO(mvanouwerkerk): Validate arguments? - // TODO(mvanouwerkerk): A WebContentsObserver could avoid this PostTask - // by receiving the IPC on the UI thread. - // TODO(mvanouwerkerk): move WebPushClient to WebFrameClient and its - // content implementation to RenderFrameObserver instead of - // RenderViewObserver BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(&PushMessagingMessageFilter::DoRegister, weak_factory_.GetWeakPtr(), - render_view_id, + render_frame_id, callbacks_id, sender_id)); } -void PushMessagingMessageFilter::DoRegister(int render_view_id, +void PushMessagingMessageFilter::DoRegister(int render_frame_id, int callbacks_id, const std::string& sender_id) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (!service()) { - DidRegister(render_view_id, callbacks_id, GURL(), "", false); + DidRegister(render_frame_id, callbacks_id, GURL(), "", false); return; } // TODO(mvanouwerkerk): Pass in a real app ID based on Service Worker ID. std::string app_id = "https://example.com 0"; - service_->Register(app_id, - sender_id, - render_process_id_, - render_view_id, - base::Bind(&PushMessagingMessageFilter::DidRegister, - weak_factory_.GetWeakPtr(), - render_view_id, - callbacks_id)); + service()->Register(app_id, + sender_id, + render_process_id_, + render_frame_id, + base::Bind(&PushMessagingMessageFilter::DidRegister, + weak_factory_.GetWeakPtr(), + render_frame_id, + callbacks_id)); } -void PushMessagingMessageFilter::DidRegister(int render_view_id, +void PushMessagingMessageFilter::DidRegister(int render_frame_id, int callbacks_id, const GURL& endpoint, const std::string& registration_id, bool success) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (success) { - Send(new PushMessagingMsg_RegisterSuccess(render_view_id, - callbacks_id, - endpoint, - registration_id)); + Send(new PushMessagingMsg_RegisterSuccess( + render_frame_id, callbacks_id, endpoint, registration_id)); } else { - Send(new PushMessagingMsg_RegisterError(render_view_id, callbacks_id)); + Send(new PushMessagingMsg_RegisterError(render_frame_id, callbacks_id)); } } PushMessagingService* PushMessagingMessageFilter::service() { if (!service_) { - RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( - RenderProcessHost::FromID(render_process_id_)); + RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_); if (!host) return NULL; service_ = host->GetBrowserContext()->GetPushMessagingService(); diff --git a/content/browser/push_messaging_message_filter.h b/content/browser/push_messaging_message_filter.h index 25ea50d..7a786a7 100644 --- a/content/browser/push_messaging_message_filter.h +++ b/content/browser/push_messaging_message_filter.h @@ -25,15 +25,15 @@ class PushMessagingMessageFilter : public BrowserMessageFilter { // BrowserMessageFilter implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; - void OnRegister(int render_view_id, + void OnRegister(int render_frame_id, int callbacks_id, const std::string& sender_id); - void DoRegister(int render_view_id, + void DoRegister(int render_frame_id, int callbacks_id, const std::string& sender_id); - void DidRegister(int render_view_id, + void DidRegister(int render_frame_id, int callbacks_id, const GURL& endpoint, const std::string& registration_id, @@ -42,7 +42,9 @@ class PushMessagingMessageFilter : public BrowserMessageFilter { PushMessagingService* service(); int render_process_id_; - PushMessagingService* service_; // Not owned. + + // Owned by the content embedder's browsing context. + PushMessagingService* service_; base::WeakPtrFactory<PushMessagingMessageFilter> weak_factory_; diff --git a/content/public/browser/push_messaging_service.h b/content/public/browser/push_messaging_service.h index 560d005..6175a43 100644 --- a/content/public/browser/push_messaging_service.h +++ b/content/public/browser/push_messaging_service.h @@ -26,7 +26,7 @@ class CONTENT_EXPORT PushMessagingService { virtual void Register(const std::string& app_id, const std::string& sender_id, int renderer_id, - int render_view_id, + int render_frame_id, const RegisterCallback& callback) = 0; }; diff --git a/content/renderer/push_messaging_dispatcher.cc b/content/renderer/push_messaging_dispatcher.cc index 136862c..d0a8a87 100644 --- a/content/renderer/push_messaging_dispatcher.cc +++ b/content/renderer/push_messaging_dispatcher.cc @@ -5,7 +5,6 @@ #include "content/renderer/push_messaging_dispatcher.h" #include "content/common/push_messaging_messages.h" -#include "content/renderer/render_view_impl.h" #include "ipc/ipc_message.h" #include "third_party/WebKit/public/platform/WebPushError.h" #include "third_party/WebKit/public/platform/WebPushRegistration.h" @@ -16,8 +15,9 @@ using blink::WebString; namespace content { -PushMessagingDispatcher::PushMessagingDispatcher(RenderViewImpl* render_view) - : RenderViewObserver(render_view) {} +PushMessagingDispatcher::PushMessagingDispatcher(RenderFrame* render_frame) + : RenderFrameObserver(render_frame) { +} PushMessagingDispatcher::~PushMessagingDispatcher() {} diff --git a/content/renderer/push_messaging_dispatcher.h b/content/renderer/push_messaging_dispatcher.h index ad441b2..1b0b45b 100644 --- a/content/renderer/push_messaging_dispatcher.h +++ b/content/renderer/push_messaging_dispatcher.h @@ -8,7 +8,7 @@ #include <string> #include "base/id_map.h" -#include "content/public/renderer/render_view_observer.h" +#include "content/public/renderer/render_frame_observer.h" #include "third_party/WebKit/public/platform/WebPushClient.h" class GURL; @@ -22,16 +22,14 @@ class WebString; } // namespace blink namespace content { -class RenderViewImpl; - -class PushMessagingDispatcher : public RenderViewObserver, +class PushMessagingDispatcher : public RenderFrameObserver, public blink::WebPushClient { public: - explicit PushMessagingDispatcher(RenderViewImpl* render_view); + explicit PushMessagingDispatcher(RenderFrame* render_frame); virtual ~PushMessagingDispatcher(); private: - // RenderView::Observer implementation. + // RenderFrame::Observer implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; // WebPushClient implementation. diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index cb8676c..fb4eecb 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -72,6 +72,7 @@ #include "content/renderer/media/webmediaplayer_params.h" #include "content/renderer/notification_provider.h" #include "content/renderer/npapi/plugin_channel_host.h" +#include "content/renderer/push_messaging_dispatcher.h" #include "content/renderer/render_process.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" @@ -406,6 +407,7 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) cdm_manager_(NULL), #endif geolocation_dispatcher_(NULL), + push_messaging_dispatcher_(NULL), screen_orientation_dispatcher_(NULL), weak_factory_(this) { std::pair<RoutingIDFrameMap::iterator, bool> result = @@ -2748,6 +2750,12 @@ blink::WebGeolocationClient* RenderFrameImpl::geolocationClient() { return geolocation_dispatcher_; } +blink::WebPushClient* RenderFrameImpl::pushClient() { + if (!push_messaging_dispatcher_) + push_messaging_dispatcher_ = new PushMessagingDispatcher(this); + return push_messaging_dispatcher_; +} + void RenderFrameImpl::willStartUsingPeerConnectionHandler( blink::WebLocalFrame* frame, blink::WebRTCPeerConnectionHandler* handler) { diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 117cc0b..5fca735 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -41,6 +41,7 @@ class WebMouseEvent; class WebContentDecryptionModule; class WebMediaPlayer; class WebNotificationPresenter; +class WebPushClient; class WebSecurityOrigin; struct WebCompositionUnderline; struct WebContextMenuData; @@ -61,6 +62,7 @@ class MediaStreamRendererFactory; class MidiDispatcher; class NotificationProvider; class PepperPluginInstanceImpl; +class PushMessagingDispatcher; class RendererCdmManager; class RendererMediaPlayerManager; class RendererPpapiHost; @@ -369,6 +371,7 @@ class CONTENT_EXPORT RenderFrameImpl blink::WebSocketStreamHandle* handle); virtual void willOpenWebSocket(blink::WebSocketHandle* handle); virtual blink::WebGeolocationClient* geolocationClient(); + virtual blink::WebPushClient* pushClient(); virtual void willStartUsingPeerConnectionHandler( blink::WebLocalFrame* frame, blink::WebRTCPeerConnectionHandler* handler); @@ -635,12 +638,16 @@ class CONTENT_EXPORT RenderFrameImpl RendererCdmManager* cdm_manager_; #endif - // The geolocation dispatcher attached to this view, lazily initialized. + // The geolocation dispatcher attached to this frame, lazily initialized. GeolocationDispatcher* geolocation_dispatcher_; + // The push messaging dispatcher attached to this frame, lazily initialized. + PushMessagingDispatcher* push_messaging_dispatcher_; + ServiceRegistryImpl service_registry_; - // The screen orientation dispatcher attached to the view, lazily initialized. + // The screen orientation dispatcher attached to the frame, lazily + // initialized. ScreenOrientationDispatcher* screen_orientation_dispatcher_; base::WeakPtrFactory<RenderFrameImpl> weak_factory_; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 2fb4589..50c5ae6 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -92,7 +92,6 @@ #include "content/renderer/media/webrtc/peer_connection_dependency_factory.h" #include "content/renderer/memory_benchmarking_extension.h" #include "content/renderer/mhtml_generator.h" -#include "content/renderer/push_messaging_dispatcher.h" #include "content/renderer/render_frame_impl.h" #include "content/renderer/render_frame_proxy.h" #include "content/renderer/render_process.h" @@ -637,7 +636,6 @@ RenderViewImpl::RenderViewImpl(RenderViewImplParams* params) top_controls_constraints_(cc::BOTH), #endif has_scrolled_focused_editable_node_into_rect_(false), - push_messaging_dispatcher_(NULL), speech_recognition_dispatcher_(NULL), media_stream_dispatcher_(NULL), browser_plugin_manager_(NULL), @@ -3681,9 +3679,9 @@ blink::WebPageVisibilityState RenderViewImpl::visibilityState() const { } blink::WebPushClient* RenderViewImpl::webPushClient() { - if (!push_messaging_dispatcher_) - push_messaging_dispatcher_ = new PushMessagingDispatcher(this); - return push_messaging_dispatcher_; + // TODO(mvanouwerkerk): Remove this method once the Push API code in Blink + // has also switched over to Frame. + return main_render_frame_->pushClient(); } void RenderViewImpl::draggableRegionsChanged() { diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 96f52f6..beba1f2 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -137,7 +137,6 @@ class MediaStreamDispatcher; class MouseLockDispatcher; class NavigationState; class PepperPluginInstanceImpl; -class PushMessagingDispatcher; class RenderViewObserver; class RenderViewTest; class RendererAccessibility; @@ -1039,9 +1038,6 @@ class CONTENT_EXPORT RenderViewImpl // along with the RenderView automatically. This is why we just store // weak references. - // The push messaging dispatcher attached to this view, lazily initialized. - PushMessagingDispatcher* push_messaging_dispatcher_; - // The speech recognition dispatcher attached to this view, lazily // initialized. SpeechRecognitionDispatcher* speech_recognition_dispatcher_; |