| Index: chrome/browser/pdf_unsupported_feature.cc
|
| diff --git a/chrome/browser/pdf_unsupported_feature.cc b/chrome/browser/pdf_unsupported_feature.cc
|
| deleted file mode 100644
|
| index 8b7183c5f42f35d8c43735712638bb03a022e407..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/pdf_unsupported_feature.cc
|
| +++ /dev/null
|
| @@ -1,407 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/pdf_unsupported_feature.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/utf_string_conversions.h"
|
| -#include "base/values.h"
|
| -#include "base/version.h"
|
| -#include "chrome/browser/chrome_plugin_service_filter.h"
|
| -#include "chrome/browser/infobars/infobar_tab_helper.h"
|
| -#include "chrome/browser/plugin_prefs.h"
|
| -#include "chrome/browser/prefs/pref_service.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/tab_contents/chrome_interstitial_page.h"
|
| -#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
|
| -#include "chrome/browser/tab_contents/tab_util.h"
|
| -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
|
| -#include "chrome/common/chrome_content_client.h"
|
| -#include "chrome/common/jstemplate_builder.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "content/browser/plugin_service.h"
|
| -#include "content/browser/renderer_host/render_view_host.h"
|
| -#include "content/browser/user_metrics.h"
|
| -#include "grit/browser_resources.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "grit/theme_resources_standard.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/image/image.h"
|
| -#include "webkit/plugins/npapi/plugin_group.h"
|
| -
|
| -using webkit::npapi::PluginGroup;
|
| -using webkit::WebPluginInfo;
|
| -
|
| -namespace {
|
| -
|
| -// Only launch Adobe Reader X or later.
|
| -static const uint16 kMinReaderVersionToUse = 10;
|
| -
|
| -static const char kReaderUpdateUrl[] =
|
| - "http://www.adobe.com/go/getreader_chrome";
|
| -
|
| -// The info bar delegate used to ask the user if they want to use Adobe Reader
|
| -// by default. We want the infobar to have [No][Yes], so we swap the text on
|
| -// the buttons, and the meaning of the delegate callbacks.
|
| -class PDFEnableAdobeReaderInfoBarDelegate : public ConfirmInfoBarDelegate {
|
| - public:
|
| - explicit PDFEnableAdobeReaderInfoBarDelegate(
|
| - InfoBarTabHelper* infobar_helper,
|
| - Profile* profile);
|
| - virtual ~PDFEnableAdobeReaderInfoBarDelegate();
|
| -
|
| - // ConfirmInfoBarDelegate
|
| - virtual void InfoBarDismissed() OVERRIDE;
|
| - virtual Type GetInfoBarType() const OVERRIDE;
|
| - virtual bool Accept() OVERRIDE;
|
| - virtual bool Cancel() OVERRIDE;
|
| - virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
|
| - virtual string16 GetMessageText() const OVERRIDE;
|
| -
|
| - private:
|
| - void OnYes();
|
| - void OnNo();
|
| -
|
| - Profile* profile_;
|
| -
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(PDFEnableAdobeReaderInfoBarDelegate);
|
| -};
|
| -
|
| -PDFEnableAdobeReaderInfoBarDelegate::PDFEnableAdobeReaderInfoBarDelegate(
|
| - InfoBarTabHelper* infobar_helper, Profile* profile)
|
| - : ConfirmInfoBarDelegate(infobar_helper),
|
| - profile_(profile) {
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarShown"));
|
| -}
|
| -
|
| -PDFEnableAdobeReaderInfoBarDelegate::~PDFEnableAdobeReaderInfoBarDelegate() {
|
| -}
|
| -
|
| -void PDFEnableAdobeReaderInfoBarDelegate::InfoBarDismissed() {
|
| - OnNo();
|
| -}
|
| -
|
| -InfoBarDelegate::Type
|
| - PDFEnableAdobeReaderInfoBarDelegate::GetInfoBarType() const {
|
| - return PAGE_ACTION_TYPE;
|
| -}
|
| -
|
| -bool PDFEnableAdobeReaderInfoBarDelegate::Accept() {
|
| - profile_->GetPrefs()->SetBoolean(
|
| - prefs::kPluginsShowSetReaderDefaultInfobar, false);
|
| - OnNo();
|
| - return true;
|
| -}
|
| -
|
| -bool PDFEnableAdobeReaderInfoBarDelegate::Cancel() {
|
| - OnYes();
|
| - return true;
|
| -}
|
| -
|
| -string16 PDFEnableAdobeReaderInfoBarDelegate::GetButtonLabel(
|
| - InfoBarButton button) const {
|
| - return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
|
| - IDS_PDF_INFOBAR_NEVER_USE_READER_BUTTON :
|
| - IDS_PDF_INFOBAR_ALWAYS_USE_READER_BUTTON);
|
| -}
|
| -
|
| -string16 PDFEnableAdobeReaderInfoBarDelegate::GetMessageText() const {
|
| - return l10n_util::GetStringUTF16(IDS_PDF_INFOBAR_QUESTION_ALWAYS_USE_READER);
|
| -}
|
| -
|
| -void PDFEnableAdobeReaderInfoBarDelegate::OnYes() {
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarOK"));
|
| - PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile_);
|
| - plugin_prefs->EnablePluginGroup(
|
| - true, ASCIIToUTF16(webkit::npapi::PluginGroup::kAdobeReaderGroupName));
|
| - plugin_prefs->EnablePluginGroup(
|
| - false, ASCIIToUTF16(chrome::ChromeContentClient::kPDFPluginName));
|
| -}
|
| -
|
| -void PDFEnableAdobeReaderInfoBarDelegate::OnNo() {
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_EnableReaderInfoBarCancel"));
|
| -}
|
| -
|
| -// Launch the url to get the latest Adbobe Reader installer.
|
| -void OpenReaderUpdateURL(TabContents* tab) {
|
| - tab->OpenURL(GURL(kReaderUpdateUrl), GURL(), NEW_FOREGROUND_TAB,
|
| - content::PAGE_TRANSITION_LINK);
|
| -}
|
| -
|
| -// Opens the PDF using Adobe Reader.
|
| -void OpenUsingReader(TabContentsWrapper* tab,
|
| - const WebPluginInfo& reader_plugin,
|
| - InfoBarDelegate* old_delegate,
|
| - InfoBarDelegate* new_delegate) {
|
| - ChromePluginServiceFilter::GetInstance()->OverridePluginForTab(
|
| - tab->render_view_host()->process()->GetID(),
|
| - tab->render_view_host()->routing_id(),
|
| - tab->tab_contents()->GetURL(),
|
| - ASCIIToUTF16(PluginGroup::kAdobeReaderGroupName));
|
| - tab->render_view_host()->ReloadFrame();
|
| -
|
| - if (new_delegate) {
|
| - if (old_delegate) {
|
| - tab->infobar_tab_helper()->ReplaceInfoBar(old_delegate, new_delegate);
|
| - } else {
|
| - tab->infobar_tab_helper()->AddInfoBar(new_delegate);
|
| - }
|
| - }
|
| -}
|
| -
|
| -// An interstitial to be used when the user chooses to open a PDF using Adobe
|
| -// Reader, but it is out of date.
|
| -class PDFUnsupportedFeatureInterstitial : public ChromeInterstitialPage {
|
| - public:
|
| - PDFUnsupportedFeatureInterstitial(
|
| - TabContentsWrapper* tab,
|
| - const WebPluginInfo& reader_webplugininfo)
|
| - : ChromeInterstitialPage(
|
| - tab->tab_contents(), false, tab->tab_contents()->GetURL()),
|
| - tab_contents_(tab),
|
| - reader_webplugininfo_(reader_webplugininfo) {
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_ReaderInterstitialShown"));
|
| - }
|
| -
|
| - protected:
|
| - // ChromeInterstitialPage implementation.
|
| - virtual std::string GetHTMLContents() {
|
| - DictionaryValue strings;
|
| - strings.SetString(
|
| - "title",
|
| - l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_TITLE));
|
| - strings.SetString(
|
| - "headLine",
|
| - l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_BODY));
|
| - strings.SetString(
|
| - "update",
|
| - l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_UPDATE));
|
| - strings.SetString(
|
| - "open_with_reader",
|
| - l10n_util::GetStringUTF16(
|
| - IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_PROCEED));
|
| - strings.SetString(
|
| - "ok",
|
| - l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_OK));
|
| - strings.SetString(
|
| - "cancel",
|
| - l10n_util::GetStringUTF16(IDS_READER_OUT_OF_DATE_BLOCKING_PAGE_CANCEL));
|
| -
|
| - base::StringPiece html(ResourceBundle::GetSharedInstance().
|
| - GetRawDataResource(IDR_READER_OUT_OF_DATE_HTML));
|
| -
|
| - return jstemplate_builder::GetI18nTemplateHtml(html, &strings);
|
| - }
|
| -
|
| - virtual void CommandReceived(const std::string& command) {
|
| - if (command == "0") {
|
| - UserMetrics::RecordAction(
|
| - UserMetricsAction("PDF_ReaderInterstitialCancel"));
|
| - DontProceed();
|
| - return;
|
| - }
|
| -
|
| - if (command == "1") {
|
| - UserMetrics::RecordAction(
|
| - UserMetricsAction("PDF_ReaderInterstitialUpdate"));
|
| - OpenReaderUpdateURL(tab());
|
| - } else if (command == "2") {
|
| - UserMetrics::RecordAction(
|
| - UserMetricsAction("PDF_ReaderInterstitialIgnore"));
|
| - OpenUsingReader(tab_contents_, reader_webplugininfo_, NULL, NULL);
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| - Proceed();
|
| - }
|
| -
|
| - private:
|
| - TabContentsWrapper* tab_contents_;
|
| - WebPluginInfo reader_webplugininfo_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PDFUnsupportedFeatureInterstitial);
|
| -};
|
| -
|
| -// The info bar delegate used to inform the user that we don't support a feature
|
| -// in the PDF. See the comment about how we swap buttons for
|
| -// PDFEnableAdobeReaderInfoBarDelegate.
|
| -class PDFUnsupportedFeatureInfoBarDelegate : public ConfirmInfoBarDelegate {
|
| - public:
|
| - // |reader_group| is NULL if Adobe Reader isn't installed.
|
| - PDFUnsupportedFeatureInfoBarDelegate(TabContentsWrapper* tab_contents,
|
| - const PluginGroup* reader_group);
|
| - virtual ~PDFUnsupportedFeatureInfoBarDelegate();
|
| -
|
| - // ConfirmInfoBarDelegate
|
| - virtual void InfoBarDismissed() OVERRIDE;
|
| - virtual gfx::Image* GetIcon() const OVERRIDE;
|
| - virtual Type GetInfoBarType() const OVERRIDE;
|
| - virtual bool Accept() OVERRIDE;
|
| - virtual bool Cancel() OVERRIDE;
|
| - virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
|
| - virtual string16 GetMessageText() const OVERRIDE;
|
| -
|
| - private:
|
| - bool OnYes();
|
| - void OnNo();
|
| -
|
| - TabContentsWrapper* tab_contents_;
|
| - bool reader_installed_;
|
| - bool reader_vulnerable_;
|
| - WebPluginInfo reader_webplugininfo_;
|
| -
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(PDFUnsupportedFeatureInfoBarDelegate);
|
| -};
|
| -
|
| -PDFUnsupportedFeatureInfoBarDelegate::PDFUnsupportedFeatureInfoBarDelegate(
|
| - TabContentsWrapper* tab_contents,
|
| - const PluginGroup* reader_group)
|
| - : ConfirmInfoBarDelegate(tab_contents->infobar_tab_helper()),
|
| - tab_contents_(tab_contents),
|
| - reader_installed_(!!reader_group),
|
| - reader_vulnerable_(false) {
|
| - if (!reader_installed_) {
|
| - UserMetrics::RecordAction(
|
| - UserMetricsAction("PDF_InstallReaderInfoBarShown"));
|
| - return;
|
| - }
|
| -
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarShown"));
|
| - const std::vector<WebPluginInfo>& plugins =
|
| - reader_group->web_plugin_infos();
|
| - DCHECK_EQ(plugins.size(), 1u);
|
| - reader_webplugininfo_ = plugins[0];
|
| -
|
| - reader_vulnerable_ = reader_group->IsVulnerable(reader_webplugininfo_);
|
| - if (!reader_vulnerable_) {
|
| - scoped_ptr<Version> version(PluginGroup::CreateVersionFromString(
|
| - reader_webplugininfo_.version));
|
| - reader_vulnerable_ =
|
| - version.get() && (version->components()[0] < kMinReaderVersionToUse);
|
| - }
|
| -}
|
| -
|
| -PDFUnsupportedFeatureInfoBarDelegate::~PDFUnsupportedFeatureInfoBarDelegate() {
|
| -}
|
| -
|
| -void PDFUnsupportedFeatureInfoBarDelegate::InfoBarDismissed() {
|
| - OnNo();
|
| -}
|
| -
|
| -gfx::Image* PDFUnsupportedFeatureInfoBarDelegate::GetIcon() const {
|
| - return &ResourceBundle::GetSharedInstance().GetNativeImageNamed(
|
| - IDR_INFOBAR_INCOMPLETE);
|
| -}
|
| -
|
| -InfoBarDelegate::Type
|
| - PDFUnsupportedFeatureInfoBarDelegate::GetInfoBarType() const {
|
| - return PAGE_ACTION_TYPE;
|
| -}
|
| -
|
| -bool PDFUnsupportedFeatureInfoBarDelegate::Accept() {
|
| - OnNo();
|
| - return true;
|
| -}
|
| -
|
| -bool PDFUnsupportedFeatureInfoBarDelegate::Cancel() {
|
| - return OnYes();
|
| -}
|
| -
|
| -string16 PDFUnsupportedFeatureInfoBarDelegate::GetButtonLabel(
|
| - InfoBarButton button) const {
|
| - return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
|
| - IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL :
|
| - IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL);
|
| -}
|
| -
|
| -string16 PDFUnsupportedFeatureInfoBarDelegate::GetMessageText() const {
|
| - return l10n_util::GetStringUTF16(reader_installed_ ?
|
| - IDS_PDF_INFOBAR_QUESTION_READER_INSTALLED :
|
| - IDS_PDF_INFOBAR_QUESTION_READER_NOT_INSTALLED);
|
| -}
|
| -
|
| -bool PDFUnsupportedFeatureInfoBarDelegate::OnYes() {
|
| - if (!reader_installed_) {
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_InstallReaderInfoBarOK"));
|
| - OpenReaderUpdateURL(tab_contents_->tab_contents());
|
| - return true;
|
| - }
|
| -
|
| - UserMetrics::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarOK"));
|
| -
|
| - if (reader_vulnerable_) {
|
| - PDFUnsupportedFeatureInterstitial* interstitial =
|
| - new PDFUnsupportedFeatureInterstitial(tab_contents_,
|
| - reader_webplugininfo_);
|
| - interstitial->Show();
|
| - return true;
|
| - }
|
| -
|
| - if (tab_contents_->profile()->GetPrefs()->GetBoolean(
|
| - prefs::kPluginsShowSetReaderDefaultInfobar)) {
|
| - InfoBarDelegate* bar = new PDFEnableAdobeReaderInfoBarDelegate(
|
| - tab_contents_->infobar_tab_helper(), tab_contents_->profile());
|
| - OpenUsingReader(tab_contents_, reader_webplugininfo_, this, bar);
|
| - return false;
|
| - }
|
| -
|
| - OpenUsingReader(tab_contents_, reader_webplugininfo_, NULL, NULL);
|
| - return true;
|
| -}
|
| -
|
| -void PDFUnsupportedFeatureInfoBarDelegate::OnNo() {
|
| - UserMetrics::RecordAction(reader_installed_ ?
|
| - UserMetricsAction("PDF_UseReaderInfoBarCancel") :
|
| - UserMetricsAction("PDF_InstallReaderInfoBarCancel"));
|
| -}
|
| -
|
| -void GotPluginGroupsCallback(int process_id,
|
| - int routing_id,
|
| - const std::vector<PluginGroup>& groups) {
|
| - TabContents* tab_contents =
|
| - tab_util::GetTabContentsByID(process_id, routing_id);
|
| - if (!tab_contents)
|
| - return;
|
| -
|
| - TabContentsWrapper* tab =
|
| - TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
|
| - if (!tab)
|
| - return;
|
| -
|
| - string16 reader_group_name(ASCIIToUTF16(PluginGroup::kAdobeReaderGroupName));
|
| -
|
| - // If the Reader plugin is disabled by policy, don't prompt them.
|
| - PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(tab->profile());
|
| - if (plugin_prefs->PolicyStatusForPlugin(reader_group_name) ==
|
| - PluginPrefs::POLICY_DISABLED) {
|
| - return;
|
| - }
|
| -
|
| - const PluginGroup* reader_group = NULL;
|
| - for (size_t i = 0; i < groups.size(); ++i) {
|
| - if (groups[i].GetGroupName() == reader_group_name) {
|
| - reader_group = &groups[i];
|
| - break;
|
| - }
|
| - }
|
| -
|
| - tab->infobar_tab_helper()->AddInfoBar(
|
| - new PDFUnsupportedFeatureInfoBarDelegate(tab, reader_group));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void PDFHasUnsupportedFeature(TabContentsWrapper* tab) {
|
| -#if !defined(OS_WIN)
|
| - // Only works for Windows for now. For Mac, we'll have to launch the file
|
| - // externally since Adobe Reader doesn't work inside Chrome.
|
| - return;
|
| -#endif
|
| -
|
| - PluginService::GetInstance()->GetPluginGroups(
|
| - base::Bind(&GotPluginGroupsCallback,
|
| - tab->render_view_host()->process()->GetID(),
|
| - tab->render_view_host()->routing_id()));
|
| -}
|
|
|