Plumb WebTriggeringEventInfo through LoadURLExternally

This code path is used for e.g. shift-clicks coming from subframes
(strangely). By plumbing it into LoadURLExternally / OpenURL, we can
use this information in the popup blocker.

This patch makes the additional refactor to split LoadURLExternally
into two, LoadURLExternally and DownloadURL.

Bug: 733330
Change-Id: I94476ecbf3f55ef26664d7c6a294e84fce7bba32
Reviewed-on: https://chromium-review.googlesource.com/565681
Reviewed-by: David Trainor <[email protected]>
Reviewed-by: Nick Carter <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Commit-Queue: Charlie Harrison <[email protected]>
Cr-Commit-Position: refs/heads/master@{#487251}
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 894e553..e29e6f1 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2616,9 +2616,11 @@
   return nullptr;
 }
 
-void RenderFrameImpl::LoadURLExternally(const blink::WebURLRequest& request,
-                                        blink::WebNavigationPolicy policy) {
-  LoadURLExternally(request, policy, WebString(), false);
+void RenderFrameImpl::LoadURLExternally(
+    const blink::WebURLRequest& request,
+    blink::WebNavigationPolicy policy,
+    blink::WebTriggeringEventInfo triggering_event_info) {
+  LoadURLExternally(request, policy, triggering_event_info, false);
 }
 
 void RenderFrameImpl::LoadErrorPage(int reason) {
@@ -3314,29 +3316,30 @@
       static_cast<int32_t>(source_line), source_name.Utf16()));
 }
 
-void RenderFrameImpl::LoadURLExternally(const blink::WebURLRequest& request,
-                                        blink::WebNavigationPolicy policy,
-                                        const blink::WebString& suggested_name,
-                                        bool should_replace_current_entry) {
-  Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame_, request));
-  if (policy == blink::kWebNavigationPolicyDownload) {
-    FrameHostMsg_DownloadUrl_Params params;
-    params.render_view_id = render_view_->GetRoutingID();
-    params.render_frame_id = GetRoutingID();
-    params.url = request.Url();
-    params.referrer = referrer;
-    params.initiator_origin = request.RequestorOrigin();
-    params.suggested_name = suggested_name.Utf16();
+void RenderFrameImpl::DownloadURL(const blink::WebURLRequest& request,
+                                  const blink::WebString& suggested_name) {
+  FrameHostMsg_DownloadUrl_Params params;
+  params.render_view_id = render_view_->GetRoutingID();
+  params.render_frame_id = GetRoutingID();
+  params.url = request.Url();
+  params.referrer = RenderViewImpl::GetReferrerFromRequest(frame_, request);
+  params.initiator_origin = request.RequestorOrigin();
+  params.suggested_name = suggested_name.Utf16();
 
-    Send(new FrameHostMsg_DownloadUrl(params));
-  } else {
-    // TODO(csharrison): Plumb triggering_event_info through Blink.
-    OpenURL(request.Url(), IsHttpPost(request),
-            GetRequestBodyForWebURLRequest(request),
-            GetWebURLRequestHeaders(request), referrer, policy,
-            should_replace_current_entry, false,
-            blink::WebTriggeringEventInfo::kUnknown);
-  }
+  Send(new FrameHostMsg_DownloadUrl(params));
+}
+
+void RenderFrameImpl::LoadURLExternally(
+    const blink::WebURLRequest& request,
+    blink::WebNavigationPolicy policy,
+    blink::WebTriggeringEventInfo triggering_event_info,
+    bool should_replace_current_entry) {
+  Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame_, request));
+  DCHECK_NE(policy, blink::kWebNavigationPolicyDownload);
+  OpenURL(request.Url(), IsHttpPost(request),
+          GetRequestBodyForWebURLRequest(request),
+          GetWebURLRequestHeaders(request), referrer, policy,
+          should_replace_current_entry, false, triggering_event_info);
 }
 
 void RenderFrameImpl::WillSendSubmitEvent(const blink::WebFormElement& form) {
@@ -5524,8 +5527,12 @@
       // need to save information about the navigation here.
       pending_navigation_info_.reset(new PendingNavigationInfo(info));
       return blink::kWebNavigationPolicyHandledByClient;
+    } else if (info.default_policy == blink::kWebNavigationPolicyDownload) {
+      DownloadURL(info.url_request, blink::WebString());
+      return blink::kWebNavigationPolicyIgnore;
     } else {
-      LoadURLExternally(info.url_request, info.default_policy);
+      LoadURLExternally(info.url_request, info.default_policy,
+                        info.triggering_event_info);
       return blink::kWebNavigationPolicyIgnore;
     }
   }
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 351489a5..6f6388c 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -424,8 +424,10 @@
       const WebPluginInfo& info,
       const blink::WebPluginParams& params,
       std::unique_ptr<PluginInstanceThrottler> throttler) override;
-  void LoadURLExternally(const blink::WebURLRequest& request,
-                         blink::WebNavigationPolicy policy) override;
+  void LoadURLExternally(
+      const blink::WebURLRequest& request,
+      blink::WebNavigationPolicy policy,
+      blink::WebTriggeringEventInfo triggering_event_info) override;
   void ExecuteJavaScript(const base::string16& javascript) override;
   bool IsMainFrame() override;
   bool IsHidden() override;
@@ -543,9 +545,11 @@
                               const blink::WebString& source_name,
                               unsigned source_line,
                               const blink::WebString& stack_trace) override;
+  void DownloadURL(const blink::WebURLRequest& request,
+                   const blink::WebString& suggested_name) override;
   void LoadURLExternally(const blink::WebURLRequest& request,
                          blink::WebNavigationPolicy policy,
-                         const blink::WebString& suggested_name,
+                         blink::WebTriggeringEventInfo triggering_event_info,
                          bool should_replace_current_entry) override;
   void LoadErrorPage(int reason) override;
   blink::WebNavigationPolicy DecidePolicyForNavigation(