diff options
Diffstat (limited to 'chrome/browser/extensions')
4 files changed, 158 insertions, 33 deletions
diff --git a/chrome/browser/extensions/extension_install_dialog.cc b/chrome/browser/extensions/extension_install_dialog.cc index 336c2c7..813e63b 100644 --- a/chrome/browser/extensions/extension_install_dialog.cc +++ b/chrome/browser/extensions/extension_install_dialog.cc @@ -67,8 +67,8 @@ void ShowExtensionInstallDialogForManifest( } ExtensionInstallUI::Prompt filled_out_prompt = prompt; - filled_out_prompt.permissions = - (*dummy_extension)->GetPermissionMessageStrings(); + filled_out_prompt.SetPermissions( + (*dummy_extension)->GetPermissionMessageStrings()); ShowExtensionInstallDialog(profile, delegate, diff --git a/chrome/browser/extensions/extension_install_ui.cc b/chrome/browser/extensions/extension_install_ui.cc index 77fc4a4..6fd551f 100644 --- a/chrome/browser/extensions/extension_install_ui.cc +++ b/chrome/browser/extensions/extension_install_ui.cc @@ -39,36 +39,31 @@ #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" -// static -const int ExtensionInstallUI::kTitleIds[NUM_PROMPT_TYPES] = { - IDS_EXTENSION_INSTALL_PROMPT_TITLE, +static const int kTitleIds[ExtensionInstallUI::NUM_PROMPT_TYPES] = { IDS_EXTENSION_INSTALL_PROMPT_TITLE, + IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE, IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE, IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE }; -// static -const int ExtensionInstallUI::kHeadingIds[NUM_PROMPT_TYPES] = { +static const int kHeadingIds[ExtensionInstallUI::NUM_PROMPT_TYPES] = { IDS_EXTENSION_INSTALL_PROMPT_HEADING, IDS_EXTENSION_INSTALL_PROMPT_HEADING, IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING, IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING }; -// static -const int ExtensionInstallUI::kButtonIds[NUM_PROMPT_TYPES] = { - IDS_EXTENSION_PROMPT_INSTALL_BUTTON, +static const int kAcceptButtonIds[ExtensionInstallUI::NUM_PROMPT_TYPES] = { IDS_EXTENSION_PROMPT_INSTALL_BUTTON, + IDS_EXTENSION_PROMPT_INLINE_INSTALL_BUTTON, IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON, IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON }; -// static -const int ExtensionInstallUI::kAbortButtonIds[NUM_PROMPT_TYPES] = { +static const int kAbortButtonIds[ExtensionInstallUI::NUM_PROMPT_TYPES] = { 0, 0, 0, IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON }; -// static -const int ExtensionInstallUI::kWarningIds[NUM_PROMPT_TYPES] = { +static const int kPermissionsHeaderIds[ExtensionInstallUI::NUM_PROMPT_TYPES] = { IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO, @@ -82,12 +77,116 @@ const int kIconSize = 69; } // namespace -ExtensionInstallUI::Prompt::Prompt(PromptType type) : type(type) { +ExtensionInstallUI::Prompt::Prompt(PromptType type) : type_(type) { } ExtensionInstallUI::Prompt::~Prompt() { } +void ExtensionInstallUI::Prompt::SetPermissions( + std::vector<string16> permissions) { + permissions_ = permissions; +} + +void ExtensionInstallUI::Prompt::SetInlineInstallWebstoreData( + std::string localized_user_count, + double average_rating, + int rating_count) { + CHECK_EQ(INLINE_INSTALL_PROMPT, type_); + localized_user_count_ = localized_user_count; + average_rating_ = average_rating; + rating_count_ = rating_count; +} + +string16 ExtensionInstallUI::Prompt::GetDialogTitle() const { + if (type_ == INLINE_INSTALL_PROMPT) { + return l10n_util::GetStringFUTF16( + kTitleIds[type_], l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); + } else { + return l10n_util::GetStringUTF16(kTitleIds[type_]); + } +} + +string16 ExtensionInstallUI::Prompt::GetHeading(std::string extension_name) + const { + if (type_ == INLINE_INSTALL_PROMPT) { + return UTF8ToUTF16(extension_name); + } else { + return l10n_util::GetStringFUTF16( + kHeadingIds[type_], UTF8ToUTF16(extension_name)); + } +} + +string16 ExtensionInstallUI::Prompt::GetAcceptButtonLabel() const { + return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]); +} + +bool ExtensionInstallUI::Prompt::HasAbortButtonLabel() const { + return kAbortButtonIds[type_] > 0; +} + +string16 ExtensionInstallUI::Prompt::GetAbortButtonLabel() const { + CHECK(HasAbortButtonLabel()); + return l10n_util::GetStringUTF16(kAbortButtonIds[type_]); +} + +string16 ExtensionInstallUI::Prompt::GetPermissionsHeader() const { + return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]); +} + +void ExtensionInstallUI::Prompt::AppendRatingStars( + StarAppender appender, void* data) const { + CHECK(appender); + CHECK_EQ(INLINE_INSTALL_PROMPT, type_); + int rating_integer = floor(average_rating_); + double rating_fractional = average_rating_ - rating_integer; + + if (rating_fractional > 0.66) { + rating_integer++; + } + + if (rating_fractional < 0.33 || rating_fractional > 0.66) { + rating_fractional = 0; + } + + int i; + for (i = 0; i < rating_integer; i++) { + appender(IDR_EXTENSIONS_RATING_STAR_ON, data); + } + if (rating_fractional) { + appender(IDR_EXTENSIONS_RATING_STAR_HALF_LEFT, data); + i++; + } + for (; i < kMaxExtensionRating; i++) { + appender(IDR_EXTENSIONS_RATING_STAR_OFF, data); + } +} + +string16 ExtensionInstallUI::Prompt::GetRatingCount() const { + CHECK_EQ(INLINE_INSTALL_PROMPT, type_); + return l10n_util::GetStringFUTF16( + IDS_EXTENSION_RATING_COUNT, + UTF8ToUTF16(base::IntToString(rating_count_))); +} + +string16 ExtensionInstallUI::Prompt::GetUserCount() const { + CHECK_EQ(INLINE_INSTALL_PROMPT, type_); + return l10n_util::GetStringFUTF16( + IDS_EXTENSION_USER_COUNT, + UTF8ToUTF16(localized_user_count_)); +} + +size_t ExtensionInstallUI::Prompt::GetPermissionCount() const { + CHECK_EQ(INLINE_INSTALL_PROMPT, type_); + return permissions_.size(); +} + +string16 ExtensionInstallUI::Prompt::GetPermission(int index) const { + CHECK_EQ(INLINE_INSTALL_PROMPT, type_); + return l10n_util::GetStringFUTF16( + IDS_EXTENSION_PERMISSION_LINE, permissions_[index]); +} + ExtensionInstallUI::ExtensionInstallUI(Profile* profile) : profile_(profile), ui_loop_(MessageLoop::current()), @@ -227,7 +326,7 @@ void ExtensionInstallUI::OnImageLoaded( NotificationService::NoDetails()); Prompt prompt(prompt_type_); - prompt.permissions = permissions_->GetWarningMessages(); + prompt.SetPermissions(permissions_->GetWarningMessages()); ShowExtensionInstallDialog( profile_, delegate_, extension_, &icon_, prompt); break; diff --git a/chrome/browser/extensions/extension_install_ui.h b/chrome/browser/extensions/extension_install_ui.h index 4cc10c2..18f69d3 100644 --- a/chrome/browser/extensions/extension_install_ui.h +++ b/chrome/browser/extensions/extension_install_ui.h @@ -37,35 +37,61 @@ class ExtensionInstallUI : public ImageLoadingTracker::Observer { }; // Extra information needed to display an installation or uninstallation - // prompt. - struct Prompt { + // prompt. Gets populated with raw data and exposes getters for formatted + // strings so that the GTK/views/Cocoa install dialogs don't have to repeat + // that logic. + class Prompt { + public: explicit Prompt(PromptType type); ~Prompt(); - PromptType type; + void SetPermissions(std::vector<string16> permissions); + void SetInlineInstallWebstoreData(std::string localized_user_count, + double average_rating, + int rating_count); + + PromptType type() const { return type_; } + + // Getters for UI element labels. + string16 GetDialogTitle() const; + string16 GetHeading(std::string extension_name) const; + string16 GetAcceptButtonLabel() const; + bool HasAbortButtonLabel() const; + string16 GetAbortButtonLabel() const; + string16 GetPermissionsHeader() const; + + // Getters for webstore metadata. Only populated when the type is + // INLINE_INSTALL_PROMPT. + + // The star display logic replicates the one used by the webstore (from + // components.ratingutils.setFractionalYellowStars). Callers pass in an + // "appender", which will be called back with the resource ID that they + // need to load/append. + typedef void*(*StarAppender)(int, void*); + void AppendRatingStars(StarAppender appender, void* data) const; + string16 GetRatingCount() const; + string16 GetUserCount() const; + size_t GetPermissionCount() const; + string16 GetPermission(int index) const; + + private: + PromptType type_; // Permissions that are being requested (may not be all of an extension's // permissions if only additional ones are being requested) - std::vector<string16> permissions; + std::vector<string16> permissions_; // These fields are populated only when the prompt type is // INLINE_INSTALL_PROMPT // Already formatted to be locale-specific. - std::string localized_user_count; + std::string localized_user_count_; // Range is kMinExtensionRating to kMaxExtensionRating - double average_rating; - int rating_count; + double average_rating_; + int rating_count_; }; static const int kMinExtensionRating = 0; static const int kMaxExtensionRating = 5; - // A mapping from PromptType to message ID for various dialog content. - static const int kTitleIds[NUM_PROMPT_TYPES]; - static const int kHeadingIds[NUM_PROMPT_TYPES]; - static const int kButtonIds[NUM_PROMPT_TYPES]; - static const int kWarningIds[NUM_PROMPT_TYPES]; - static const int kAbortButtonIds[NUM_PROMPT_TYPES]; - class Delegate { public: // We call this method to signal that the installation should continue. diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc index ffa8158..ad08d85 100644 --- a/chrome/browser/extensions/webstore_inline_installer.cc +++ b/chrome/browser/extensions/webstore_inline_installer.cc @@ -252,9 +252,9 @@ void WebstoreInlineInstaller::OnWebstoreParseSuccess( tab_contents_->browser_context()); ExtensionInstallUI::Prompt prompt(ExtensionInstallUI::INLINE_INSTALL_PROMPT); - prompt.localized_user_count = localized_user_count_; - prompt.average_rating = average_rating_; - prompt.rating_count = rating_count_; + prompt.SetInlineInstallWebstoreData(localized_user_count_, + average_rating_, + rating_count_); ShowExtensionInstallDialogForManifest(profile, this, |