| Index: chrome/browser/chromeos/main_menu.h
|
| ===================================================================
|
| --- chrome/browser/chromeos/main_menu.h (revision 27065)
|
| +++ chrome/browser/chromeos/main_menu.h (working copy)
|
| @@ -7,7 +7,10 @@
|
|
|
| #include <gtk/gtk.h>
|
|
|
| +#include "base/scoped_ptr.h"
|
| #include "chrome/browser/renderer_host/render_view_host_delegate.h"
|
| +#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
|
| +#include "chrome/browser/tab_contents/tab_contents_delegate.h"
|
|
|
| class Browser;
|
| class RenderWidgetHostViewGtk;
|
| @@ -25,34 +28,79 @@
|
| //
|
| // MainMenu creates a RenderViewHost and corresponding RenderWidgetHostView
|
| // to display the html page. MainMenu acts as the RenderViewHostDelegate for
|
| -// the RenderViewHost. Additionally when the user clicks a link a new window
|
| -// is created (child_rvh_). MainMenu is set as the RenderViewHostDelegate of
|
| -// the child_rvh_ so that it can receive the request to open the url
|
| -// (RequestOpenURL).
|
| +// the RenderViewHost. Clicking on a link results in creating a new
|
| +// TabContents (assigned to pending_contents_). One of two things can then
|
| +// happen:
|
| +// . If the page is a popup (ShowCreatedWindow passed NEW_POPUP), the
|
| +// TabContents is added to the Browser.
|
| +// . If the page requests a URL to be open (OpenURLFromTab), OpenURL is
|
| +// invoked on the browser.
|
| //
|
| // When a new url is opened, or the user clicks outsides the bounds of the
|
| // widget the menu is closed.
|
| //
|
| -// MainMenu manages its own lifetime.
|
| +// MainMenu manages its own lifetime. In some cases deletion is delayed because
|
| +// the callers can't deal with being deleted while servicing a message from
|
| +// the renderer.
|
| class MainMenu : public RenderViewHostDelegate,
|
| public RenderViewHostDelegate::View {
|
| public:
|
| // Shows the menu.
|
| static void Show(Browser* browser);
|
|
|
| + ~MainMenu();
|
| +
|
| private:
|
| + // TabContentsDelegate and RenderViewHostDelegate::View have some methods
|
| + // in common (with differing signatures). The TabContentsDelegate methods are
|
| + // implemented by this class.
|
| + class TabContentsDelegateImpl : public TabContentsDelegate {
|
| + public:
|
| + explicit TabContentsDelegateImpl(MainMenu* menu) : menu_(menu) {}
|
| +
|
| + // TabContentsDelegate.
|
| + virtual void OpenURLFromTab(TabContents* source,
|
| + const GURL& url, const GURL& referrer,
|
| + WindowOpenDisposition disposition,
|
| + PageTransition::Type transition);
|
| + virtual void NavigationStateChanged(const TabContents* source,
|
| + unsigned changed_flags) {}
|
| + virtual void AddNewContents(TabContents* source,
|
| + TabContents* new_contents,
|
| + WindowOpenDisposition disposition,
|
| + const gfx::Rect& initial_pos,
|
| + bool user_gesture) {}
|
| + virtual void ActivateContents(TabContents* contents) {}
|
| + virtual void LoadingStateChanged(TabContents* source) {}
|
| + virtual void CloseContents(TabContents* source) {}
|
| + virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
|
| + virtual bool IsPopup(TabContents* source) { return false; }
|
| + virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) {}
|
| + virtual void URLStarredChanged(TabContents* source, bool starred) {}
|
| + virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}
|
| +
|
| + private:
|
| + MainMenu* menu_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TabContentsDelegateImpl);
|
| + };
|
| +
|
| + friend class TabContentsDelegateImpl;
|
| +
|
| explicit MainMenu(Browser* browser);
|
| - ~MainMenu();
|
|
|
| void ShowImpl();
|
|
|
| + // Does cleanup before deletion. If |now| is true delete is invoked
|
| + // immediately, otherwise deletion occurs after a delay. See description
|
| + // above class as to why we need to delay deletion in some situations.
|
| + void Delete(bool now);
|
| +
|
| // Callback from button presses on the render widget host view. Clicks
|
| // outside the widget resulting in closing the menu.
|
| static gboolean CallButtonPressEvent(GtkWidget* widget,
|
| GdkEventButton* event,
|
| - MainMenu* menu) {
|
| - return menu->OnButtonPressEvent(widget, event);
|
| - }
|
| + MainMenu* menu);
|
| gboolean OnButtonPressEvent(GtkWidget* widget,
|
| GdkEventButton* event);
|
|
|
| @@ -66,9 +114,6 @@
|
| virtual RenderViewHostDelegate::View* GetViewDelegate() {
|
| return this;
|
| }
|
| - virtual void RequestOpenURL(const GURL& url,
|
| - const GURL& referrer,
|
| - WindowOpenDisposition disposition);
|
|
|
| // RenderViewHostDelegate::View overrides.
|
| virtual void CreateNewWindow(int route_id,
|
| @@ -78,7 +123,7 @@
|
| WindowOpenDisposition disposition,
|
| const gfx::Rect& initial_pos,
|
| bool user_gesture,
|
| - const GURL& creator_url) {}
|
| + const GURL& creator_url);
|
| virtual void ShowCreatedWidget(int route_id,
|
| const gfx::Rect& initial_pos) {}
|
| virtual void ShowContextMenu(const ContextMenuParams& params) {}
|
| @@ -107,10 +152,15 @@
|
| // RenderWidgetHostView from the menu_rvh_.
|
| RenderWidgetHostViewGtk* rwhv_;
|
|
|
| - // If the user clicks an item in the menu a child RenderViewHost is opened.
|
| - // This is that child.
|
| - RenderViewHost* child_rvh_;
|
| + // Handles creating the child TabContents.
|
| + RenderViewHostDelegateViewHelper helper_;
|
|
|
| + // Delegate of the TabContents created by helper_.
|
| + TabContentsDelegateImpl tab_contents_delegate_;
|
| +
|
| + // TabContents created when the user clicks a link.
|
| + scoped_ptr<TabContents> pending_contents_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MainMenu);
|
| };
|
|
|
|
|