summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/renderer_host')
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc5
-rw-r--r--chrome/browser/renderer_host/render_view_host.h6
-rw-r--r--chrome/browser/renderer_host/render_view_host_delegate.h7
-rw-r--r--chrome/browser/renderer_host/render_widget_helper.cc8
-rw-r--r--chrome/browser/renderer_host/render_widget_helper.h9
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view.h15
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc12
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.h3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.cc12
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.h3
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.cc4
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.h5
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,