diff options
author | johnnyg@chromium.org <johnnyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-23 23:39:09 +0000 |
---|---|---|
committer | johnnyg@chromium.org <johnnyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-23 23:39:09 +0000 |
commit | 9e9e55c35954a06b68d5e62a27fa1ea60675d6f2 (patch) | |
tree | aa031fb90182ccd30df76f9d7947c36799ec611d /chrome/browser/gtk | |
parent | 475b996b15bd1010869876e6d70e4c79bc1fea05 (diff) | |
download | chromium_src-9e9e55c35954a06b68d5e62a27fa1ea60675d6f2.zip chromium_src-9e9e55c35954a06b68d5e62a27fa1ea60675d6f2.tar.gz chromium_src-9e9e55c35954a06b68d5e62a27fa1ea60675d6f2.tar.bz2 |
Refactor BalloonViewHost, removing a lot of duplicate code that crept into notifications during the port to mac & linux and making behavior more consistent.
BUG=34826
TEST=notifications on each platform.
Review URL: http://codereview.chromium.org/1055005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42404 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/notifications/balloon_view_host_gtk.cc | 126 | ||||
-rw-r--r-- | chrome/browser/gtk/notifications/balloon_view_host_gtk.h | 113 |
2 files changed, 19 insertions, 220 deletions
diff --git a/chrome/browser/gtk/notifications/balloon_view_host_gtk.cc b/chrome/browser/gtk/notifications/balloon_view_host_gtk.cc index b8f3e96..3a3afee 100644 --- a/chrome/browser/gtk/notifications/balloon_view_host_gtk.cc +++ b/chrome/browser/gtk/notifications/balloon_view_host_gtk.cc @@ -4,139 +4,31 @@ #include "chrome/browser/gtk/notifications/balloon_view_host_gtk.h" -#include "base/string_util.h" -#include "chrome/browser/browser_list.h" -#include "chrome/browser/in_process_webkit/dom_storage_context.h" -#include "chrome/browser/in_process_webkit/webkit_context.h" #include "chrome/browser/notifications/balloon.h" -#include "chrome/browser/notifications/notification.h" -#include "chrome/browser/profile.h" #include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/renderer_host/render_widget_host_view.h" #include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" -#include "chrome/browser/renderer_host/site_instance.h" -#include "chrome/browser/renderer_preferences_util.h" -#include "chrome/common/notification_service.h" -#include "chrome/common/notification_type.h" -#include "chrome/common/render_messages.h" -#include "chrome/common/renderer_preferences.h" BalloonViewHost::BalloonViewHost(Balloon* balloon) - : initialized_(false), - balloon_(balloon), - site_instance_(SiteInstance::CreateSiteInstance(balloon->profile())), - render_view_host_(NULL), - should_notify_on_disconnect_(false) { - DCHECK(balloon_); -} - -void BalloonViewHost::Shutdown() { - if (render_view_host_) { - render_view_host_->Shutdown(); - render_view_host_ = NULL; - } -} - -WebPreferences BalloonViewHost::GetWebkitPrefs() { - WebPreferences prefs; - prefs.allow_scripts_to_close_windows = true; - return prefs; -} - -RendererPreferences BalloonViewHost::GetRendererPrefs(Profile* profile) const { - RendererPreferences prefs; - renderer_preferences_util::UpdateFromSystemSettings(&prefs, profile); - // We want links (a.k.a. top_level_requests) to be forwarded to the browser so - // that we can open them in a new tab rather than in the balloon. - prefs.browser_handles_top_level_requests = true; - return prefs; -} - -void BalloonViewHost::RequestOpenURL(const GURL& url, - const GURL& referrer, - WindowOpenDisposition disposition) { - // Always open a link triggered within the notification balloon in a new tab. - // TODO(johnnyg): this new tab should always be in the same workspace as the - // notification. - BrowserList::GetLastActive()->AddTabWithURL(url, referrer, - PageTransition::LINK, true, 0, 0, GetSiteInstance()); -} - -void BalloonViewHost::Close(RenderViewHost* render_view_host) { - balloon_->CloseByScript(); -} - -void BalloonViewHost::RenderViewCreated(RenderViewHost* render_view_host) { - render_view_host->Send(new ViewMsg_EnablePreferredSizeChangedMode( - render_view_host->routing_id())); -} - -void BalloonViewHost::RendererReady(RenderViewHost* render_view_host) { - should_notify_on_disconnect_ = true; - NotificationService::current()->Notify( - NotificationType::NOTIFY_BALLOON_CONNECTED, - Source<Balloon>(balloon_), NotificationService::NoDetails()); -} - -void BalloonViewHost::RendererGone(RenderViewHost* render_view_host) { - if (!should_notify_on_disconnect_) - return; - - should_notify_on_disconnect_ = false; - NotificationService::current()->Notify( - NotificationType::NOTIFY_BALLOON_DISCONNECTED, - Source<Balloon>(balloon_), NotificationService::NoDetails()); -} - -// RenderViewHostDelegate::View methods implemented to allow links to -// open pages in new tabs. -void BalloonViewHost::CreateNewWindow(int route_id) { - delegate_view_helper_.CreateNewWindow( - route_id, balloon_->profile(), site_instance_.get(), - DOMUIFactory::GetDOMUIType(balloon_->notification().content_url()), NULL); -} - -void BalloonViewHost::ShowCreatedWindow(int route_id, - WindowOpenDisposition disposition, - const gfx::Rect& initial_pos, - bool user_gesture) { - // Don't allow pop-ups from notifications. - if (disposition == NEW_POPUP) - return; - - TabContents* contents = delegate_view_helper_.GetCreatedWindow(route_id); - if (contents) { - Browser* browser = BrowserList::GetLastActive(); - browser->AddTabContents(contents, disposition, initial_pos, user_gesture); - } -} - -void BalloonViewHost::UpdatePreferredSize(const gfx::Size& new_size) { - balloon_->SetContentPreferredSize(new_size); + : BalloonHost(balloon) { } void BalloonViewHost::UpdateActualSize(const gfx::Size& new_size) { render_widget_host_view_->SetSize(new_size); - // gfx::Size(new_size.width(), new_size.height())); gtk_widget_set_size_request( native_view(), new_size.width(), new_size.height()); } -void BalloonViewHost::Init() { - DCHECK(!render_view_host_) << "BalloonViewHost already initialized."; - - int64 session_storage_namespace_id = balloon_->profile()->GetWebKitContext()-> - dom_storage_context()->AllocateSessionStorageNamespaceId(); - - render_view_host_ = new RenderViewHost(site_instance_.get(), - this, MSG_ROUTING_NONE, - session_storage_namespace_id); +gfx::NativeView BalloonViewHost::native_view() const { + return render_widget_host_view_->native_view(); +} +void BalloonViewHost::InitRenderWidgetHostView() { + DCHECK(render_view_host_); render_widget_host_view_ = new RenderWidgetHostViewGtk(render_view_host_); render_widget_host_view_->InitAsChild(); +} - render_view_host_->set_view(render_widget_host_view_); - render_view_host_->CreateRenderView(GetProfile()->GetRequestContext()); - render_view_host_->NavigateToURL(balloon_->notification().content_url()); - initialized_ = true; +RenderWidgetHostView* BalloonViewHost::render_widget_host_view() const { + return render_widget_host_view_; } diff --git a/chrome/browser/gtk/notifications/balloon_view_host_gtk.h b/chrome/browser/gtk/notifications/balloon_view_host_gtk.h index de71a41..833a78c 100644 --- a/chrome/browser/gtk/notifications/balloon_view_host_gtk.h +++ b/chrome/browser/gtk/notifications/balloon_view_host_gtk.h @@ -5,25 +5,16 @@ #ifndef CHROME_BROWSER_GTK_NOTIFICATIONS_BALLOON_VIEW_HOST_GTK_H_ #define CHROME_BROWSER_GTK_NOTIFICATIONS_BALLOON_VIEW_HOST_GTK_H_ -#include "chrome/browser/gtk/extension_view_gtk.h" -#include "chrome/browser/notifications/balloon.h" -#include "chrome/browser/notifications/notification.h" -#include "chrome/browser/renderer_host/render_view_host_delegate.h" -#include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" -#include "chrome/browser/renderer_host/site_instance.h" -#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" +#include "chrome/browser/notifications/balloon_host.h" #include "gfx/native_widget_types.h" -#include "webkit/glue/webpreferences.h" -class Profile; -class RenderViewHost; +class RenderWidgetHostViewGtk; // BalloonViewHost class is a delegate to the renderer host for the HTML // notification. When initialized it creates a new RenderViewHost and loads // the contents of the toast into it. It also handles links within the toast, // loading them into a new tab. -class BalloonViewHost : public RenderViewHostDelegate, - public RenderViewHostDelegate::View { +class BalloonViewHost : public BalloonHost { public: explicit BalloonViewHost(Balloon* balloon); @@ -31,104 +22,20 @@ class BalloonViewHost : public RenderViewHostDelegate, Shutdown(); } - // Initialize the view. - void Init(); - - // Stops showing the balloon. - void Shutdown(); - - // RenderViewHostDelegate overrides. - virtual WebPreferences GetWebkitPrefs(); - virtual RendererPreferences GetRendererPrefs(Profile* profile) const; - virtual SiteInstance* GetSiteInstance() const { - return site_instance_.get(); - } - virtual Profile* GetProfile() const { return balloon_->profile(); } - virtual const GURL& GetURL() const { - return balloon_->notification().content_url(); - } - virtual void RequestOpenURL(const GURL& url, const GURL& referrer, - WindowOpenDisposition disposition); - virtual void Close(RenderViewHost* render_view_host); - virtual void RenderViewCreated(RenderViewHost* render_view_host); - virtual void DidStopLoading() {} - virtual void RendererReady(RenderViewHost* render_view_host); - virtual void RendererGone(RenderViewHost* render_view_host); - virtual void UpdateTitle(RenderViewHost* /* render_view_host */, - int32 /* page_id */, const std::wstring& title) { - title_ = title; - } - virtual int GetBrowserWindowID() const { return -1; } - virtual ViewType::Type GetRenderViewType() const { - return ViewType::TAB_CONTENTS; - } - virtual RenderViewHostDelegate::View* GetViewDelegate() { - return this; - } - + // Changes the size of the balloon. void UpdateActualSize(const gfx::Size& new_size); - // RenderViewHostDelegate::View methods. Only the ones for opening new - // windows are currently implemented. - virtual void CreateNewWindow(int route_id); - virtual void CreateNewWidget(int route_id, bool activatable) {} - virtual void ShowCreatedWindow(int route_id, - WindowOpenDisposition disposition, - const gfx::Rect& initial_pos, - bool user_gesture); - virtual void ShowCreatedWidget(int route_id, - const gfx::Rect& initial_pos) {} - virtual void ShowContextMenu(const ContextMenuParams& params) {} - virtual void StartDragging(const WebDropData& drop_data, - WebKit::WebDragOperationsMask allowed_ops, - const SkBitmap& image, - const gfx::Point& image_offset) {} - virtual void UpdateDragCursor(WebKit::WebDragOperation operation) {} - virtual void GotFocus() {} - virtual void TakeFocus(bool reverse) {} - virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, - bool* is_keyboard_shortcut) { - return false; - } - virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) {} - virtual void HandleMouseEvent() {} - virtual void HandleMouseLeave() {} - virtual void UpdatePreferredSize(const gfx::Size& pref_size); - // Accessors. - RenderViewHost* render_view_host() const { return render_view_host_; } - gfx::NativeView native_view() const { - return render_widget_host_view_->native_view(); - } - const std::wstring& title() const { return title_; } - - private: - // True after Init() has completed. - bool initialized_; - - // Non-owned pointer to the associated balloon. - Balloon* balloon_; - - // Site instance for the balloon/profile, to be used for opening new links. - scoped_refptr<SiteInstance> site_instance_; + gfx::NativeView native_view() const; - // Owned pointer to to host for the renderer process. - RenderViewHost* render_view_host_; + protected: + virtual void InitRenderWidgetHostView(); + virtual RenderWidgetHostView* render_widget_host_view() const; - // Indicates whether we should notify about disconnection of this balloon. - // This is used to ensure disconnection notifications only happen if - // a connection notification has happened and that they happen only once. - bool should_notify_on_disconnect_; - - // The title of the balloon page. - std::wstring title_; - - // The GTK-specific widget host view. + private: + // The GTK-specific widget host view. Owned by its native view. RenderWidgetHostViewGtk* render_widget_host_view_; - // Common implementations of some RenderViewHostDelegate::View methods. - RenderViewHostDelegateViewHelper delegate_view_helper_; - DISALLOW_COPY_AND_ASSIGN(BalloonViewHost); }; |