diff options
Diffstat (limited to 'chrome/browser/renderer_host')
13 files changed, 63 insertions, 29 deletions
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 3697719..0dfd106 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -860,10 +860,11 @@ void RenderViewHost::CreateNewWindow(int route_id) { view->CreateNewWindow(route_id); } -void RenderViewHost::CreateNewWidget(int route_id, bool activatable) { +void RenderViewHost::CreateNewWidget(int route_id, + WebKit::WebPopupType popup_type) { RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); if (view) - view->CreateNewWidget(route_id, activatable); + view->CreateNewWidget(route_id, popup_type); } void RenderViewHost::OnMsgShowView(int route_id, diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index 48300d9..37b9c46 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -18,6 +18,7 @@ #include "net/base/load_states.h" #include "third_party/WebKit/WebKit/chromium/public/WebConsoleMessage.h" #include "third_party/WebKit/WebKit/chromium/public/WebDragOperation.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h" #include "third_party/WebKit/WebKit/chromium/public/WebTextDirection.h" #include "webkit/glue/password_form_dom_manager.h" #include "webkit/glue/window_open_disposition.h" @@ -419,8 +420,9 @@ class RenderViewHost : public RenderWidgetHost { // Creates a new RenderView with the given route id. void CreateNewWindow(int route_id); - // Creates a new RenderWidget with the given route id. - void CreateNewWidget(int route_id, bool activatable); + // Creates a new RenderWidget with the given route id. |popup_type| indicates + // if this widget is a popup and what kind of popup it is (select, autofill). + void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type); // Sends the response to an extension api call. void SendExtensionResponse(int request_id, bool success, diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h index f522a6dc..829ee9e 100644 --- a/chrome/browser/renderer_host/render_view_host_delegate.h +++ b/chrome/browser/renderer_host/render_view_host_delegate.h @@ -15,6 +15,7 @@ #include "chrome/common/view_types.h" #include "net/base/load_states.h" #include "third_party/WebKit/WebKit/chromium/public/WebDragOperation.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h" #include "webkit/glue/window_open_disposition.h" @@ -97,8 +98,10 @@ class RenderViewHostDelegate { // The page is trying to open a new widget (e.g. a select popup). The // widget should be created associated with the given route, but it should // not be shown yet. That should happen in response to ShowCreatedWidget. - // If |activatable| is false, the widget cannot be activated or get focus. - virtual void CreateNewWidget(int route_id, bool activatable) = 0; + // |popup_type| indicates if the widget is a popup and what kind of popup it + // is (select, autofill...). + virtual void CreateNewWidget(int route_id, + WebKit::WebPopupType popup_type) = 0; // Show a previously created page with the specified disposition and bounds. // The window is identified by the route_id passed to CreateNewWindow. diff --git a/chrome/browser/renderer_host/render_widget_helper.cc b/chrome/browser/renderer_host/render_widget_helper.cc index dffc9c5..a6fbd5c 100644 --- a/chrome/browser/renderer_host/render_widget_helper.cc +++ b/chrome/browser/renderer_host/render_widget_helper.cc @@ -232,21 +232,21 @@ void RenderWidgetHelper::OnCreateWindowOnIO(int route_id) { } void RenderWidgetHelper::CreateNewWidget(int opener_id, - bool activatable, + WebKit::WebPopupType popup_type, int* route_id) { *route_id = GetNextRoutingID(); ChromeThread::PostTask( ChromeThread::UI, FROM_HERE, NewRunnableMethod( this, &RenderWidgetHelper::OnCreateWidgetOnUI, opener_id, *route_id, - activatable)); + popup_type)); } void RenderWidgetHelper::OnCreateWidgetOnUI( - int opener_id, int route_id, bool activatable) { + int opener_id, int route_id, WebKit::WebPopupType popup_type) { RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); if (host) - host->CreateNewWidget(route_id, activatable); + host->CreateNewWidget(route_id, popup_type); } #if defined(OS_MACOSX) diff --git a/chrome/browser/renderer_host/render_widget_helper.h b/chrome/browser/renderer_host/render_widget_helper.h index 1fa5973..728bb7c 100644 --- a/chrome/browser/renderer_host/render_widget_helper.h +++ b/chrome/browser/renderer_host/render_widget_helper.h @@ -14,6 +14,7 @@ #include "base/ref_counted.h" #include "base/lock.h" #include "base/waitable_event.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h" namespace IPC { class Message; @@ -122,7 +123,9 @@ class RenderWidgetHelper bool user_gesture, base::ProcessHandle render_process, int* route_id); - void CreateNewWidget(int opener_id, bool activatable, int* route_id); + void CreateNewWidget(int opener_id, + WebKit::WebPopupType popup_type, + int* route_id); #if defined(OS_MACOSX) // Called on the IO thread to handle the allocation of a transport DIB @@ -158,7 +161,9 @@ class RenderWidgetHelper void OnCreateWindowOnIO(int route_id); // Called on the UI thread to finish creating a widget. - void OnCreateWidgetOnUI(int opener_id, int route_id, bool activatable); + void OnCreateWidgetOnUI(int opener_id, + int route_id, + WebKit::WebPopupType popup_type); // Called on the IO thread to cancel resource requests for the render widget. void OnCancelResourceRequests(int render_widget_id); diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h index 625f098..7b516ed 100644 --- a/chrome/browser/renderer_host/render_widget_host_view.h +++ b/chrome/browser/renderer_host/render_widget_host_view.h @@ -13,6 +13,7 @@ #include "base/shared_memory.h" #include "gfx/native_widget_types.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h" #include "webkit/glue/plugins/webplugin.h" namespace gfx { @@ -217,10 +218,10 @@ class RenderWidgetHostView { // constrained window is showing. virtual void SetVisuallyDeemphasized(bool deemphasized) = 0; - void set_activatable(bool activatable) { - activatable_ = activatable; + void set_popup_type(WebKit::WebPopupType popup_type) { + popup_type_ = popup_type; } - bool activatable() const { return activatable_; } + WebKit::WebPopupType popup_type() const { return popup_type_; } // Subclasses should override this method to do whatever is appropriate to set // the custom background for their platform. @@ -235,11 +236,11 @@ class RenderWidgetHostView { protected: // Interface class only, do not construct. - RenderWidgetHostView() : activatable_(true) {} + RenderWidgetHostView() : popup_type_(WebKit::WebPopupTypeNone) {} - // Whether the window can be activated. Autocomplete popup windows for example - // cannot be activated. Default is true. - bool activatable_; + // Whether this view is a popup and what kind of popup it is (select, + // autofill...). + WebKit::WebPopupType popup_type_; // A custom background to paint behind the web content. This will be tiled // horizontally. Can be null, in which case we fall back to painting white. diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc index 966c643..874fb29 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc @@ -121,7 +121,7 @@ class RenderWidgetHostViewGtkWidget { static gboolean KeyPressReleaseEvent(GtkWidget* widget, GdkEventKey* event, RenderWidgetHostViewGtk* host_view) { - if (host_view->parent_ && host_view->activatable() && + if (host_view->parent_ && host_view->IsActivatable() && GDK_Escape == event->keyval) { // Force popups to close on Esc just in case the renderer is hung. This // allows us to release our keyboard grab. @@ -368,7 +368,7 @@ void RenderWidgetHostViewGtk::InitAsPopup( // If we are not activatable, we don't want to grab keyboard input, // and webkit will manage our destruction. - if (activatable()) { + if (IsActivatable()) { // Grab all input for the app. If a click lands outside the bounds of the // popup, WebKit will notice and destroy us. Before doing this we need // to ensure that the the popup is added to the browser's window group, @@ -570,7 +570,7 @@ void RenderWidgetHostViewGtk::Destroy() { // If |parent_| is non-null, we are a popup and we must disconnect from our // parent and destroy the popup window. if (parent_) { - if (activatable()) { + if (IsActivatable()) { GdkDisplay *display = gtk_widget_get_display(parent_); gdk_display_pointer_ungrab(display, GDK_CURRENT_TIME); gdk_display_keyboard_ungrab(display, GDK_CURRENT_TIME); @@ -624,6 +624,12 @@ void RenderWidgetHostViewGtk::AppendInputMethodsContextMenu(MenuGtk* menu) { im_context_->AppendInputMethodsContextMenu(menu); } +bool RenderWidgetHostViewGtk::IsActivatable() { + // Popups should not be activated. + // TODO(estade): fix focus issue with select. + return popup_type_ == WebKit::WebPopupTypeNone; +} + BackingStore* RenderWidgetHostViewGtk::AllocBackingStore( const gfx::Size& size) { if (enable_gpu_rendering_) { diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.h b/chrome/browser/renderer_host/render_widget_host_view_gtk.h index de6c480..06f8482 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.h +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.h @@ -91,6 +91,9 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView { // submenu. void AppendInputMethodsContextMenu(MenuGtk* menu); + // Returns whether the widget should be activated when shown. + bool IsActivatable(); + private: friend class RenderWidgetHostViewGtkWidget; diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm index 6908baa..741af9b 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm @@ -152,8 +152,9 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { void RenderWidgetHostViewMac::InitAsPopup( RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) { + bool activatable = popup_type_ != WebKit::WebPopupTypeNone; [cocoa_view_ setCloseOnDeactivate:YES]; - [cocoa_view_ setCanBeKeyView:activatable_ ? YES : NO]; + [cocoa_view_ setCanBeKeyView:activatable ? YES : NO]; [parent_host_view->GetNativeView() addSubview:cocoa_view_]; NSPoint global_origin = NSPointFromCGPoint(pos.origin().ToCGPoint()); diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.cc b/chrome/browser/renderer_host/render_widget_host_view_win.cc index d70b674..975609e 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc @@ -316,7 +316,8 @@ void RenderWidgetHostViewWin::InitAsPopup( close_on_deactivate_ = true; Create(parent_hwnd_, NULL, NULL, WS_POPUP, WS_EX_TOOLWINDOW); MoveWindow(pos.x(), pos.y(), pos.width(), pos.height(), TRUE); - ShowWindow(activatable_ ? SW_SHOW : SW_SHOWNA); + // Popups are not activated. + ShowWindow(IsActivatable() ? SW_SHOW : SW_SHOWNA); } RenderWidgetHost* RenderWidgetHostViewWin::GetRenderWidgetHost() const { @@ -498,6 +499,11 @@ HWND RenderWidgetHostViewWin::ReparentWindow(HWND window) { return parent; } +bool RenderWidgetHostViewWin::IsActivatable() const { + // Popups should not be activated. + return popup_type_ == WebKit::WebPopupTypeNone; +} + void RenderWidgetHostViewWin::Focus() { if (IsWindow()) SetFocus(); @@ -1427,7 +1433,7 @@ LRESULT RenderWidgetHostViewWin::OnWheelEvent(UINT message, WPARAM wparam, LRESULT RenderWidgetHostViewWin::OnMouseActivate(UINT, WPARAM, LPARAM, BOOL& handled) { - if (!activatable_) + if (!IsActivatable()) return MA_NOACTIVATE; HWND focus_window = GetFocus(); @@ -1591,7 +1597,7 @@ void RenderWidgetHostViewWin::ForwardMouseEventToRenderer(UINT message, break; } - if (activatable_ && event.type == WebInputEvent::MouseDown) { + if (IsActivatable() && event.type == WebInputEvent::MouseDown) { // This is a temporary workaround for bug 765011 to get focus when the // mouse is clicked. This happens after the mouse down event is sent to // the renderer because normally Windows does a WM_SETFOCUS after diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.h b/chrome/browser/renderer_host/render_widget_host_view_win.h index c140d14..09686ad 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.h +++ b/chrome/browser/renderer_host/render_widget_host_view_win.h @@ -229,6 +229,9 @@ class RenderWidgetHostViewWin // Create an intermediate window between the given HWND and its parent. HWND ReparentWindow(HWND window); + // Whether the window should be activated. + bool IsActivatable() const; + // The associated Model. RenderWidgetHost* render_widget_host_; diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 0657913..951ed86 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -606,9 +606,9 @@ void ResourceMessageFilter::OnMsgCreateWindow( } void ResourceMessageFilter::OnMsgCreateWidget(int opener_id, - bool activatable, + WebKit::WebPopupType popup_type, int* route_id) { - render_widget_helper_->CreateNewWidget(opener_id, activatable, route_id); + render_widget_helper_->CreateNewWidget(opener_id, popup_type, route_id); } void ResourceMessageFilter::OnSetCookie(const IPC::Message& message, diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index 20be786..c673c7c 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -31,6 +31,7 @@ #include "gfx/rect.h" #include "ipc/ipc_channel_proxy.h" #include "third_party/WebKit/WebKit/chromium/public/WebCache.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPopupType.h" class AppCacheDispatcherHost; class AudioRendererHost; @@ -133,7 +134,9 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, void OnMsgCreateWindow(int opener_id, bool user_gesture, int64 session_storage_namespace_id, int* route_id, int64* cloned_session_storage_namespace_id); - void OnMsgCreateWidget(int opener_id, bool activatable, int* route_id); + void OnMsgCreateWidget(int opener_id, + WebKit::WebPopupType popup_type, + int* route_id); void OnSetCookie(const IPC::Message& message, const GURL& url, const GURL& first_party_for_cookies, |