Index: chrome/browser/pdf_unsupported_feature.cc |
=================================================================== |
--- chrome/browser/pdf_unsupported_feature.cc (revision 72573) |
+++ chrome/browser/pdf_unsupported_feature.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include "base/utf_string_conversions.h" |
#include "base/values.h" |
#include "base/version.h" |
+#include "chrome/browser/metrics/user_metrics.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" |
@@ -14,6 +15,7 @@ |
#include "chrome/browser/tab_contents/interstitial_page.h" |
#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/common/jstemplate_builder.h" |
+#include "chrome/common/pepper_plugin_registry.h" |
#include "grit/browser_resources.h" |
#include "grit/generated_resources.h" |
#include "ui/base/l10n/l10n_util.h" |
@@ -31,6 +33,75 @@ |
namespace { |
+// The info bar delegate used to ask the user if they want to use Adobe Reader |
+// by default. |
+class PDFEnableAdobeReaderConfirmInfoBarDelegate |
+ : public ConfirmInfoBarDelegate { |
+ public: |
+ PDFEnableAdobeReaderConfirmInfoBarDelegate( |
+ TabContents* tab_contents) |
+ : ConfirmInfoBarDelegate(tab_contents) { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_EnableReaderInfoBarShown")); |
+ } |
+ |
+ // ConfirmInfoBarDelegate |
+ virtual void InfoBarClosed() { |
+ delete this; |
+ } |
+ |
+ virtual void InfoBarDismissed() { |
+ Cancel(); |
+ } |
+ |
+ virtual Type GetInfoBarType() const { |
+ return PAGE_ACTION_TYPE; |
+ } |
+ |
+ virtual bool Accept() { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_EnableReaderInfoBarOK")); |
+ webkit::npapi::PluginList::Singleton()->EnableGroup( |
+ false, ASCIIToUTF16(PepperPluginRegistry::kPDFPluginName)); |
+ webkit::npapi::PluginList::Singleton()->EnableGroup( |
+ true, ASCIIToUTF16(webkit::npapi::PluginGroup::kAdobeReaderGroupName)); |
+ return true; |
+ } |
+ |
+ virtual bool Cancel() { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_EnableReaderInfoBarCancel")); |
+ 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( |
+ IDS_PDF_INFOBAR_QUESTION_ALWAYS_USE_READER); |
+ } |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(PDFEnableAdobeReaderConfirmInfoBarDelegate); |
+}; |
+ |
// Launch the url to get the latest Adbobe Reader installer. |
void OpenReaderUpdateURL(TabContents* tab) { |
tab->OpenURL(GURL(PluginGroup::kAdobeReaderUpdateURL), GURL(), CURRENT_TAB, |
@@ -38,15 +109,30 @@ |
} |
// Opens the PDF using Adobe Reader. |
-void OpenUsingReader(TabContents* tab, const WebPluginInfo& reader_plugin) { |
+void OpenUsingReader(TabContents* tab, |
+ const WebPluginInfo& reader_plugin, |
+ InfoBarDelegate* old_delegate) { |
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; |
+ // The plugin is disabled, so enable it to get around the renderer check. |
+ // Also give it a new version so that the renderer doesn't show the blocked |
+ // plugin UI if it's vulnerable, since we already went through the |
+ // interstitial. |
+ plugin.plugin.enabled = WebPluginInfo::USER_ENABLED; |
+ plugin.plugin.version = ASCIIToUTF16("11.0.0.0"); |
PluginService::GetInstance()->OverridePluginForTab(plugin); |
tab->render_view_host()->ReloadFrame(); |
+ |
+ InfoBarDelegate* bar = new PDFEnableAdobeReaderConfirmInfoBarDelegate(tab); |
+ if (old_delegate) { |
+ tab->ReplaceInfoBar(old_delegate, bar); |
+ } else { |
+ tab->AddInfoBar(bar); |
+ } |
} |
// An interstitial to be used when the user chooses to open a PDF using Adobe |
@@ -58,6 +144,7 @@ |
const WebPluginInfo& reader_webplugininfo) |
: InterstitialPage(tab, false, tab->GetURL()), |
reader_webplugininfo_(reader_webplugininfo) { |
+ UserMetrics::RecordAction(UserMetricsAction("PDF_ReaderInterstitialShown")); |
} |
protected: |
@@ -92,14 +179,20 @@ |
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") { |
- OpenUsingReader(tab(), reader_webplugininfo_); |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_ReaderInterstitialIgnore")); |
+ OpenUsingReader(tab(), reader_webplugininfo_, NULL); |
} else { |
NOTREACHED(); |
} |
@@ -125,6 +218,7 @@ |
reader_installed_(!!reader_group), |
reader_vulnerable_(false) { |
if (reader_installed_) { |
+ UserMetrics::RecordAction(UserMetricsAction("PDF_UseReaderInfoBarShown")); |
std::vector<WebPluginInfo> plugins = reader_group->web_plugin_infos(); |
DCHECK_EQ(plugins.size(), 1u); |
reader_webplugininfo_ = plugins[0]; |
@@ -138,6 +232,9 @@ |
reader_vulnerable_ = true; |
} |
} |
+ } else { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_InstallReaderInfoBarShown")); |
} |
} |
@@ -145,16 +242,53 @@ |
virtual void InfoBarClosed() { |
delete this; |
} |
- virtual Type GetInfoBarType() { |
+ |
+ virtual void InfoBarDismissed() { |
+ Cancel(); |
+ } |
+ |
+ virtual Type GetInfoBarType() const { |
return PAGE_ACTION_TYPE; |
} |
+ |
virtual bool Accept() { |
- LaunchReader(); |
+ if (!reader_installed_) { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_InstallReaderInfoBarOK")); |
+ OpenReaderUpdateURL(tab_contents_); |
+ return true; |
+ } |
+ |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_UseReaderInfoBarOK")); |
+ |
+ if (reader_vulnerable_) { |
+ PDFUnsupportedFeatureInterstitial* interstitial = new |
+ PDFUnsupportedFeatureInterstitial( |
+ tab_contents_, reader_webplugininfo_); |
+ interstitial->Show(); |
+ return true; |
+ } |
+ |
+ OpenUsingReader(tab_contents_, reader_webplugininfo_, this); |
+ return false; |
+ } |
+ |
+ virtual bool Cancel() { |
+ if (reader_installed_) { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_UseReaderInfoBarCancel")); |
+ } else { |
+ UserMetrics::RecordAction( |
+ UserMetricsAction("PDF_InstallReaderInfoBarCancel")); |
+ } |
return true; |
} |
+ |
virtual int GetButtons() const { |
return BUTTON_OK | BUTTON_CANCEL; |
} |
+ |
virtual string16 GetButtonLabel(InfoBarButton button) const { |
switch (button) { |
case BUTTON_OK: |
@@ -169,6 +303,7 @@ |
return string16(); |
} |
} |
+ |
virtual string16 GetMessageText() const { |
return l10n_util::GetStringUTF16(reader_installed_ ? |
IDS_PDF_INFOBAR_QUESTION_READER_INSTALLED : |
@@ -176,23 +311,6 @@ |
} |
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_; |
@@ -209,12 +327,16 @@ |
// externally since Adobe Reader doesn't work inside Chrome. |
return; |
#endif |
+ string16 reader_group_name(ASCIIToUTF16(PluginGroup::kAdobeReaderGroupName)); |
+ // If the Reader plugin is disabled by policy, don't prompt them. |
+ if (PluginGroup::IsPluginNameDisabledByPolicy(reader_group_name)) |
+ return; |
+ |
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]; |
@@ -222,10 +344,6 @@ |
} |
} |
- // 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)); |
} |