pdf_unsupported_feature.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/pdf/pdf_unsupported_feature.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_plugin_service_filter.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_finder.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_metadata.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/pref_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_preferences_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/pdf/open_pdf_in_reader_prompt_delegate.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/pdf/pdf_tab_helper.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/tab_contents.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_content_client.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/jstemplate_builder.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/metro.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::PluginService;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using webkit::WebPluginInfo;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAdobeReaderIdentifier[] = "adobe-reader";
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAdobeReaderUpdateUrl[] =
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "http://www.adobe.com/go/getreader_chrome";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prompt delegate used to ask the user if they want to use Adobe Reader
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by default.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PDFEnableAdobeReaderPromptDelegate
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public OpenPDFInReaderPromptDelegate {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PDFEnableAdobeReaderPromptDelegate(Profile* profile);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PDFEnableAdobeReaderPromptDelegate();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OpenPDFInReaderPromptDelegate
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetMessageText() const OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetAcceptButtonText() const OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetCancelButtonText() const OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldExpire(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details) const OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Accept() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Cancel() OVERRIDE;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnYes();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNo();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(PDFEnableAdobeReaderPromptDelegate);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PDFEnableAdobeReaderPromptDelegate::PDFEnableAdobeReaderPromptDelegate(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarShown"));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PDFEnableAdobeReaderPromptDelegate::~PDFEnableAdobeReaderPromptDelegate() {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PDFEnableAdobeReaderPromptDelegate::ShouldExpire(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::LoadCommittedDetails& details) const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PageTransition transition =
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PageTransitionStripQualifier(details.entry->GetTransitionType());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want to expire on a reload, because that is how we open the PDF in
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reader.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !details.is_in_page && transition != content::PAGE_TRANSITION_RELOAD;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PDFEnableAdobeReaderPromptDelegate::Accept() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarOK"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile_);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_prefs->EnablePluginGroup(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true, ASCIIToUTF16(PluginMetadata::kAdobeReaderGroupName));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_prefs->EnablePluginGroup(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false, ASCIIToUTF16(chrome::ChromeContentClient::kPDFPluginName));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PDFEnableAdobeReaderPromptDelegate::Cancel() {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarCancel"));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 PDFEnableAdobeReaderPromptDelegate::GetAcceptButtonText() const {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_INFOBAR_ALWAYS_USE_READER_BUTTON);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 PDFEnableAdobeReaderPromptDelegate::GetCancelButtonText() const {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_DONE);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 PDFEnableAdobeReaderPromptDelegate::GetMessageText() const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_INFOBAR_QUESTION_ALWAYS_USE_READER);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the url to get the latest Adbobe Reader installer.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OpenReaderUpdateURL(WebContents* tab) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams params(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(kAdobeReaderUpdateUrl), Referrer(), NEW_FOREGROUND_TAB,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PAGE_TRANSITION_LINK, false);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->OpenURL(params);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens the PDF using Adobe Reader.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OpenUsingReader(WebContents* web_contents,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const WebPluginInfo& reader_plugin,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     OpenPDFInReaderPromptDelegate* delegate) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->OverridePluginForTab(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetRenderProcessHost()->GetID(),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetRenderViewHost()->GetRoutingID(),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetURL(),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader_plugin);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->GetRenderViewHost()->ReloadFrame();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PDFTabHelper* pdf_tab_helper = PDFTabHelper::FromWebContents(web_contents);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pdf_tab_helper->ShowOpenInReaderPrompt(make_scoped_ptr(delegate));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interstitial to be used when the user chooses to open a PDF using Adobe
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reader, but it is out of date.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PDFUnsupportedFeatureInterstitial
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::InterstitialPageDelegate {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PDFUnsupportedFeatureInterstitial(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabContents* tab,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WebPluginInfo& reader_webplugininfo)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : tab_contents_(tab),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reader_webplugininfo_(reader_webplugininfo) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("PDF_ReaderInterstitialShown"));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_ = InterstitialPage::Create(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab->web_contents(), false, tab->web_contents()->GetURL(), this);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InterstitialPageDelegate implementation.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue strings;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "title",
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_TITLE));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "headLine",
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_BODY));
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "update",
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_UPDATE));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "open_with_reader",
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_PROCEED));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "ok",
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_OK));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "cancel",
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_CANCEL));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringPiece html(ResourceBundle::GetSharedInstance().
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GetRawDataResource(IDR_READER_OUT_OF_DATE_HTML));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return jstemplate_builder::GetI18nTemplateHtml(html, &strings);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CommandReceived(const std::string& command) OVERRIDE {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command == "0") {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("PDF_ReaderInterstitialCancel"));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interstitial_page_->DontProceed();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command == "1") {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("PDF_ReaderInterstitialUpdate"));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenReaderUpdateURL(tab_contents_->web_contents());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (command == "2") {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("PDF_ReaderInterstitialIgnore"));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Pretend that the plug-in is up-to-date so that we don't block it.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader_webplugininfo_.version = ASCIIToUTF16("11.0.0.0");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenUsingReader(tab_contents_->web_contents(), reader_webplugininfo_,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      NULL);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Proceed();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OverrideRendererPrefs(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RendererPreferences* prefs) OVERRIDE {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderer_preferences_util::UpdateFromSystemSettings(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs, tab_contents_->profile());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabContents* tab_contents_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPluginInfo reader_webplugininfo_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page_;  // Owns us.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PDFUnsupportedFeatureInterstitial);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The delegate for the bubble used to inform the user that we don't support a
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// feature in the PDF.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PDFUnsupportedFeaturePromptDelegate
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public OpenPDFInReaderPromptDelegate {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |reader| is NULL if Adobe Reader isn't installed.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PDFUnsupportedFeaturePromptDelegate(TabContents* tab_contents,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const webkit::WebPluginInfo* reader,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      PluginFinder* plugin_finder);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PDFUnsupportedFeaturePromptDelegate();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OpenPDFInReaderPromptDelegate:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetMessageText() const OVERRIDE;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetAcceptButtonText() const OVERRIDE;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetCancelButtonText() const OVERRIDE;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldExpire(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details) const OVERRIDE;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Accept() OVERRIDE;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Cancel() OVERRIDE;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabContents* tab_contents_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reader_installed_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reader_vulnerable_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPluginInfo reader_webplugininfo_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(PDFUnsupportedFeaturePromptDelegate);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PDFUnsupportedFeaturePromptDelegate::PDFUnsupportedFeaturePromptDelegate(
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TabContents* tab_contents,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const webkit::WebPluginInfo* reader,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginFinder* plugin_finder)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : tab_contents_(tab_contents),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader_installed_(!!reader),
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader_vulnerable_(false) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader_installed_) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UserMetricsAction("PDF_InstallReaderInfoBarShown"));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarShown"));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reader_webplugininfo_ = *reader;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PLUGIN_INSTALLATION)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PluginMetadata> plugin_metadata(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_finder->GetPluginMetadata(reader_webplugininfo_));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reader_vulnerable_ = plugin_metadata->GetSecurityStatus(*reader) !=
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       PluginMetadata::SECURITY_STATUS_UP_TO_DATE;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PDFUnsupportedFeaturePromptDelegate::~PDFUnsupportedFeaturePromptDelegate() {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 PDFUnsupportedFeaturePromptDelegate::GetMessageText() const {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_MESSAGE);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 PDFUnsupportedFeaturePromptDelegate::GetAcceptButtonText() const {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::IsMetroProcess())
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_METRO_MODE_LINK);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reader_installed_)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_OPEN_IN_READER_LINK);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_INSTALL_READER_LINK);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 PDFUnsupportedFeaturePromptDelegate::GetCancelButtonText() const {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_DONE);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PDFUnsupportedFeaturePromptDelegate::ShouldExpire(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::LoadCommittedDetails& details) const {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !details.is_in_page;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PDFUnsupportedFeaturePromptDelegate::Accept() {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::IsMetroProcess()) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser::AttemptRestartWithModeSwitch();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader_installed_) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("PDF_InstallReaderInfoBarOK"));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OpenReaderUpdateURL(tab_contents_->web_contents());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarOK"));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reader_vulnerable_) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new PDFUnsupportedFeatureInterstitial(tab_contents_, reader_webplugininfo_);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenPDFInReaderPromptDelegate* delegate =
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PDFEnableAdobeReaderPromptDelegate(tab_contents_->profile());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenUsingReader(tab_contents_->web_contents(), reader_webplugininfo_,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  delegate);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PDFUnsupportedFeaturePromptDelegate::Cancel() {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(reader_installed_ ?
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        UserMetricsAction("PDF_UseReaderInfoBarCancel") :
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        UserMetricsAction("PDF_InstallReaderInfoBarCancel"));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GotPluginsCallback(int process_id,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        int routing_id,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::vector<webkit::WebPluginInfo>& plugins) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents =
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tab_util::GetWebContentsByID(process_id, routing_id);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabContents* tab = TabContents::FromWebContents(web_contents);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!tab)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const webkit::WebPluginInfo* reader = NULL;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginFinder* plugin_finder = PluginFinder::GetInstance();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < plugins.size(); ++i) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<PluginMetadata> plugin_metadata(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        plugin_finder->GetPluginMetadata(plugins[i]));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plugin_metadata->identifier() != kAdobeReaderIdentifier)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!reader);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reader = &plugins[i];
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the Reader plugin is disabled by policy, don't prompt them.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(tab->profile());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (plugin_prefs->PolicyStatusForPlugin(plugin_metadata->name()) ==
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PluginPrefs::POLICY_DISABLED) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<OpenPDFInReaderPromptDelegate> prompt(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PDFUnsupportedFeaturePromptDelegate(tab, reader, plugin_finder));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PDFTabHelper* pdf_tab_helper = PDFTabHelper::FromWebContents(web_contents);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pdf_tab_helper->ShowOpenInReaderPrompt(prompt.Pass());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PDFHasUnsupportedFeature(content::WebContents* web_contents) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && defined(ENABLE_PLUGIN_INSTALLATION)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only works for Windows for now.  For Mac, we'll have to launch the file
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // externally since Adobe Reader doesn't work inside Chrome.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginService::GetInstance()->GetPlugins(base::Bind(&GotPluginsCallback,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetRenderProcessHost()->GetID(),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetRenderViewHost()->GetRoutingID()));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
408