Index: chrome/browser/chromeos/main_menu.cc |
=================================================================== |
--- chrome/browser/chromeos/main_menu.cc (revision 27065) |
+++ chrome/browser/chromeos/main_menu.cc (working copy) |
@@ -5,12 +5,14 @@ |
#include "chrome/browser/chromeos/main_menu.h" |
#include "app/resource_bundle.h" |
+#include "base/message_loop.h" |
#include "chrome/browser/browser.h" |
#include "chrome/browser/renderer_host/render_view_host.h" |
#include "chrome/browser/renderer_host/render_view_host_factory.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/tab_contents/tab_contents.h" |
#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" |
#include "grit/app_resources.h" |
#include "grit/generated_resources.h" |
@@ -31,23 +33,20 @@ |
(new MainMenu(browser))->ShowImpl(); |
} |
+MainMenu::~MainMenu() { |
+ popup_->Close(); |
+ menu_rvh_->Shutdown(); |
+} |
+ |
MainMenu::MainMenu(Browser* browser) |
: browser_(browser), |
popup_(NULL), |
site_instance_(NULL), |
menu_rvh_(NULL), |
rwhv_(NULL), |
- child_rvh_(NULL) { |
+ ALLOW_THIS_IN_INITIALIZER_LIST(tab_contents_delegate_(this)) { |
} |
-MainMenu::~MainMenu() { |
- gdk_pointer_ungrab(GDK_CURRENT_TIME); |
- popup_->Close(); |
- menu_rvh_->Shutdown(); |
- if (child_rvh_) |
- child_rvh_->Shutdown(); |
-} |
- |
void MainMenu::ShowImpl() { |
SkBitmap* drop_down_image = ResourceBundle::GetSharedInstance(). |
GetBitmapNamed(IDR_MAIN_MENU_BUTTON_DROP_DOWN); |
@@ -84,14 +83,35 @@ |
g_signal_connect(rwhv_widget, "button-press-event", |
G_CALLBACK(CallButtonPressEvent), this); |
// Do a mouse grab on the renderer widget host view's widget so that we can |
- // close the popup if the user clicks anywhere else. |
+ // close the popup if the user clicks anywhere else. And do a keyboard |
+ // grab so that we get all key events. |
gdk_pointer_grab(rwhv_widget->window, FALSE, |
static_cast<GdkEventMask>( |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | |
GDK_POINTER_MOTION_MASK), |
NULL, NULL, GDK_CURRENT_TIME); |
+ gdk_keyboard_grab(rwhv_widget->window, FALSE, GDK_CURRENT_TIME); |
} |
+void MainMenu::Delete(bool now) { |
+ gdk_keyboard_ungrab(GDK_CURRENT_TIME); |
+ gdk_pointer_ungrab(GDK_CURRENT_TIME); |
+ // Hide the popup immediately. We don't close it as it contains the |
+ // renderwidgethostview, which hasn't been shutdown yet. |
+ popup_->Hide(); |
+ if (now) |
+ delete this; |
+ else |
+ MessageLoop::current()->DeleteSoon(FROM_HERE, this); |
+} |
+ |
+// static |
+gboolean MainMenu::CallButtonPressEvent(GtkWidget* widget, |
+ GdkEventButton* event, |
+ MainMenu* menu) { |
+ return menu->OnButtonPressEvent(widget, event); |
+} |
+ |
gboolean MainMenu::OnButtonPressEvent(GtkWidget* widget, |
GdkEventButton* event) { |
if (event->x < 0 || event->y < 0 || |
@@ -99,27 +119,46 @@ |
event->y >= widget->allocation.height) { |
// The user clicked outside the bounds of the menu, delete the main which |
// results in closing it. |
- delete this; |
+ Delete(true); |
} |
return FALSE; |
} |
-void MainMenu::RequestOpenURL(const GURL& url, |
- const GURL& referrer, |
- WindowOpenDisposition disposition) { |
- browser_->OpenURL(url, referrer, NEW_FOREGROUND_TAB, PageTransition::LINK); |
- delete this; |
-} |
- |
void MainMenu::CreateNewWindow(int route_id, |
base::WaitableEvent* modal_dialog_event) { |
- if (child_rvh_) { |
- // We should never get here. If we do, it indicates a child render view |
- // host was created and we didn't get a subsequent RequestOpenURL. |
+ if (pending_contents_.get()) { |
NOTREACHED(); |
return; |
} |
- DCHECK(!child_rvh_); |
- child_rvh_ = RenderViewHostFactory::Create( |
- site_instance_, this, route_id, modal_dialog_event); |
+ |
+ helper_.CreateNewWindow(route_id, modal_dialog_event, browser_->profile(), |
+ site_instance_, |
+ DOMUIFactory::GetDOMUIType(GURL(kMenuURL))); |
+ pending_contents_.reset(helper_.GetCreatedWindow(route_id)); |
+ pending_contents_->set_delegate(&tab_contents_delegate_); |
} |
+ |
+void MainMenu::ShowCreatedWindow(int route_id, |
+ WindowOpenDisposition disposition, |
+ const gfx::Rect& initial_pos, |
+ bool user_gesture, |
+ const GURL& creator_url) { |
+ if (disposition == NEW_POPUP) { |
+ pending_contents_->set_delegate(NULL); |
+ browser_->GetSelectedTabContents()->AddNewContents( |
+ pending_contents_.release(), disposition, initial_pos, user_gesture, |
+ creator_url); |
+ Delete(false); |
+ } |
+} |
+ |
+void MainMenu::TabContentsDelegateImpl::OpenURLFromTab( |
+ TabContents* source, |
+ const GURL& url, |
+ const GURL& referrer, |
+ WindowOpenDisposition disposition, |
+ PageTransition::Type transition) { |
+ menu_->browser_->OpenURL(url, referrer, NEW_FOREGROUND_TAB, |
+ PageTransition::LINK); |
+ menu_->Delete(true); |
+} |