Index: chrome/browser/pdf_unsupported_feature.cc |
=================================================================== |
--- chrome/browser/pdf_unsupported_feature.cc (revision 0) |
+++ chrome/browser/pdf_unsupported_feature.cc (revision 0) |
@@ -0,0 +1,231 @@ |
+// 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 "app/l10n_util.h" |
+#include "app/resource_bundle.h" |
+#include "base/utf_string_conversions.h" |
+#include "base/values.h" |
+#include "base/version.h" |
+#include "chrome/browser/plugin_service.h" |
+#include "chrome/browser/renderer_host/render_process_host.h" |
+#include "chrome/browser/renderer_host/render_view_host.h" |
+#include "chrome/browser/tab_contents/infobar_delegate.h" |
+#include "chrome/browser/tab_contents/interstitial_page.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/common/jstemplate_builder.h" |
+#include "grit/browser_resources.h" |
+#include "grit/generated_resources.h" |
+#include "webkit/plugins/npapi/plugin_group.h" |
+#include "webkit/plugins/npapi/plugin_list.h" |
+#include "webkit/plugins/npapi/webplugininfo.h" |
+ |
+using webkit::npapi::PluginGroup; |
+using webkit::npapi::PluginList; |
+using webkit::npapi::WebPluginInfo; |
+ |
+// Only launch Adobe Reader X or later. |
+static const uint16 kMinReaderVersionToUse = 10; |
+ |
+namespace { |
+ |
+// Launch the url to get the latest Adbobe Reader installer. |
+void OpenReaderUpdateURL(TabContents* tab) { |
+ tab->OpenURL(GURL(PluginGroup::kAdobeReaderUpdateURL), GURL(), CURRENT_TAB, |
+ PageTransition::LINK); |
+} |
+ |
+// Opens the PDF using Adobe Reader. |
+void OpenUsingReader(TabContents* tab, const WebPluginInfo& reader_plugin) { |
+ PluginService::OverriddenPlugin plugin; |
+ plugin.render_process_id = tab->GetRenderProcessHost()->id(); |
+ plugin.render_view_id = tab->render_view_host()->routing_id(); |
+ plugin.url = tab->GetURL(); |
+ plugin.plugin = reader_plugin; |
+ |
+ PluginService::GetInstance()->OverridePluginForTab(plugin); |
+ tab->render_view_host()->ReloadFrame(); |
+} |
+ |
+// 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 InterstitialPage { |
+ public: |
+ PDFUnsupportedFeatureInterstitial( |
+ TabContents* tab, |
+ const WebPluginInfo& reader_webplugininfo) |
+ : InterstitialPage(tab, false, tab->GetURL()), |
+ reader_webplugininfo_(reader_webplugininfo) { |
+ } |
+ |
+ protected: |
+ // InterstitialPage 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") { |
+ DontProceed(); |
+ return; |
+ } |
+ |
+ if (command == "1") { |
+ OpenReaderUpdateURL(tab()); |
+ } else if (command == "2") { |
+ OpenUsingReader(tab(), reader_webplugininfo_); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ Proceed(); |
+ } |
+ |
+ private: |
+ 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. |
+class PDFUnsupportedFeatureConfirmInfoBarDelegate |
+ : public ConfirmInfoBarDelegate { |
+ public: |
+ PDFUnsupportedFeatureConfirmInfoBarDelegate( |
+ TabContents* tab_contents, |
+ PluginGroup* reader_group) // NULL if Adobe Reader isn't installed. |
+ : ConfirmInfoBarDelegate(tab_contents), |
+ tab_contents_(tab_contents), |
+ reader_installed_(!!reader_group), |
+ reader_vulnerable_(false) { |
+ if (reader_installed_) { |
+ std::vector<WebPluginInfo> plugins = reader_group->web_plugin_infos(); |
+ DCHECK_EQ(plugins.size(), 1u); |
+ reader_webplugininfo_ = plugins[0]; |
+ |
+ reader_vulnerable_ = reader_group->IsVulnerable(); |
+ if (!reader_vulnerable_) { |
+ scoped_ptr<Version> version(PluginGroup::CreateVersionFromString( |
+ reader_webplugininfo_.version)); |
+ if (version.get()) { |
+ if (version->components()[0] < kMinReaderVersionToUse) |
+ reader_vulnerable_ = true; |
+ } |
+ } |
+ } |
+ } |
+ |
+ // ConfirmInfoBarDelegate |
+ virtual void InfoBarClosed() { |
+ delete this; |
+ } |
+ virtual Type GetInfoBarType() { |
+ return PAGE_ACTION_TYPE; |
+ } |
+ virtual bool Accept() { |
+ LaunchReader(); |
+ return true; |
+ } |
+ virtual int GetButtons() const { |
+ return BUTTON_OK | BUTTON_CANCEL; |
+ } |
+ virtual string16 GetButtonLabel(InfoBarButton button) const { |
+ switch (button) { |
+ case BUTTON_OK: |
+ return l10n_util::GetStringUTF16( |
+ IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL); |
+ case BUTTON_CANCEL: |
+ return l10n_util::GetStringUTF16( |
+ IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL); |
+ default: |
+ // All buttons are labeled above. |
+ NOTREACHED() << "Bad button id " << button; |
+ return string16(); |
+ } |
+ } |
+ virtual string16 GetMessageText() const { |
+ return l10n_util::GetStringUTF16(reader_installed_ ? |
+ IDS_PDF_INFOBAR_QUESTION_READER_INSTALLED : |
+ IDS_PDF_INFOBAR_QUESTION_READER_NOT_INSTALLED); |
+ } |
+ |
+ private: |
+ void LaunchReader() { |
+ if (!reader_installed_) { |
+ OpenReaderUpdateURL(tab_contents_); |
+ return; |
+ } |
+ |
+ if (reader_vulnerable_) { |
+ PDFUnsupportedFeatureInterstitial* interstitial = new |
+ PDFUnsupportedFeatureInterstitial( |
+ tab_contents_, reader_webplugininfo_); |
+ interstitial->Show(); |
+ return; |
+ } |
+ |
+ OpenUsingReader(tab_contents_, reader_webplugininfo_); |
+ } |
+ |
+ TabContents* tab_contents_; |
+ bool reader_installed_; |
+ bool reader_vulnerable_; |
+ WebPluginInfo reader_webplugininfo_; |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(PDFUnsupportedFeatureConfirmInfoBarDelegate); |
+}; |
+ |
+} // namespace |
+ |
+void PDFHasUnsupportedFeature(TabContents* 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 |
+ |
+ PluginGroup* reader_group = NULL; |
+ std::vector<PluginGroup> plugin_groups; |
+ PluginList::Singleton()->GetPluginGroups( |
+ false, &plugin_groups); |
+ string16 reader_group_name(UTF8ToUTF16(PluginGroup::kAdobeReaderGroupName)); |
+ for (size_t i = 0; i < plugin_groups.size(); ++i) { |
+ if (plugin_groups[i].GetGroupName() == reader_group_name) { |
+ reader_group = &plugin_groups[i]; |
+ break; |
+ } |
+ } |
+ |
+ // If the plugin is disabled by policy or by the user, don't prompt them. |
+ if (reader_group && !reader_group->Enabled()) |
+ return; |
+ |
+ tab->AddInfoBar(new PDFUnsupportedFeatureConfirmInfoBarDelegate( |
+ tab, reader_group)); |
+} |
Property changes on: chrome\browser\pdf_unsupported_feature.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |