FileChooser: Mojoify FileChooser IPC, part 5

* Overview:
Introduce blink.mojom.FileChooser, and switch to it from legacy
IPC messages.

content::FileChooserImpl implements blink.mojom.FileChooser.

blink::FileChooser and content::PepperFileChooserHost::CompletionHandler
initiate requests to blink.mojom.FileChooser, and receive their responses.


* Details:

** third_party/blink/public/mojom/choosers/file_chooser.mojom
  Introduce FileChooser.

** content/browser/frame_host/render_frame_host_impl.cc
** content/browser/frame_host/render_frame_host_impl.h
  FileChooserImpl implements blink.mojom.FileChooser.
  Introduce FileChooserImpl::ListenerProxy for lifetime difference between
  FileSelectListener and FileChooserImpl.

** content/public/app/mojo/content_browser_manifest.json
  Expose blink.mojom.FileChooser mojo interface.

** third_party/blink/renderer/core/html/forms/file_chooser.cc
** third_party/blink/renderer/core/html/forms/file_chooser.h
  blink:FileChooser sends requests to blink.mojom.FileChooser, and
  receives their responses.

** content/renderer/pepper/pepper_file_chooser_host.cc.
** content/renderer/pepper/pepper_file_chooser_host_unittest.cc.
  content::PepperFileChooserHost::CompletionHandler sends requests to
  blink.mojom.FileChooser, and receives their responses.

** content/browser/frame_host/render_frame_host_delegate.cc
** content/browser/frame_host/render_frame_host_delegate.h
  Add RenderFrameHostDelegate::EnumerateDirectory.
  Now directory enumeration requests are received by FileChooserImpl
  implementing blink.mojom.FileChooser. RenderFrameHostDelegate is
  responsible for passing the requests to actual directory enumeration code.

** content/browser/web_contents/web_contents_impl.cc
** content/browser/web_contents/web_contents_impl.h
  Override RenderFrameHostDelegate::EnumerateDirectory, and remove legacy IPC
  code for EnumerateDirectory.
  Merge ViewFileSelectListener into FileChooserImpl.

** chrome/browser/ssl/security_state_tab_helper_browsertest.cc
** content/browser/cross_site_transfer_browsertest.cc
** content/browser/fileapi/fileapi_browsertest.cc
** content/browser/frame_host/render_frame_host_manager_browsertest.cc
** content/browser/navigation_browsertest.cc
** content/browser/site_per_process_browsertest.cc
** content/test/content_browser_test_utils_internal.cc
** content/test/content_browser_test_utils_internal.h
  Add callback arguments to mocks for FileChooser.
  The browser process doesn't receive a FileChooser request immediately after
click() on a file control since this CL. This behavior difference breaks
some tests. This CL adds a callback argument to mock FileChoosers, and it
notifies the caller that a request is reached to the FileChooser.

** content/browser/security_exploit_browsertest.cc
  Introduce MojoBadMessageObserver to test mojo::ReportBadMessage().
  Switch to mojo from legacy IPC.

** third_party/blink/renderer/core/BUILD.gn
** third_party/blink/renderer/core/html/forms/mock_file_chooser.h
  A mock FileChooser. This intercepts FileChooserRequest, and is helpful to
  test FileChooser clients.

** third_party/blink/renderer/core/page/chrome_client_impl_test.cc
** third_party/blink/renderer/core/html/forms/file_input_type_test.cc
  Use mock_file_chooser.h.

** third_party/blink/renderer/core/html/forms/file_input_type.cc
** third_party/blink/renderer/core/html/forms/file_input_type.h
  - Switch from blink::WebFileChooserParams to blink::mojom::blink::
    FileChooserParams.
  - Change the return type of CollectAcceptTypes for FileChooserParams::
    accept_types.
  - Change the argument of FilesChosen() mutable because we drop FilePaths
    which can't be converted by FilePathToString().

** third_party/blink/renderer/core/fileapi/file_list.cc
** third_party/blink/renderer/core/fileapi/file_list.h
** third_party/blink/renderer/core/fileapi/file_list_test.cc
  Change the return type of PathsForUseVisibleFiles() from Vector<String>
  to Vector<base::FilePath> because the vector is set to FileChooserParams::
  selected_files, which is Vector<base::FilePath>.

** third_party/WebKit/LayoutTests/accessibility/
** third_party/WebKit/LayoutTests/fast/events/
** third_party/WebKit/LayoutTests/fast/forms/file/
** third_party/WebKit/LayoutTests/fast/forms/resources/mock-file-chooser.js
  Introduce mock-file-chooser.js which intercepts Mojo calls from renderer
  processes, and some layout tests adopt it.  FileChooser stuff in
  content/shell/test_runner/ is now unnecessary.

** content/browser/bad_message.h
** tools/metrics/histograms/enums.xml
  Mark BadMessageReason::FH_FILE_CHOOSER_PATH obsolete.
  Now we use mojo::ReportBadMessage().

** content/browser/renderer_host/render_view_host_impl.cc
** content/browser/renderer_host/render_view_host_impl.h
** content/common/content_param_traits.cc
** content/common/content_param_traits.h
** content/common/frame_messages.h
** content/common/view_messages.h
** content/public/browser/render_view_host.h
** content/renderer/render_frame_impl.cc
** content/renderer/render_frame_impl.h
** content/renderer/render_view_impl.cc
** content/renderer/render_view_impl.h
** content/shell/test_runner/test_runner.cc
** content/shell/test_runner/test_runner.h
** content/shell/test_runner/web_frame_test_client.cc
** content/shell/test_runner/web_frame_test_client.h
** content/shell/test_runner/web_frame_test_proxy.cc
** content/shell/test_runner/web_frame_test_proxy.h
** third_party/blink/public/BUILD.gn
** third_party/blink/public/web/web_file_chooser_completion.h
** third_party/blink/public/web/web_file_chooser_params.h
** third_party/blink/public/web/web_local_frame_client.h
** third_party/blink/public/web/web_view_client.h
** third_party/blink/renderer/core/loader/empty_clients.h
** third_party/blink/renderer/core/page/chrome_client.h
** third_party/blink/renderer/core/page/chrome_client_impl.cc
** third_party/blink/renderer/core/page/chrome_client_impl.h
  Just remove unnecessary code


Bug: 869257

Change-Id: I573bf8c20162c3131e630ea5e4f2e0cb431a4da0
Reviewed-on: https://chromium-review.googlesource.com/c/1170454
Reviewed-by: Avi Drissman <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Commit-Queue: Kent Tamura <[email protected]>
Cr-Commit-Position: refs/heads/master@{#605619}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 387e7d92..8cd7bd4a 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -300,46 +300,6 @@
   return a->frame_tree_node()->depth() < b->frame_tree_node()->depth();
 }
 
-// TODO(tkent): This will be merged into FileChooserImpl in
-// render_frame_host_impl.cc.
-class ViewFileSelectListener : public FileSelectListener,
-                               private WebContentsObserver {
- public:
-  ViewFileSelectListener(WebContents* web_contents, int request_id)
-      : web_contents_(web_contents), request_id_(request_id) {
-    Observe(web_contents);
-  }
-  ~ViewFileSelectListener() override = default;
-
- private:
-  // content::FileSelectListener overrides:
-
-  void FileSelected(std::vector<blink::mojom::FileChooserFileInfoPtr> files,
-                    blink::mojom::FileChooserParams::Mode mode) override {
-    if (!web_contents_)
-      return;
-    std::vector<base::FilePath> file_path_list;
-    for (const auto& file_info : files) {
-      file_path_list.push_back(file_info->get_native_file()->file_path);
-    }
-    web_contents_->GetRenderViewHost()->DirectoryEnumerationFinished(
-        request_id_, file_path_list);
-  }
-
-  void FileSelectionCanceled() override {
-    if (!web_contents_)
-      return;
-    web_contents_->GetRenderViewHost()->DirectoryEnumerationFinished(
-        request_id_, std::vector<base::FilePath>());
-  }
-
-  // content::WebContentsObserver override:
-  void WebContentsDestroyed() override { web_contents_ = nullptr; }
-
-  WebContents* web_contents_;
-  int request_id_;
-};
-
 }  // namespace
 
 std::unique_ptr<WebContents> WebContents::Create(
@@ -873,7 +833,6 @@
     IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits)
     IPC_MESSAGE_HANDLER(ViewHostMsg_PageScaleFactorChanged,
                         OnPageScaleFactorChanged)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_EnumerateDirectory, OnEnumerateDirectory)
     IPC_MESSAGE_HANDLER(ViewHostMsg_AppCacheAccessed, OnAppCacheAccessed)
 #if BUILDFLAG(ENABLE_PLUGINS)
     IPC_MESSAGE_HANDLER(ViewHostMsg_RequestPpapiBrokerPermission,
@@ -4651,19 +4610,14 @@
     observer.OnPageScaleFactorChanged(page_scale_factor);
 }
 
-void WebContentsImpl::OnEnumerateDirectory(RenderViewHostImpl* source,
-                                           int request_id,
-                                           const base::FilePath& path) {
-  if (!delegate_)
-    return;
-
-  ChildProcessSecurityPolicyImpl* policy =
-      ChildProcessSecurityPolicyImpl::GetInstance();
-  if (!policy->CanReadFile(source->GetProcess()->GetID(), path))
-    return;
-  auto listener = std::make_unique<ViewFileSelectListener>(this, request_id);
-  // TODO(nick): |this| param in the call below ought to be a RenderFrameHost.
-  delegate_->EnumerateDirectory(this, std::move(listener), path);
+void WebContentsImpl::EnumerateDirectory(
+    RenderFrameHost* render_frame_host,
+    std::unique_ptr<FileSelectListener> listener,
+    const base::FilePath& directory_path) {
+  if (delegate_)
+    delegate_->EnumerateDirectory(this, std::move(listener), directory_path);
+  else
+    listener->FileSelectionCanceled();
 }
 
 void WebContentsImpl::OnRegisterProtocolHandler(RenderFrameHostImpl* source,