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"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_metadata.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_preferences_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/tab_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_content_client.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/browser/open_pdf_in_reader_prompt_client.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/browser/pdf_web_contents_helper.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/page_navigator.h"
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/jstemplate_builder.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/metro.h"
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/pdf/adobe_reader_info_win.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing content::WebPluginInfo;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const char kAdobeReaderUpdateUrl[] = "http://www.adobe.com/go/getreader_chrome";
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The prompt delegate used to ask the user if they want to use Adobe Reader
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by default.
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PDFEnableAdobeReaderPromptClient
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public pdf::OpenPDFInReaderPromptClient {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit PDFEnableAdobeReaderPromptClient(Profile* profile);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~PDFEnableAdobeReaderPromptClient();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // pdf::OpenPDFInReaderPromptClient
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetMessageText() const OVERRIDE;
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetAcceptButtonText() const OVERRIDE;
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetCancelButtonText() const OVERRIDE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldExpire(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details) const OVERRIDE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Accept() OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Cancel() OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnYes();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnNo();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_IMPLICIT_CONSTRUCTORS(PDFEnableAdobeReaderPromptClient);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPDFEnableAdobeReaderPromptClient::PDFEnableAdobeReaderPromptClient(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : profile_(profile) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarShown"));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPDFEnableAdobeReaderPromptClient::~PDFEnableAdobeReaderPromptClient() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool PDFEnableAdobeReaderPromptClient::ShouldExpire(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::LoadCommittedDetails& details) const {
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::PageTransition transition =
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PageTransitionStripQualifier(details.entry->GetTransitionType());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want to expire on a reload, because that is how we open the PDF in
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reader.
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !details.is_in_page && transition != ui::PAGE_TRANSITION_RELOAD;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PDFEnableAdobeReaderPromptClient::Accept() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarOK"));
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile_).get();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_prefs->EnablePluginGroup(
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      true, base::ASCIIToUTF16(PluginMetadata::kAdobeReaderGroupName));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_prefs->EnablePluginGroup(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      false, base::ASCIIToUTF16(ChromeContentClient::kPDFPluginName));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PDFEnableAdobeReaderPromptClient::Cancel() {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarCancel"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 PDFEnableAdobeReaderPromptClient::GetAcceptButtonText() const {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_INFOBAR_ALWAYS_USE_READER_BUTTON);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 PDFEnableAdobeReaderPromptClient::GetCancelButtonText() const {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_DONE);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 PDFEnableAdobeReaderPromptClient::GetMessageText() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_INFOBAR_QUESTION_ALWAYS_USE_READER);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the url to get the latest Adbobe Reader installer.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OpenReaderUpdateURL(WebContents* web_contents) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams params(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL(kAdobeReaderUpdateUrl), Referrer(), NEW_FOREGROUND_TAB,
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PAGE_TRANSITION_LINK, false);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_contents->OpenURL(params);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens the PDF using Adobe Reader.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OpenUsingReader(WebContents* web_contents,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const WebPluginInfo& reader_plugin,
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     pdf::OpenPDFInReaderPromptClient* client) {
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->OverridePluginForFrame(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetRenderProcessHost()->GetID(),
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      web_contents->GetMainFrame()->GetRoutingID(),
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetURL(),
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reader_plugin);
139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  web_contents->ReloadFocusedFrame(false);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pdf::PDFWebContentsHelper* pdf_tab_helper =
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pdf::PDFWebContentsHelper::FromWebContents(web_contents);
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (client)
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pdf_tab_helper->ShowOpenInReaderPrompt(make_scoped_ptr(client));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interstitial to be used when the user chooses to open a PDF using Adobe
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reader, but it is out of date.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PDFUnsupportedFeatureInterstitial
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::InterstitialPageDelegate {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PDFUnsupportedFeatureInterstitial(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents* web_contents,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WebPluginInfo& reader_webplugininfo)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : web_contents_(web_contents),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        reader_webplugininfo_(reader_webplugininfo) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("PDF_ReaderInterstitialShown"));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_ = InterstitialPage::Create(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents, false, web_contents->GetURL(), this);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InterstitialPageDelegate implementation.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue strings;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "title",
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_TITLE));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "headLine",
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_BODY));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "update",
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_UPDATE));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "open_with_reader",
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_PROCEED));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "ok",
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_OK));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    strings.SetString(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "cancel",
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_CANCEL));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringPiece html(ResourceBundle::GetSharedInstance().
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GetRawDataResource(IDR_READER_OUT_OF_DATE_HTML));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return webui::GetI18nTemplateHtml(html, &strings);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CommandReceived(const std::string& command) OVERRIDE {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command == "0") {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("PDF_ReaderInterstitialCancel"));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interstitial_page_->DontProceed();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (command == "1") {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("PDF_ReaderInterstitialUpdate"));
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OpenReaderUpdateURL(web_contents_);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (command == "2") {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RecordAction(
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          UserMetricsAction("PDF_ReaderInterstitialIgnore"));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Pretend that the plug-in is up-to-date so that we don't block it.
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      reader_webplugininfo_.version = base::ASCIIToUTF16("11.0.0.0");
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OpenUsingReader(web_contents_, reader_webplugininfo_, NULL);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Proceed();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OverrideRendererPrefs(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RendererPreferences* prefs) OVERRIDE {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile =
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Profile::FromBrowserContext(web_contents_->GetBrowserContext());
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    renderer_preferences_util::UpdateFromSystemSettings(prefs, profile);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPluginInfo reader_webplugininfo_;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page_;  // Owns us.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PDFUnsupportedFeatureInterstitial);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The delegate for the bubble used to inform the user that we don't support a
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// feature in the PDF.
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PDFUnsupportedFeaturePromptClient
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : public pdf::OpenPDFInReaderPromptClient {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PDFUnsupportedFeaturePromptClient(WebContents* web_contents,
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    const AdobeReaderPluginInfo& reader_info);
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~PDFUnsupportedFeaturePromptClient();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // pdf::OpenPDFInReaderPromptClient:
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetMessageText() const OVERRIDE;
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetAcceptButtonText() const OVERRIDE;
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetCancelButtonText() const OVERRIDE;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldExpire(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details) const OVERRIDE;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Accept() OVERRIDE;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Cancel() OVERRIDE;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents_;
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const AdobeReaderPluginInfo reader_info_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_IMPLICIT_CONSTRUCTORS(PDFUnsupportedFeaturePromptClient);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPDFUnsupportedFeaturePromptClient::PDFUnsupportedFeaturePromptClient(
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* web_contents,
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const AdobeReaderPluginInfo& reader_info)
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : web_contents_(web_contents), reader_info_(reader_info) {
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RecordAction(reader_info_.is_installed ?
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        UserMetricsAction("PDF_UseReaderInfoBarShown") :
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        UserMetricsAction("PDF_InstallReaderInfoBarShown"));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPDFUnsupportedFeaturePromptClient::~PDFUnsupportedFeaturePromptClient() {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 PDFUnsupportedFeaturePromptClient::GetMessageText() const {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_MESSAGE);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 PDFUnsupportedFeaturePromptClient::GetAcceptButtonText() const {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::IsMetroProcess())
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_PDF_BUBBLE_METRO_MODE_LINK);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return l10n_util::GetStringUTF16(
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      reader_info_.is_installed ? IDS_PDF_BUBBLE_OPEN_IN_READER_LINK
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                : IDS_PDF_BUBBLE_INSTALL_READER_LINK);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::string16 PDFUnsupportedFeaturePromptClient::GetCancelButtonText() const {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_DONE);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool PDFUnsupportedFeaturePromptClient::ShouldExpire(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::LoadCommittedDetails& details) const {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !details.is_in_page;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PDFUnsupportedFeaturePromptClient::Accept() {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::IsMetroProcess()) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::AttemptRestartWithModeSwitch();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!reader_info_.is_installed) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RecordAction(UserMetricsAction("PDF_InstallReaderInfoBarOK"));
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OpenReaderUpdateURL(web_contents_);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarOK"));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!reader_info_.is_secure) {
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    new PDFUnsupportedFeatureInterstitial(web_contents_,
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                          reader_info_.plugin_info);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile =
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pdf::OpenPDFInReaderPromptClient* client =
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new PDFEnableAdobeReaderPromptClient(profile);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  OpenUsingReader(web_contents_, reader_info_.plugin_info, client);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PDFUnsupportedFeaturePromptClient::Cancel() {
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::RecordAction(reader_info_.is_installed ?
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        UserMetricsAction("PDF_UseReaderInfoBarCancel") :
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        UserMetricsAction("PDF_InstallReaderInfoBarCancel"));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid MaybeShowOpenPDFInReaderPrompt(WebContents* web_contents,
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    const AdobeReaderPluginInfo& reader_info) {
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If the Reader plugin is disabled by policy, don't prompt them.
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!reader_info.is_installed || !reader_info.is_enabled)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<pdf::OpenPDFInReaderPromptClient> prompt(
3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new PDFUnsupportedFeaturePromptClient(web_contents, reader_info));
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pdf::PDFWebContentsHelper* pdf_tab_helper =
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pdf::PDFWebContentsHelper::FromWebContents(web_contents);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pdf_tab_helper->ShowOpenInReaderPrompt(prompt.Pass());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GotPluginsCallback(int process_id,
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        int routing_id,
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        const AdobeReaderPluginInfo& reader_info) {
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebContents* web_contents =
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      tab_util::GetWebContentsByID(process_id, routing_id);
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (web_contents)
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MaybeShowOpenPDFInReaderPrompt(web_contents, reader_info);
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // defined(OS_WIN)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PDFHasUnsupportedFeature(WebContents* web_contents) {
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only works for Windows for now.  For Mac, we'll have to launch the file
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // externally since Adobe Reader doesn't work inside Chrome.
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Profile* profile =
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Profile::FromBrowserContext(web_contents->GetBrowserContext());
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AdobeReaderPluginInfo reader_info;
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (GetAdobeReaderPluginInfo(profile, &reader_info)) {
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MaybeShowOpenPDFInReaderPrompt(web_contents, reader_info);
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetAdobeReaderPluginInfoAsync(
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile,
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&GotPluginsCallback,
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 web_contents->GetRenderProcessHost()->GetID(),
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                 web_contents->GetRenderViewHost()->GetRoutingID()));
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // defined(OS_WIN)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
368