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