De-virtualize RenderWidget/RenderViewImpl::OnClose

The interaction between RenderViewImpl and RenderWidget around handling
of ViewMsg_Close is somewhat complex.

Currently, the IPC message is received by RenderViewImpl. It doesn't have
a handler registered, so it falls back to calling
RenderWidget::OnMessageReceived. RenderWidget has a handler - OnClose,
which is a virtual method overriden by RenderViewImpl, therefore
RenderViewImpl::OnClose ends up handling the IPC. This roundtripping
between objects seems unnecessary complexity and should be eliminated.

This CL de-virtualizes OnClose and both RenderViewImpl and RenderWidget
has their own version of the method. RenderViewImpl now defines a handler
directly, so no calls to RenderWidget are made as part of finding a
handler for the IPC message.

BUG=478281

Review URL: https://codereview.chromium.org/1123513002

Cr-Commit-Position: refs/heads/master@{#328003}
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 3475244c..9d917d2 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1358,6 +1358,7 @@
                         OnGetRenderedText)
     IPC_MESSAGE_HANDLER(ViewMsg_PluginImeCompositionCompleted,
                         OnPluginImeCompositionCompleted)
+    IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose)
     IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize)
     IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility)
     IPC_MESSAGE_HANDLER(ViewMsg_WindowFrameChanged, OnWindowFrameChanged)
@@ -2852,6 +2853,12 @@
   Send(new ViewHostMsg_ClosePage_ACK(routing_id_));
 }
 
+void RenderViewImpl::OnClose() {
+  if (closing_)
+    RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id_));
+  RenderWidget::OnClose();
+}
+
 void RenderViewImpl::OnThemeChanged() {
 #if defined(USE_AURA)
   // Aura doesn't care if we switch themes.
@@ -3024,12 +3031,6 @@
 }
 #endif  // OS_MACOSX
 
-void RenderViewImpl::OnClose() {
-  if (closing_)
-    RenderThread::Get()->Send(new ViewHostMsg_Close_ACK(routing_id_));
-  RenderWidget::OnClose();
-}
-
 void RenderViewImpl::Close() {
   // We need to grab a pointer to the doomed WebView before we destroy it.
   WebView* doomed = webview();
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index da62fb79..8e07711 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -457,7 +457,6 @@
 
  protected:
   // RenderWidget overrides:
-  void OnClose() override;
   void Close() override;
   void OnResize(const ViewMsg_Resize_Params& params) override;
   void DidInitiatePaint() override;
@@ -606,6 +605,8 @@
   void OnCancelDownload(int32 download_id);
   void OnClearFocusedElement();
   void OnClosePage();
+  void OnClose();
+
   void OnShowContextMenu(ui::MenuSourceType source_type,
                          const gfx::Point& location);
   void OnCopyImageAt(int x, int y);
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index a09da9bd..df4f62f 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -412,7 +412,7 @@
   void OnCursorVisibilityChange(bool is_visible);
   void OnMouseCaptureLost();
   virtual void OnSetFocus(bool enable);
-  virtual void OnClose();
+  void OnClose();
   void OnCreatingNewAck();
   virtual void OnResize(const ViewMsg_Resize_Params& params);
   void OnEnableDeviceEmulation(const blink::WebDeviceEmulationParams& params);