Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4967)

Unified Diff: chrome/renderer/render_view.cc

Issue 6151011: Introduce RenderView::Observer interface so that RenderView doesn't have to k... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/render_view.h ('k') | chrome/renderer/render_view_browsertest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/render_view.cc
===================================================================
--- chrome/renderer/render_view.cc (revision 71253)
+++ chrome/renderer/render_view.cc (working copy)
@@ -78,6 +78,7 @@
#include "chrome/renderer/print_web_view_helper.h"
#include "chrome/renderer/render_process.h"
#include "chrome/renderer/render_thread.h"
+#include "chrome/renderer/render_view_observer.h"
#include "chrome/renderer/render_view_visitor.h"
#include "chrome/renderer/render_widget_fullscreen.h"
#include "chrome/renderer/render_widget_fullscreen_pepper.h"
@@ -520,10 +521,16 @@
};
RenderView::RenderView(RenderThreadBase* render_thread,
- const WebPreferences& webkit_preferences,
- int64 session_storage_namespace_id)
+ gfx::NativeViewId parent_hwnd,
+ int32 opener_id,
+ const RendererPreferences& renderer_prefs,
+ const WebPreferences& webkit_prefs,
+ SharedRenderViewCounter* counter,
+ int32 routing_id,
+ int64 session_storage_namespace_id,
+ const string16& frame_name)
: RenderWidget(render_thread, WebKit::WebPopupTypeNone),
- webkit_preferences_(webkit_preferences),
+ webkit_preferences_(webkit_prefs),
send_content_state_immediately_(false),
enabled_bindings_(0),
send_preferred_size_changes_(false),
@@ -548,16 +555,16 @@
browser_window_id_(-1),
ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)),
ALLOW_THIS_IN_INITIALIZER_LIST(page_info_method_factory_(this)),
- ALLOW_THIS_IN_INITIALIZER_LIST(autofill_method_factory_(this)),
ALLOW_THIS_IN_INITIALIZER_LIST(accessibility_method_factory_(this)),
ALLOW_THIS_IN_INITIALIZER_LIST(translate_helper_(this)),
ALLOW_THIS_IN_INITIALIZER_LIST(cookie_jar_(this)),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- notification_provider_(new NotificationProvider(this))),
+ devtools_client_(NULL),
+ geolocation_dispatcher_(NULL),
+ speech_input_dispatcher_(NULL),
+ device_orientation_dispatcher_(NULL),
accessibility_ack_pending_(false),
pending_app_icon_requests_(0),
session_storage_namespace_id_(session_storage_namespace_id),
- decrement_shared_popup_at_destruction_(false),
custom_menu_listener_(NULL) {
#if defined(OS_MACOSX)
// On Mac, the select popups are rendered by the browser.
@@ -565,14 +572,7 @@
// in single-process mode.
WebKit::WebView::setUseExternalPopupMenus(true);
#endif
- password_autocomplete_manager_.reset(new PasswordAutocompleteManager(this));
- autofill_helper_.reset(new AutoFillHelper(this));
- page_click_tracker_.reset(new PageClickTracker(this));
- // Note that the order of insertion of the listeners is important.
- // The password_autocomplete_manager_ takes the first shot at processing the
- // notification and can stop the propagation.
- page_click_tracker_->AddListener(password_autocomplete_manager_.get());
- page_click_tracker_->AddListener(autofill_helper_.get());
+
ClearBlockedContentSettings();
if (CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableClientSidePhishingDetection)) {
@@ -583,6 +583,66 @@
phishing_delegate_->SetPhishingScorer(thread->phishing_scorer());
}
}
+
+ routing_id_ = routing_id;
+ if (opener_id != MSG_ROUTING_NONE)
+ opener_id_ = opener_id;
+
+ if (counter) {
+ shared_popup_counter_ = counter;
+ shared_popup_counter_->data++;
+ decrement_shared_popup_at_destruction_ = true;
+ } else {
+ shared_popup_counter_ = new SharedRenderViewCounter(0);
+ decrement_shared_popup_at_destruction_ = false;
+ }
+
+ notification_provider_ = new NotificationProvider(this);
+
+ devtools_agent_ = new DevToolsAgent(this);
+ PasswordAutocompleteManager* password_autocomplete_manager =
+ new PasswordAutocompleteManager(this);
+ AutoFillHelper* autofill_helper = new AutoFillHelper(
+ this, password_autocomplete_manager);
+
+ webwidget_ = WebView::create(this, devtools_agent_, autofill_helper);
+ g_view_map.Get().insert(std::make_pair(webview(), this));
+ webkit_preferences_.Apply(webview());
+ webview()->initializeMainFrame(this);
+ if (!frame_name.empty())
+ webview()->mainFrame()->setName(frame_name);
+
+ OnSetRendererPrefs(renderer_prefs);
+
+ render_thread_->AddRoute(routing_id_, this);
+ // Take a reference on behalf of the RenderThread. This will be balanced
+ // when we receive ViewMsg_Close.
+ AddRef();
+
+ // If this is a popup, we must wait for the CreatingNew_ACK message before
+ // completing initialization. Otherwise, we can finish it now.
+ if (opener_id == MSG_ROUTING_NONE) {
+ did_show_ = true;
+ CompleteInit(parent_hwnd);
+ }
+
+ host_window_ = parent_hwnd;
+
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess();
+ if (command_line.HasSwitch(switches::kDomAutomationController))
+ enabled_bindings_ |= BindingsPolicy::DOM_AUTOMATION;
+ if (command_line.HasSwitch(switches::kEnableAccessibility))
+ WebAccessibilityCache::enableAccessibility();
+
+ audio_message_filter_ = new AudioMessageFilter(routing_id_);
+ render_thread_->AddFilter(audio_message_filter_);
+
+ PageClickTracker* page_click_tracker = new PageClickTracker(this);
+ // Note that the order of insertion of the listeners is important.
+ // The password_autocomplete_manager takes the first shot at processing the
+ // notification and can stop the propagation.
+ page_click_tracker->AddListener(password_autocomplete_manager);
+ page_click_tracker->AddListener(autofill_helper);
}
RenderView::~RenderView() {
@@ -624,6 +684,9 @@
for (ViewMap::iterator it = views->begin(); it != views->end(); ++it)
DCHECK_NE(this, it->second) << "Failed to call Close?";
#endif
+
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, set_render_view(NULL));
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, OnDestruct());
}
/*static*/
@@ -654,15 +717,16 @@
int64 session_storage_namespace_id,
const string16& frame_name) {
DCHECK(routing_id != MSG_ROUTING_NONE);
- scoped_refptr<RenderView> view(new RenderView(render_thread, webkit_prefs,
- session_storage_namespace_id));
- view->Init(parent_hwnd,
- opener_id,
- renderer_prefs,
- counter,
- routing_id,
- frame_name); // adds reference
- return view;
+ return new RenderView(
+ render_thread,
+ parent_hwnd,
+ opener_id,
+ renderer_prefs,
+ webkit_prefs,
+ counter,
+ routing_id,
+ session_storage_namespace_id,
+ frame_name); // adds reference
}
// static
@@ -674,6 +738,15 @@
next_page_id_ = next_page_id;
}
+void RenderView::AddObserver(RenderViewObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void RenderView::RemoveObserver(RenderViewObserver* observer) {
+ observer->set_render_view(NULL);
+ observers_.RemoveObserver(observer);
+}
+
bool RenderView::RendererAccessibilityNotification::ShouldIncludeChildren() {
typedef ViewHostMsg_AccessibilityNotification_Params params;
if (type == params::NOTIFICATION_TYPE_CHILDREN_CHANGED ||
@@ -894,91 +967,16 @@
blocked_plugins_.erase(blocked_plugin);
}
-void RenderView::Init(gfx::NativeViewId parent_hwnd,
- int32 opener_id,
- const RendererPreferences& renderer_prefs,
- SharedRenderViewCounter* counter,
- int32 routing_id,
- const string16& frame_name) {
- DCHECK(!webview());
-
- if (opener_id != MSG_ROUTING_NONE)
- opener_id_ = opener_id;
-
- if (counter) {
- shared_popup_counter_ = counter;
- shared_popup_counter_->data++;
- decrement_shared_popup_at_destruction_ = true;
- } else {
- shared_popup_counter_ = new SharedRenderViewCounter(0);
- decrement_shared_popup_at_destruction_ = false;
- }
-
- devtools_agent_.reset(new DevToolsAgent(routing_id, this));
-
- // TODO(jam): remove this once WebKit is rolled
-#if defined(WEBKIT_HAS_WEB_AUTO_FILL_CLIENT)
- webwidget_ = WebView::create(this, devtools_agent_.get(), this);
-#else
- webwidget_ = WebView::create(this, devtools_agent_.get());
-#endif
- g_view_map.Get().insert(std::make_pair(webview(), this));
- webkit_preferences_.Apply(webview());
- webview()->initializeMainFrame(this);
- if (!frame_name.empty())
- webview()->mainFrame()->setName(frame_name);
-
- OnSetRendererPrefs(renderer_prefs);
-
- routing_id_ = routing_id;
- render_thread_->AddRoute(routing_id_, this);
- // Take a reference on behalf of the RenderThread. This will be balanced
- // when we receive ViewMsg_Close.
- AddRef();
-
- // If this is a popup, we must wait for the CreatingNew_ACK message before
- // completing initialization. Otherwise, we can finish it now.
- if (opener_id == MSG_ROUTING_NONE) {
- did_show_ = true;
- CompleteInit(parent_hwnd);
- }
-
- host_window_ = parent_hwnd;
-
- const CommandLine& command_line = *CommandLine::ForCurrentProcess();
- if (command_line.HasSwitch(switches::kDomAutomationController))
- enabled_bindings_ |= BindingsPolicy::DOM_AUTOMATION;
- if (command_line.HasSwitch(switches::kEnableAccessibility))
- WebAccessibilityCache::enableAccessibility();
-
- audio_message_filter_ = new AudioMessageFilter(routing_id_);
- render_thread_->AddFilter(audio_message_filter_);
-}
-
bool RenderView::OnMessageReceived(const IPC::Message& message) {
WebFrame* main_frame = webview() ? webview()->mainFrame() : NULL;
if (main_frame)
child_process_logging::SetActiveURL(main_frame->url());
- // If this is developer tools renderer intercept tools messages first.
- if (devtools_client_.get() && devtools_client_->OnMessageReceived(message))
- return true;
- if (devtools_agent_.get() && devtools_agent_->OnMessageReceived(message))
- return true;
- if (notification_provider_->OnMessageReceived(message))
- return true;
- if (geolocation_dispatcher_.get() &&
- geolocation_dispatcher_->OnMessageReceived(message)) {
- return true;
- }
- if (speech_input_dispatcher_.get() &&
- speech_input_dispatcher_->OnMessageReceived(message)) {
- return true;
- }
- if (device_orientation_dispatcher_.get() &&
- device_orientation_dispatcher_->OnMessageReceived(message)) {
- return true;
- }
+ ObserverListBase<RenderViewObserver>::Iterator it(observers_);
+ RenderViewObserver* observer;
+ while ((observer = it.GetNext()) != NULL)
+ if (observer->OnMessageReceived(message))
+ return true;
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(RenderView, message)
@@ -1024,7 +1022,6 @@
IPC_MESSAGE_HANDLER(ViewMsg_CSSInsertRequest, OnCSSInsertRequest)
IPC_MESSAGE_HANDLER(ViewMsg_AddMessageToConsole, OnAddMessageToConsole)
IPC_MESSAGE_HANDLER(ViewMsg_ReservePageIDRange, OnReservePageIDRange)
- IPC_MESSAGE_HANDLER(ViewMsg_FillPasswordForm, OnFillPasswordForm)
IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDragEnter, OnDragTargetDragEnter)
IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDragOver, OnDragTargetDragOver)
IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDragLeave, OnDragTargetDragLeave)
@@ -1058,10 +1055,6 @@
OnHandleMessageFromExternalHost)
IPC_MESSAGE_HANDLER(ViewMsg_DisassociateFromPopupCount,
OnDisassociateFromPopupCount)
- IPC_MESSAGE_HANDLER(ViewMsg_AutoFillSuggestionsReturned,
- OnAutoFillSuggestionsReturned)
- IPC_MESSAGE_HANDLER(ViewMsg_AutoFillFormDataFilled,
- OnAutoFillFormDataFilled)
IPC_MESSAGE_HANDLER(ViewMsg_AllowScriptToClose,
OnAllowScriptToClose)
IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
@@ -1383,12 +1376,6 @@
history_list_offset_ = params.current_history_list_offset;
history_list_length_ = params.current_history_list_length;
- if (devtools_agent_.get())
- devtools_agent_->OnNavigate();
-
- if (notification_provider_.get())
- notification_provider_->OnNavigate();
-
child_process_logging::SetActiveURL(params.url);
AboutHandler::MaybeHandle(params.url);
@@ -1509,8 +1496,8 @@
}
void RenderView::OnSetupDevToolsClient() {
- DCHECK(!devtools_client_.get());
- devtools_client_.reset(new DevToolsClient(this));
+ DCHECK(!devtools_client_);
+ devtools_client_ = new DevToolsClient(this);
}
void RenderView::OnUpdateTargetURLAck() {
@@ -1987,21 +1974,6 @@
provider_type));
}
-void RenderView::OnAutoFillSuggestionsReturned(
- int query_id,
- const std::vector<string16>& values,
- const std::vector<string16>& labels,
- const std::vector<string16>& icons,
- const std::vector<int>& unique_ids) {
- autofill_helper_->SuggestionsReceived(
- query_id, values, labels, icons, unique_ids);
-}
-
-void RenderView::OnAutoFillFormDataFilled(int query_id,
- const webkit_glue::FormData& form) {
- autofill_helper_->FormDataFilled(query_id, form);
-}
-
void RenderView::OnAllowScriptToClose(bool script_can_close) {
script_can_close_ = script_can_close;
}
@@ -2191,7 +2163,7 @@
}
WebKit::WebNotificationPresenter* RenderView::notificationPresenter() {
- return notification_provider_.get();
+ return notification_provider_;
}
void RenderView::didStartLoading() {
@@ -2296,29 +2268,6 @@
UserMetricsRecordAction(name);
}
-void RenderView::textFieldDidEndEditing(
- const WebKit::WebInputElement& element) {
- password_autocomplete_manager_->TextFieldDidEndEditing(element);
-}
-
-void RenderView::textFieldDidChange(const WebKit::WebInputElement& element) {
- // We post a task for doing the AutoFill as the caret position is not set
- // properly at this point (http://bugs.webkit.org/show_bug.cgi?id=16976) and
- // it is needed to trigger autofill.
- autofill_method_factory_.RevokeAll();
- MessageLoop::current()->PostTask(
- FROM_HERE,
- autofill_method_factory_.NewRunnableMethod(
- &RenderView::TextFieldDidChangeImpl, element));
-}
-
-void RenderView::TextFieldDidChangeImpl(
- const WebKit::WebInputElement& element) {
- if (password_autocomplete_manager_->TextDidChangeInTextField(element))
- return;
- autofill_helper_->TextDidChangeInTextField(element);
-}
-
void RenderView::SendPendingAccessibilityNotifications() {
if (!accessibility_.get())
return;
@@ -2346,13 +2295,6 @@
accessibility_ack_pending_ = true;
}
-void RenderView::textFieldDidReceiveKeyDown(
- const WebKit::WebInputElement& element,
- const WebKit::WebKeyboardEvent& event) {
- password_autocomplete_manager_->TextFieldHandlingKeyDown(element, event);
- autofill_helper_->KeyDownInTextField(element, event);
-}
-
bool RenderView::handleCurrentKeyboardEvent() {
if (edit_commands_.empty())
return false;
@@ -2645,43 +2587,6 @@
value.utf8()));
}
-void RenderView::didAcceptAutoFillSuggestion(const WebKit::WebNode& node,
- const WebKit::WebString& value,
- const WebKit::WebString& label,
- int unique_id,
- unsigned index) {
- autofill_helper_->DidAcceptAutoFillSuggestion(node, value, unique_id, index);
-}
-
-void RenderView::didSelectAutoFillSuggestion(const WebKit::WebNode& node,
- const WebKit::WebString& value,
- const WebKit::WebString& label,
- int unique_id) {
- autofill_helper_->DidSelectAutoFillSuggestion(node, unique_id);
-}
-
-void RenderView::didClearAutoFillSelection(const WebKit::WebNode& node) {
- autofill_helper_->DidClearAutoFillSelection(node);
-}
-
-void RenderView::didAcceptAutocompleteSuggestion(
- const WebKit::WebInputElement& user_element) {
- bool result = password_autocomplete_manager_->FillPassword(user_element);
- // Since this user name was selected from a suggestion list, we should always
- // have password for it.
- DCHECK(result);
-}
-
-void RenderView::removeAutocompleteSuggestion(const WebKit::WebString& name,
- const WebKit::WebString& value) {
- autofill_helper_->RemoveAutocompleteSuggestion(name, value);
-}
-
-void RenderView::removeAutofillSuggestions(const WebString& name,
- const WebString& value) {
- removeAutocompleteSuggestion(name, value);
-}
-
// WebKit::WebWidgetClient ----------------------------------------------------
void RenderView::didFocus() {
@@ -2937,8 +2842,7 @@
}
void RenderView::frameDetached(WebFrame* frame) {
- autofill_helper_->FrameDetached(frame);
- page_click_tracker_->StopTrackingFrame(frame, true);
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameDetached(frame));
}
void RenderView::willClose(WebFrame* frame) {
@@ -2948,11 +2852,7 @@
page_load_histograms_.Dump(frame);
navigation_state->user_script_idle_scheduler()->Cancel();
- // TODO(jhawkins): Remove once frameDetached is called by WebKit.
- // NOTE: taking this out results in lots of increased memory usage! This is
- // because frameDetached is NOT like wilLClose. The latter happens between
- // navigations, but the former only happens when the RenderView is going away.
- autofill_helper_->FrameWillClose(frame);
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameWillClose(frame));
}
bool RenderView::allowImages(WebFrame* frame, bool enabled_per_settings) {
@@ -3546,11 +3446,8 @@
Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier()));
- page_click_tracker_->StartTrackingFrame(frame);
- // The document has now been fully loaded. Scan for forms to be sent up to
- // the browser.
- autofill_helper_->FrameContentsAvailable(frame);
- password_autocomplete_manager_->SendPasswordForms(frame, false);
+ FOR_EACH_OBSERVER(
+ RenderViewObserver, observers_, DidFinishDocumentLoad(frame));
// Check whether we have new encoding name.
UpdateEncoding(frame, frame->view()->pageEncoding().utf8());
@@ -3601,8 +3498,7 @@
navigation_state->set_finish_load_time(Time::Now());
navigation_state->user_script_idle_scheduler()->DidFinishLoad();
- // Let the password manager know which password forms are actually visible.
- password_autocomplete_manager_->SendPasswordForms(frame, true);
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame));
Send(new ViewHostMsg_DidFinishLoad(routing_id_, frame->identifier()));
}
@@ -4716,12 +4612,6 @@
webview()->dragSourceSystemDragEnded();
}
-void RenderView::OnFillPasswordForm(
- const webkit_glue::PasswordFormFillData& form_data) {
- password_autocomplete_manager_->ReceivedPasswordFormFillData(webview(),
- form_data);
-}
-
void RenderView::OnDragTargetDragEnter(const WebDropData& drop_data,
const gfx::Point& client_point,
const gfx::Point& screen_point,
@@ -5494,7 +5384,7 @@
}
void RenderView::DidHandleMouseEvent(const WebKit::WebMouseEvent& event) {
- page_click_tracker_->DidHandleMouseEvent(event);
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleMouseEvent(event));
}
#if defined(OS_MACOSX)
@@ -5652,27 +5542,26 @@
if (!frame)
return;
- // The page is translated, so try to extract the form data again.
- autofill_helper_->FrameContentsAvailable(frame);
+ FOR_EACH_OBSERVER(RenderViewObserver, observers_, FrameTranslated(frame));
}
WebKit::WebGeolocationClient* RenderView::geolocationClient() {
- if (!geolocation_dispatcher_.get())
- geolocation_dispatcher_.reset(new GeolocationDispatcher(this));
- return geolocation_dispatcher_.get();
+ if (!geolocation_dispatcher_)
+ geolocation_dispatcher_ = new GeolocationDispatcher(this);
+ return geolocation_dispatcher_;
}
WebKit::WebSpeechInputController* RenderView::speechInputController(
WebKit::WebSpeechInputListener* listener) {
- if (!speech_input_dispatcher_.get())
- speech_input_dispatcher_.reset(new SpeechInputDispatcher(this, listener));
- return speech_input_dispatcher_.get();
+ if (!speech_input_dispatcher_)
+ speech_input_dispatcher_ = new SpeechInputDispatcher(this, listener);
+ return speech_input_dispatcher_;
}
WebKit::WebDeviceOrientationClient* RenderView::deviceOrientationClient() {
- if (!device_orientation_dispatcher_.get())
- device_orientation_dispatcher_.reset(new DeviceOrientationDispatcher(this));
- return device_orientation_dispatcher_.get();
+ if (!device_orientation_dispatcher_)
+ device_orientation_dispatcher_ = new DeviceOrientationDispatcher(this);
+ return device_orientation_dispatcher_;
}
void RenderView::zoomLimitsChanged(double minimum_level, double maximum_level) {
« no previous file with comments | « chrome/renderer/render_view.h ('k') | chrome/renderer/render_view_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698