text: // Copyright 2021 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "chrome/browser/plugins/plugin_observer_android.h"
  
  #include <utility>
  
  #include "chrome/browser/plugins/plugin_observer_common.h"
  #include "content/public/browser/render_frame_host.h"
  #include "content/public/browser/web_contents.h"
  #include "content/public/common/referrer.h"
  
  void PluginObserverAndroid::BindPluginHost(
      mojo::PendingAssociatedReceiver<chrome::mojom::PluginHost> receiver,
      content::RenderFrameHost* rfh) {
    auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
    if (!web_contents)
      return;
    auto* plugin_helper = PluginObserverAndroid::FromWebContents(web_contents);
    if (!plugin_helper)
      return;
    plugin_helper->plugin_host_receivers_.Bind(rfh, std::move(receiver));
  }
  
  PluginObserverAndroid::PluginObserverAndroid(content::WebContents* web_contents)
      : content::WebContentsUserData<PluginObserverAndroid>(*web_contents),
        plugin_host_receivers_(web_contents, this) {}
  
  PluginObserverAndroid::~PluginObserverAndroid() = default;
  
  void PluginObserverAndroid::OpenPDF(const GURL& url) {
    content::RenderFrameHost* render_frame_host =
        plugin_host_receivers_.GetCurrentTargetFrame();
  
    content::Referrer referrer;
    if (!CanOpenPdfUrl(render_frame_host, url,
                       GetWebContents().GetLastCommittedURL(), &referrer)) {
      return;
    }
  
    content::OpenURLParams open_url_params(
        url, referrer, WindowOpenDisposition::CURRENT_TAB,
        ui::PAGE_TRANSITION_AUTO_BOOKMARK, false);
    // On Android, PDFs downloaded with a user gesture are auto-opened.
    open_url_params.user_gesture = true;
    GetWebContents().OpenURL(open_url_params);
  }
  
  WEB_CONTENTS_USER_DATA_KEY_IMPL(PluginObserverAndroid);
  