diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/render_view_host.cc | 44 | ||||
-rw-r--r-- | chrome/browser/render_view_host.h | 7 | ||||
-rw-r--r-- | chrome/browser/render_view_host_delegate.h | 5 | ||||
-rw-r--r-- | chrome/browser/render_widget_helper.cc | 6 | ||||
-rw-r--r-- | chrome/browser/render_widget_helper.h | 2 | ||||
-rw-r--r-- | chrome/browser/render_widget_host_view_win.cc | 9 | ||||
-rw-r--r-- | chrome/browser/render_widget_host_view_win.h | 8 | ||||
-rw-r--r-- | chrome/browser/resource_message_filter.cc | 6 | ||||
-rw-r--r-- | chrome/browser/resource_message_filter.h | 2 | ||||
-rw-r--r-- | chrome/browser/web_contents_view.cc | 6 | ||||
-rw-r--r-- | chrome/browser/web_contents_view.h | 6 | ||||
-rw-r--r-- | chrome/browser/web_contents_view_win.cc | 7 | ||||
-rw-r--r-- | chrome/browser/web_contents_view_win.h | 3 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 23 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 36 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 17 | ||||
-rw-r--r-- | chrome/renderer/render_widget.cc | 14 | ||||
-rw-r--r-- | chrome/renderer/render_widget.h | 9 | ||||
-rw-r--r-- | chrome/renderer/render_widget_unittest.cc | 6 |
19 files changed, 176 insertions, 40 deletions
diff --git a/chrome/browser/render_view_host.cc b/chrome/browser/render_view_host.cc index 08addb5..963acc9 100644 --- a/chrome/browser/render_view_host.cc +++ b/chrome/browser/render_view_host.cc @@ -680,6 +680,8 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK); IPC_MESSAGE_HANDLER(ViewHostMsg_UnloadListenerChanged, OnUnloadListenerChanged); + IPC_MESSAGE_HANDLER(ViewHostMsg_QueryFormFieldAutofill, + OnQueryFormFieldAutofill) // Have the super handle all other messages. IPC_MESSAGE_UNHANDLED(RenderWidgetHost::OnMessageReceived(msg)) IPC_END_MESSAGE_MAP_EX() @@ -709,10 +711,11 @@ void RenderViewHost::OnMsgCreateWindow(int route_id, view->CreateNewWindow(route_id, modal_dialog_event); } -void RenderViewHost::OnMsgCreateWidget(int route_id) { +void RenderViewHost::OnMsgCreateWidget(int route_id, + bool focus_on_show) { RenderViewHostDelegate::View* view = delegate_->GetViewDelegate(); if (view) - view->CreateNewWidget(route_id); + view->CreateNewWidget(route_id, focus_on_show); } void RenderViewHost::OnMsgShowView(int route_id, @@ -1203,6 +1206,43 @@ void RenderViewHost::OnUnloadListenerChanged(bool has_listener) { has_unload_listener_ = has_listener; } +void RenderViewHost::OnQueryFormFieldAutofill(const std::wstring& field_name, + const std::wstring& user_text, + int64 node_id, + int request_id) { + // TODO(jcampan): this is where the suggestions should be queried from the + // database. The sample code commented below is left here in the meantime for + // testing purpose. +#ifndef TEST_AUTOFILL + static std::vector<std::wstring>* suggestions = NULL; + if (!suggestions) { + suggestions = new std::vector<std::wstring>(); + suggestions->push_back(L"Alice"); + suggestions->push_back(L"Jay"); + suggestions->push_back(L"Jason"); + suggestions->push_back(L"Jasmine"); + suggestions->push_back(L"Jamel"); + suggestions->push_back(L"Jamelo"); + suggestions->push_back(L"Volvo"); + suggestions->push_back(L"Volswagen"); + } + + + std::vector<std::wstring> result; + for (std::vector<std::wstring>::iterator iter = suggestions->begin(); + iter != suggestions->end(); ++iter) { + if (StartsWith(*iter, user_text, false)) + result.push_back(*iter); + } + Send(new ViewMsg_AutofillSuggestions(routing_id_, + node_id, request_id, result, 0)); +#else + Send(new ViewMsg_AutofillSuggestions(routing_id_, + node_id, request_id, + std::vector<std::wstring>(), 0)); +#endif +} + void RenderViewHost::NotifyRendererUnresponsive() { if (is_waiting_for_unload_ack_ && !Singleton<CrossSiteRequestManager>()->HasPendingCrossSiteRequest( diff --git a/chrome/browser/render_view_host.h b/chrome/browser/render_view_host.h index e387171..551c5b8 100644 --- a/chrome/browser/render_view_host.h +++ b/chrome/browser/render_view_host.h @@ -393,7 +393,7 @@ class RenderViewHost : public RenderWidgetHost { // IPC message handlers: void OnMsgCreateWindow(int route_id, HANDLE modal_dialog_event); - void OnMsgCreateWidget(int route_id); + void OnMsgCreateWidget(int route_id, bool focus_on_show); void OnMsgShowView(int route_id, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, @@ -491,7 +491,10 @@ class RenderViewHost : public RenderWidgetHost { const webkit_glue::WebApplicationInfo& info); void OnMsgShouldCloseACK(bool proceed); void OnUnloadListenerChanged(bool has_handler); - + void OnQueryFormFieldAutofill(const std::wstring& field_name, + const std::wstring& user_text, + int64 node_id, + int request_id); virtual void NotifyRendererUnresponsive(); virtual void NotifyRendererResponsive(); diff --git a/chrome/browser/render_view_host_delegate.h b/chrome/browser/render_view_host_delegate.h index 44aa1c99..eea3113 100644 --- a/chrome/browser/render_view_host_delegate.h +++ b/chrome/browser/render_view_host_delegate.h @@ -60,7 +60,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. - virtual void CreateNewWidget(int route_id) = 0; + // If |focus_on_show| is true, the focus is given to the widget when shown, + // otherwise the focus is not changed. + virtual void CreateNewWidget(int route_id, + bool focus_on_show) = 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/render_widget_helper.cc b/chrome/browser/render_widget_helper.cc index d6e2bd7..4b87080 100644 --- a/chrome/browser/render_widget_helper.cc +++ b/chrome/browser/render_widget_helper.cc @@ -218,9 +218,11 @@ void RenderWidgetHelper::CreateNewWindow(int opener_id, this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); } -void RenderWidgetHelper::CreateNewWidget(int opener_id, int* route_id) { +void RenderWidgetHelper::CreateNewWidget(int opener_id, + bool focus_on_show, + int* route_id) { *route_id = GetNextRoutingID(); - ViewHostMsg_CreateWidgetWithRoute msg(opener_id, *route_id); + ViewHostMsg_CreateWidgetWithRoute msg(opener_id, *route_id, focus_on_show); ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); } diff --git a/chrome/browser/render_widget_helper.h b/chrome/browser/render_widget_helper.h index 7b6295f..c09462a 100644 --- a/chrome/browser/render_widget_helper.h +++ b/chrome/browser/render_widget_helper.h @@ -113,7 +113,7 @@ class RenderWidgetHelper : void CreateNewWindow(int opener_id, bool user_gesture, int* route_id, HANDLE* modal_dialog_event, HANDLE render_process); - void CreateNewWidget(int opener_id, int* route_id); + void CreateNewWidget(int opener_id, bool focus_on_show, int* route_id); private: // A class used to proxy a paint message. PaintMsgProxy objects are created diff --git a/chrome/browser/render_widget_host_view_win.cc b/chrome/browser/render_widget_host_view_win.cc index 05eb2a2..ab9275a 100644 --- a/chrome/browser/render_widget_host_view_win.cc +++ b/chrome/browser/render_widget_host_view_win.cc @@ -65,10 +65,8 @@ RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( /////////////////////////////////////////////////////////////////////////////// // RenderWidgetHostViewWin, public: -RenderWidgetHostViewWin::RenderWidgetHostViewWin( - RenderWidgetHost* widget) - : RenderWidgetHostView(), - render_widget_host_(widget), +RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) + : render_widget_host_(widget), real_cursor_(LoadCursor(NULL, IDC_ARROW)), real_cursor_type_(WebCursor::ARROW), track_mouse_leave_(false), @@ -79,7 +77,8 @@ RenderWidgetHostViewWin::RenderWidgetHostViewWin( tooltip_showing_(false), shutdown_factory_(this), parent_hwnd_(NULL), - is_loading_(false) { + is_loading_(false), + focus_on_show_(true) { render_widget_host_->set_view(this); renderer_accessible_ = CommandLine().HasSwitch(switches::kEnableRendererAccessibility); diff --git a/chrome/browser/render_widget_host_view_win.h b/chrome/browser/render_widget_host_view_win.h index 348e21c..1d15674 100644 --- a/chrome/browser/render_widget_host_view_win.h +++ b/chrome/browser/render_widget_host_view_win.h @@ -65,6 +65,11 @@ class RenderWidgetHostViewWin : close_on_deactivate_ = close_on_deactivate; } + void set_focus_on_show(bool focus) { + focus_on_show_ = focus; + } + bool focus_on_show() const { return focus_on_show_; } + void set_parent_hwnd(HWND parent) { parent_hwnd_ = parent; } DECLARE_WND_CLASS_EX(kRenderWidgetHostHWNDClass, CS_DBLCLKS, 0); @@ -259,6 +264,9 @@ class RenderWidgetHostViewWin : // value returns true for is_null() if we are not recording whiteout times. base::TimeTicks whiteout_start_time_; + // Whether the window should get focus when shown. Default is true. + bool focus_on_show_; + // Whether the renderer is made accessible. // TODO(jcampan): http://b/issue?id=1432077 This is a temporary work-around // until that bug is fixed. diff --git a/chrome/browser/resource_message_filter.cc b/chrome/browser/resource_message_filter.cc index 2e25e92..24eb964 100644 --- a/chrome/browser/resource_message_filter.cc +++ b/chrome/browser/resource_message_filter.cc @@ -234,8 +234,10 @@ void ResourceMessageFilter::OnMsgCreateWindow(int opener_id, modal_dialog_event, render_handle_); } -void ResourceMessageFilter::OnMsgCreateWidget(int opener_id, int* route_id) { - render_widget_helper_->CreateNewWidget(opener_id, route_id); +void ResourceMessageFilter::OnMsgCreateWidget(int opener_id, + bool focus_on_show, + int* route_id) { + render_widget_helper_->CreateNewWidget(opener_id, focus_on_show, route_id); } void ResourceMessageFilter::OnRequestResource( diff --git a/chrome/browser/resource_message_filter.h b/chrome/browser/resource_message_filter.h index 7dd3513..1b068e4 100644 --- a/chrome/browser/resource_message_filter.h +++ b/chrome/browser/resource_message_filter.h @@ -77,7 +77,7 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, private: void OnMsgCreateWindow(int opener_id, bool user_gesture, int* route_id, HANDLE* modal_dialog_event); - void OnMsgCreateWidget(int opener_id, int* route_id); + void OnMsgCreateWidget(int opener_id, bool focus_on_show, int* route_id); void OnRequestResource(const IPC::Message& msg, int request_id, const ViewHostMsg_Resource_Request& request); void OnCancelRequest(int request_id); diff --git a/chrome/browser/web_contents_view.cc b/chrome/browser/web_contents_view.cc index 28dd88b..931e36c 100644 --- a/chrome/browser/web_contents_view.cc +++ b/chrome/browser/web_contents_view.cc @@ -10,9 +10,11 @@ void WebContentsView::CreateNewWindow(int route_id, HANDLE modal_dialog_event) { modal_dialog_event); } -void WebContentsView::CreateNewWidget(int route_id) { +void WebContentsView::CreateNewWidget(int route_id, + bool focus_on_show) { // Save the created widget associated with the route so we can show it later. - pending_widget_views_[route_id] = CreateNewWidgetInternal(route_id); + pending_widget_views_[route_id] = CreateNewWidgetInternal(route_id, + focus_on_show); } void WebContentsView::ShowCreatedWindow(int route_id, diff --git a/chrome/browser/web_contents_view.h b/chrome/browser/web_contents_view.h index 6ebf84c..e6b24c2 100644 --- a/chrome/browser/web_contents_view.h +++ b/chrome/browser/web_contents_view.h @@ -172,7 +172,8 @@ class WebContentsView : public RenderViewHostDelegate::View { // the Show functions rather than the route ID. virtual WebContents* CreateNewWindowInternal(int route_id, HANDLE modal_dialog_event) = 0; - virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id) = 0; + virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id, + bool focus_on_show) = 0; virtual void ShowCreatedWindowInternal(WebContents* new_web_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, @@ -185,7 +186,8 @@ class WebContentsView : public RenderViewHostDelegate::View { // do some book-keeping associated with the request. The request is then // forwarded to *Internal which does platform-specific work. virtual void CreateNewWindow(int route_id, HANDLE modal_dialog_event); - virtual void CreateNewWidget(int route_id); + virtual void CreateNewWidget(int route_id, + bool focus_on_show); virtual void ShowCreatedWindow(int route_id, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, diff --git a/chrome/browser/web_contents_view_win.cc b/chrome/browser/web_contents_view_win.cc index 082fb89..3ba7173 100644 --- a/chrome/browser/web_contents_view_win.cc +++ b/chrome/browser/web_contents_view_win.cc @@ -378,7 +378,8 @@ WebContents* WebContentsViewWin::CreateNewWindowInternal( } RenderWidgetHostView* WebContentsViewWin::CreateNewWidgetInternal( - int route_id) { + int route_id, + bool focus_on_show) { // Create the widget and its associated view. // TODO(brettw) can widget creation be cross-platform? RenderWidgetHost* widget_host = @@ -394,6 +395,7 @@ RenderWidgetHostView* WebContentsViewWin::CreateNewWidgetInternal( widget_view->set_parent_hwnd( web_contents_->render_widget_host_view()->GetPluginHWND()); widget_view->set_close_on_deactivate(true); + widget_view->set_focus_on_show(focus_on_show); return widget_view; } @@ -438,7 +440,8 @@ void WebContentsViewWin::ShowCreatedWidgetInternal( widget_host_view_win->MoveWindow(initial_pos.x(), initial_pos.y(), initial_pos.width(), initial_pos.height(), TRUE); - widget_host_view_win->ShowWindow(SW_SHOW); + widget_host_view_win->ShowWindow(widget_host_view_win->focus_on_show() ? + SW_SHOW : SW_SHOWNOACTIVATE); widget_host->Init(); } diff --git a/chrome/browser/web_contents_view_win.h b/chrome/browser/web_contents_view_win.h index d1ea193..ca03829 100644 --- a/chrome/browser/web_contents_view_win.h +++ b/chrome/browser/web_contents_view_win.h @@ -56,7 +56,8 @@ class WebContentsViewWin : public WebContentsView, // Backend implementation of RenderViewHostDelegate::View. virtual WebContents* CreateNewWindowInternal( int route_id, HANDLE modal_dialog_event); - virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id); + virtual RenderWidgetHostView* CreateNewWidgetInternal(int route_id, + bool focus_on_show); virtual void ShowCreatedWindowInternal(WebContents* new_web_contents, WindowOpenDisposition disposition, const gfx::Rect& initial_pos, diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index ea97bc7..4e7e3dc 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -462,6 +462,14 @@ IPC_BEGIN_MESSAGES(View, 1) // into a full window). IPC_MESSAGE_ROUTED0(ViewMsg_DisassociateFromPopupCount) + // Reply to the ViewHostMsg_QueryFormFieldAutofill message with the autofill + // suggestions. + IPC_MESSAGE_ROUTED4(ViewMsg_AutofillSuggestions, + int64 /* id of the text input field */, + int /* id of the request message */, + std::vector<std::wstring> /* suggestions */, + int /* index of default suggestion */) + IPC_END_MESSAGES(View) @@ -483,8 +491,9 @@ IPC_BEGIN_MESSAGES(ViewHost, 2) // Similar to ViewHostMsg_CreateView, except used for sub-widgets, like // <select> dropdowns. This message is sent to the WebContents that // contains the widget being created. - IPC_SYNC_MESSAGE_CONTROL1_1(ViewHostMsg_CreateWidget, + IPC_SYNC_MESSAGE_CONTROL2_1(ViewHostMsg_CreateWidget, int /* opener_id */, + bool /* focus on show */, int /* route_id */) // These two messages are sent as a result of the above two, in the browser @@ -493,8 +502,9 @@ IPC_BEGIN_MESSAGES(ViewHost, 2) int /* route_id */, HANDLE /* modal_dialog_event */) - IPC_MESSAGE_ROUTED1(ViewHostMsg_CreateWidgetWithRoute, - int /* route_id */) + IPC_MESSAGE_ROUTED2(ViewHostMsg_CreateWidgetWithRoute, + int /* route_id */, + bool /* focus on show */) // These two messages are sent to the parent RenderViewHost to display the // page/widget that was created by CreateView/CreateWidget. routing_id @@ -1061,4 +1071,11 @@ IPC_BEGIN_MESSAGES(ViewHost, 2) HWND /* window */, gfx::Rect /* Out: Window location */) + // Queries the browser for suggestion for autofill in a form input field. + IPC_MESSAGE_ROUTED4(ViewHostMsg_QueryFormFieldAutofill, + std::wstring /* field name */, + std::wstring /* user entered text */, + int64 /* id of the text input field */, + int /* id of this message */) + IPC_END_MESSAGES(ViewHost) diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 7cebc16..cbae9d0 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -142,7 +142,7 @@ class RenderViewExtraRequestData : public WebRequest::ExtraData { /////////////////////////////////////////////////////////////////////////////// RenderView::RenderView() - : RenderWidget(RenderThread::current()), + : RenderWidget(RenderThread::current(), true), is_loading_(false), page_id_(-1), last_page_id_sent_to_browser_(-1), @@ -161,7 +161,8 @@ RenderView::RenderView() has_unload_listener_(false), decrement_shared_popup_at_destruction_(false), greasemonkey_enabled_(false), - waiting_for_create_window_ack_(false) { + waiting_for_create_window_ack_(false), + form_field_autofill_request_id_(0) { resource_dispatcher_ = new ResourceDispatcher(this); #ifdef CHROME_PERSONALIZATION personalization_ = Personalization::CreateRendererPersonalization(); @@ -384,6 +385,8 @@ void RenderView::OnMessageReceived(const IPC::Message& message) { OnMessageFromExternalHost) IPC_MESSAGE_HANDLER(ViewMsg_DisassociateFromPopupCount, OnDisassociateFromPopupCount) + IPC_MESSAGE_HANDLER(ViewMsg_AutofillSuggestions, + OnReceivedAutofillSuggestions) // Have the super handle all other messages. IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message)) IPC_END_MESSAGE_MAP() @@ -1664,6 +1667,29 @@ void RenderView::OnUnloadListenerChanged(WebView* webview, WebFrame* webframe) { } } +void RenderView::QueryFormFieldAutofill(const std::wstring& field_name, + const std::wstring& text, + int64 node_id) { + static int message_id_counter = 0; + form_field_autofill_request_id_ = message_id_counter++; + Send(new ViewHostMsg_QueryFormFieldAutofill(routing_id_, + field_name, text, + node_id, + form_field_autofill_request_id_)); +} + +void RenderView::OnReceivedAutofillSuggestions( + int64 node_id, + int request_id, + const std::vector<std::wstring> suggestions, + int default_suggestion_index) { + if (!webview() || request_id != form_field_autofill_request_id_) + return; + + webview()->AutofillSuggestionsForNode(node_id, suggestions, + default_suggestion_index); +} + void RenderView::ShowModalHTMLDialog(const GURL& url, int width, int height, const std::string& json_arguments, std::string* json_retval) { @@ -1762,9 +1788,11 @@ WebView* RenderView::CreateWebView(WebView* webview, bool user_gesture) { return view->webview(); } -WebWidget* RenderView::CreatePopupWidget(WebView* webview) { +WebWidget* RenderView::CreatePopupWidget(WebView* webview, + bool focus_on_show) { RenderWidget* widget = RenderWidget::Create(routing_id_, - RenderThread::current()); + RenderThread::current(), + focus_on_show); return widget->webwidget(); } diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index eee08e1..8484afd 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -127,6 +127,9 @@ class RenderView : public RenderWidget, public WebViewDelegate, virtual bool RunBeforeUnloadConfirm(WebView* webview, const std::wstring& message); virtual void OnUnloadListenerChanged(WebView* webview, WebFrame* webframe); + virtual void QueryFormFieldAutofill(const std::wstring& field_name, + const std::wstring& text, + int64 node_id); virtual void UpdateTargetURL(WebView* webview, const GURL& url); virtual void RunFileChooser(const std::wstring& default_filename, @@ -197,7 +200,8 @@ class RenderView : public RenderWidget, public WebViewDelegate, bool is_redirect); virtual WebView* CreateWebView(WebView* webview, bool user_gesture); - virtual WebWidget* CreatePopupWidget(WebView* webview); + virtual WebWidget* CreatePopupWidget(WebView* webview, + bool focus_on_show); virtual WebPluginDelegate* CreatePluginDelegate( WebView* webview, const GURL& url, @@ -457,6 +461,13 @@ class RenderView : public RenderWidget, public WebViewDelegate, // Notification about ui theme changes. void OnThemeChanged(); + // Notification that we have received autofill suggestion. + void OnReceivedAutofillSuggestions( + int64 node_id, + int request_id, + const std::vector<std::wstring> suggestions, + int default_suggestion_index); + #ifdef CHROME_PERSONALIZATION void OnPersonalizationEvent(std::string event_name, std::string event_args); #endif @@ -673,6 +684,10 @@ class RenderView : public RenderWidget, public WebViewDelegate, // Set if we are waiting for an ack for ViewHostMsg_CreateWindow bool waiting_for_create_window_ack_; + // The id of the last request sent for form field autofill. Used to ignore + // out of date responses. + int form_field_autofill_request_id_; + // A cached WebHistoryItem used for back/forward navigations initiated by // WebCore (via the window.history.go API). We only have one such navigation // pending at a time. diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index 874768b..c8d3070 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -69,7 +69,8 @@ DeferredCloses* DeferredCloses::current_ = NULL; /////////////////////////////////////////////////////////////////////////////// -RenderWidget::RenderWidget(RenderThreadBase* render_thread) +RenderWidget::RenderWidget(RenderThreadBase* render_thread, + bool focus_on_show) : routing_id_(MSG_ROUTING_NONE), opener_id_(MSG_ROUTING_NONE), render_thread_(render_thread), @@ -88,7 +89,8 @@ RenderWidget::RenderWidget(RenderThreadBase* render_thread) ime_control_x_(-1), ime_control_y_(-1), ime_control_new_state_(false), - ime_control_updated_(false) { + ime_control_updated_(false), + focus_on_show_(focus_on_show) { RenderProcess::AddRefProcess(); DCHECK(render_thread_); } @@ -107,9 +109,11 @@ RenderWidget::~RenderWidget() { /*static*/ RenderWidget* RenderWidget::Create(int32 opener_id, - RenderThreadBase* render_thread) { + RenderThreadBase* render_thread, + bool focus_on_show) { DCHECK(opener_id != MSG_ROUTING_NONE); - scoped_refptr<RenderWidget> widget = new RenderWidget(render_thread); + scoped_refptr<RenderWidget> widget = new RenderWidget(render_thread, + focus_on_show); widget->Init(opener_id); // adds reference return widget; } @@ -125,7 +129,7 @@ void RenderWidget::Init(int32 opener_id) { webwidget_.swap(&webwidget); bool result = render_thread_->Send( - new ViewHostMsg_CreateWidget(opener_id, &routing_id_)); + new ViewHostMsg_CreateWidget(opener_id, focus_on_show_, &routing_id_)); if (result) { render_thread_->AddRoute(routing_id_, this); // Take a reference on behalf of the RenderThread. This will be balanced diff --git a/chrome/renderer/render_widget.h b/chrome/renderer/render_widget.h index 98d0377..f597dff 100644 --- a/chrome/renderer/render_widget.h +++ b/chrome/renderer/render_widget.h @@ -30,7 +30,9 @@ class RenderWidget : public IPC::Channel::Listener, // Creates a new RenderWidget. The opener_id is the routing ID of the // RenderView that this widget lives inside. The render_thread is any // RenderThreadBase implementation, mostly commonly RenderThread::current(). - static RenderWidget* Create(int32 opener_id, RenderThreadBase* render_thread); + static RenderWidget* Create(int32 opener_id, + RenderThreadBase* render_thread, + bool focus_on_show); // The routing ID assigned by the RenderProcess. Will be MSG_ROUTING_NONE if // not yet assigned a view ID, in which case, the process MUST NOT send @@ -86,7 +88,7 @@ class RenderWidget : public IPC::Channel::Listener, // without ref-counting is an error. friend class base::RefCounted<RenderWidget>; - RenderWidget(RenderThreadBase* render_thread); + RenderWidget(RenderThreadBase* render_thread, bool focus_on_show); virtual ~RenderWidget(); // Initializes this view with the given opener. CompleteInit must be called @@ -261,6 +263,9 @@ class RenderWidget : public IPC::Channel::Listener, bool ime_control_new_state_; bool ime_control_updated_; + // Whether the window for this RenderWidget should be focused when shown. + bool focus_on_show_; + // Holds all the needed plugin window moves for a scroll. std::vector<WebPluginGeometry> plugin_window_moves_; diff --git a/chrome/renderer/render_widget_unittest.cc b/chrome/renderer/render_widget_unittest.cc index 086f8bf..f280aa7 100644 --- a/chrome/renderer/render_widget_unittest.cc +++ b/chrome/renderer/render_widget_unittest.cc @@ -114,7 +114,9 @@ class MockRenderThread : public RenderThreadBase { } // The Widget expects to be returned valid route_id. - void OnMsgCreateWidget(int opener_id, int* route_id) { + void OnMsgCreateWidget(int opener_id, + bool focus_on_show, + int* route_id) { opener_id_ = opener_id; *route_id = routing_id_; } @@ -141,7 +143,7 @@ TEST(RenderWidgetTest, CreateAndCloseWidget) { { scoped_refptr<RenderWidget> rw = - RenderWidget::Create(kOpenerId, &render_thread); + RenderWidget::Create(kOpenerId, &render_thread, true); ASSERT_TRUE(rw != NULL); // After the RenderWidget it must have sent a message to the render thread |