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