| Index: chrome/browser/extensions/apps_promo.cc
|
| diff --git a/chrome/browser/extensions/apps_promo.cc b/chrome/browser/extensions/apps_promo.cc
|
| deleted file mode 100644
|
| index 0b5ce5689d6e7330b2e715fd8e2bedeb1263f557..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/apps_promo.cc
|
| +++ /dev/null
|
| @@ -1,385 +0,0 @@
|
| -// Copyright (c) 2012 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/extensions/apps_promo.h"
|
| -
|
| -#include "base/base64.h"
|
| -#include "base/command_line.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/prefs/pref_service.h"
|
| -#include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/common/chrome_notification_types.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/extensions/extension.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/common/url_constants.h"
|
| -#include "net/base/load_flags.h"
|
| -#include "net/url_request/url_fetcher.h"
|
| -#include "net/url_request/url_request_status.h"
|
| -
|
| -const int AppsPromo::kDefaultAppsCounterMax = 10;
|
| -
|
| -namespace {
|
| -
|
| -// The default logo for the promo.
|
| -const char kDefaultLogo[] = "chrome://theme/IDR_WEBSTORE_ICON";
|
| -
|
| -// The default promo data (this is only used for testing with
|
| -// --force-apps-promo-visible).
|
| -const char kDefaultHeader[] = "Browse thousands of apps and games for Chrome";
|
| -const char kDefaultButton[] = "Visit the Chrome Web Store";
|
| -const char kDefaultExpire[] = "No thanks";
|
| -const char kDefaultLink[] = "https://chrome.google.com/webstore";
|
| -
|
| -// Http success status code.
|
| -const int kHttpSuccess = 200;
|
| -
|
| -// The match pattern for valid logo URLs.
|
| -const char kValidLogoPattern[] = "https://*.google.com/*.png";
|
| -
|
| -// The prefix for 'data' URL images.
|
| -const char kPNGDataURLPrefix[] = "data:image/png;base64,";
|
| -
|
| -// Returns the string pref at |path|, using |fallback| as the default (if there
|
| -// is no pref value present). |fallback| is used for debugging in concert with
|
| -// --force-apps-promo-visible.
|
| -std::string GetStringPref(const char* path, const std::string& fallback) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - std::string retval(local_state->GetString(path));
|
| - if (retval.empty() && CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kForceAppsPromoVisible)) {
|
| - retval = fallback;
|
| - }
|
| - return retval;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -AppsPromo::PromoData::PromoData() : user_group(AppsPromo::USERS_NONE) {}
|
| -AppsPromo::PromoData::PromoData(const std::string& id,
|
| - const std::string& header,
|
| - const std::string& button,
|
| - const GURL& link,
|
| - const std::string& expire,
|
| - const GURL& logo,
|
| - const int user_group)
|
| - : id(id),
|
| - header(header),
|
| - button(button),
|
| - link(link),
|
| - expire(expire),
|
| - logo(logo),
|
| - user_group(user_group) {}
|
| -
|
| -AppsPromo::PromoData::~PromoData() {}
|
| -
|
| -// static
|
| -void AppsPromo::RegisterPrefs(PrefService* local_state) {
|
| - std::string empty;
|
| - local_state->RegisterBooleanPref(prefs::kNtpWebStoreEnabled, false);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoId, empty);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoHeader, empty);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoButton, empty);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoLink, empty);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoLogo, empty);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoLogoSource, empty);
|
| - local_state->RegisterStringPref(prefs::kNtpWebStorePromoExpire, empty);
|
| - local_state->RegisterIntegerPref(prefs::kNtpWebStorePromoUserGroup, 0);
|
| -}
|
| -
|
| -// static
|
| -void AppsPromo::RegisterUserPrefs(PrefService* prefs) {
|
| - // Set the default value for the counter to max+1 since we don't install
|
| - // default apps for new users.
|
| - prefs->RegisterIntegerPref(prefs::kAppsPromoCounter,
|
| - kDefaultAppsCounterMax + 1,
|
| - PrefService::UNSYNCABLE_PREF);
|
| - prefs->RegisterBooleanPref(prefs::kDefaultAppsInstalled,
|
| - false,
|
| - PrefService::UNSYNCABLE_PREF);
|
| - prefs->RegisterStringPref(prefs::kNtpWebStorePromoLastId,
|
| - std::string(),
|
| - PrefService::UNSYNCABLE_PREF);
|
| - prefs->RegisterBooleanPref(prefs::kNtpHideWebStorePromo,
|
| - false,
|
| - PrefService::UNSYNCABLE_PREF);
|
| -}
|
| -
|
| -// static
|
| -bool AppsPromo::IsPromoSupportedForLocale() {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - // PromoResourceService will clear the promo data if the current locale is
|
| - // not supported.
|
| - return local_state->HasPrefPath(prefs::kNtpWebStorePromoId) &&
|
| - local_state->HasPrefPath(prefs::kNtpWebStorePromoHeader) &&
|
| - local_state->HasPrefPath(prefs::kNtpWebStorePromoButton) &&
|
| - local_state->HasPrefPath(prefs::kNtpWebStorePromoLink) &&
|
| - local_state->HasPrefPath(prefs::kNtpWebStorePromoLogo) &&
|
| - local_state->HasPrefPath(prefs::kNtpWebStorePromoExpire) &&
|
| - local_state->HasPrefPath(prefs::kNtpWebStorePromoUserGroup);
|
| -}
|
| -
|
| -// static
|
| -bool AppsPromo::IsWebStoreSupportedForLocale() {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - return local_state->GetBoolean(prefs::kNtpWebStoreEnabled);
|
| -}
|
| -
|
| -// static
|
| -void AppsPromo::SetWebStoreSupportedForLocale(bool supported) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - local_state->SetBoolean(prefs::kNtpWebStoreEnabled, supported);
|
| -}
|
| -
|
| -// static
|
| -void AppsPromo::ClearPromo() {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - local_state->ClearPref(prefs::kNtpWebStoreEnabled);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoId);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoHeader);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoButton);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoLink);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoLogo);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoLogoSource);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoExpire);
|
| - local_state->ClearPref(prefs::kNtpWebStorePromoUserGroup);
|
| -}
|
| -
|
| -// static
|
| -AppsPromo::PromoData AppsPromo::GetPromo() {
|
| - PromoData data;
|
| - PrefService* local_state = g_browser_process->local_state();
|
| -
|
| - data.id = GetStringPref(prefs::kNtpWebStorePromoId, "");
|
| - data.link = GURL(GetStringPref(prefs::kNtpWebStorePromoLink, kDefaultLink));
|
| - data.user_group = local_state->GetInteger(prefs::kNtpWebStorePromoUserGroup);
|
| - data.header = GetStringPref(prefs::kNtpWebStorePromoHeader, kDefaultHeader);
|
| - data.button = GetStringPref(prefs::kNtpWebStorePromoButton, kDefaultButton);
|
| - data.expire = GetStringPref(prefs::kNtpWebStorePromoExpire, kDefaultExpire);
|
| -
|
| - GURL logo_url(local_state->GetString(prefs::kNtpWebStorePromoLogo));
|
| - if (logo_url.is_valid() && logo_url.SchemeIs(chrome::kDataScheme))
|
| - data.logo = logo_url;
|
| - else
|
| - data.logo = GURL(kDefaultLogo);
|
| -
|
| - return data;
|
| -}
|
| -
|
| -// static
|
| -void AppsPromo::SetPromo(const AppsPromo::PromoData& data) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - local_state->SetString(prefs::kNtpWebStorePromoId, data.id);
|
| - local_state->SetString(prefs::kNtpWebStorePromoButton, data.button);
|
| - local_state->SetString(prefs::kNtpWebStorePromoHeader, data.header);
|
| - local_state->SetString(prefs::kNtpWebStorePromoLink, data.link.spec());
|
| - local_state->SetString(prefs::kNtpWebStorePromoLogo, data.logo.spec());
|
| - local_state->SetString(prefs::kNtpWebStorePromoExpire, data.expire);
|
| - local_state->SetInteger(prefs::kNtpWebStorePromoUserGroup, data.user_group);
|
| -}
|
| -
|
| -// static
|
| -GURL AppsPromo::GetSourcePromoLogoURL() {
|
| - return GURL(GetStringPref(prefs::kNtpWebStorePromoLogoSource, ""));
|
| -}
|
| -
|
| -// static
|
| -void AppsPromo::SetSourcePromoLogoURL(const GURL& logo_source) {
|
| - PrefService* local_state = g_browser_process->local_state();
|
| - local_state->SetString(prefs::kNtpWebStorePromoLogoSource,
|
| - logo_source.spec());
|
| -}
|
| -
|
| -AppsPromo::AppsPromo(PrefService* prefs)
|
| - : prefs_(prefs) {
|
| - // Poppit, Entanglement
|
| - old_default_app_ids_.insert("mcbkbpnkkkipelfledbfocopglifcfmi");
|
| - old_default_app_ids_.insert("aciahcmjmecflokailenpkdchphgkefd");
|
| -}
|
| -
|
| -AppsPromo::~AppsPromo() {}
|
| -
|
| -bool AppsPromo::ShouldShowPromo(const extensions::ExtensionIdSet& installed_ids,
|
| - bool* just_expired) {
|
| - *just_expired = false;
|
| -
|
| - if (CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kForceAppsPromoVisible)) {
|
| - return true;
|
| - }
|
| -
|
| - // Don't show the promo if the policy says not to.
|
| - if (prefs_->GetBoolean(prefs::kNtpHideWebStorePromo)) {
|
| - ExpireDefaultApps();
|
| - return false;
|
| - }
|
| -
|
| - // Don't show the promo if one wasn't served to this locale.
|
| - if (!IsPromoSupportedForLocale())
|
| - return false;
|
| -
|
| - int promo_counter = GetPromoCounter();
|
| - if (GetDefaultAppsInstalled() && promo_counter <= kDefaultAppsCounterMax) {
|
| - // If the default apps were installed from a previous Chrome version, we
|
| - // should still show the promo. If we don't have the exact set of default
|
| - // apps, this means that the user manually installed or uninstalled one.
|
| - // We no longer keep track of the default apps once others have been
|
| - // installed, so expire them immediately.
|
| - if (old_default_app_ids_ != installed_ids) {
|
| - ExpireDefaultApps();
|
| - return false;
|
| - }
|
| -
|
| - if (promo_counter == kDefaultAppsCounterMax) {
|
| - *just_expired = true;
|
| -
|
| - // The default apps have expired due to inaction, so ping PROMO_EXPIRE.
|
| - UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
|
| - extension_misc::PROMO_EXPIRE,
|
| - extension_misc::PROMO_BUCKET_BOUNDARY);
|
| -
|
| - ExpireDefaultApps();
|
| - } else {
|
| - SetPromoCounter(++promo_counter);
|
| - }
|
| - return true;
|
| - } else if (installed_ids.empty()) {
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -bool AppsPromo::ShouldShowAppLauncher(
|
| - const extensions::ExtensionIdSet& installed_ids) {
|
| - // On Chrome OS the default apps are installed via a separate mechanism that
|
| - // is always enabled. Therefore we always show the launcher.
|
| -#if defined(OS_CHROMEOS)
|
| - return true;
|
| -#else
|
| -
|
| - // Always show the app launcher if an app is installed.
|
| - if (!installed_ids.empty())
|
| - return true;
|
| -
|
| - // Otherwise, only show the app launcher if the web store is supported for the
|
| - // current locale.
|
| - return IsWebStoreSupportedForLocale();
|
| -#endif
|
| -}
|
| -
|
| -void AppsPromo::ExpireDefaultApps() {
|
| - SetPromoCounter(kDefaultAppsCounterMax + 1);
|
| -}
|
| -
|
| -void AppsPromo::HidePromo() {
|
| - UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram,
|
| - extension_misc::PROMO_CLOSE,
|
| - extension_misc::PROMO_BUCKET_BOUNDARY);
|
| -
|
| - ExpireDefaultApps();
|
| -}
|
| -
|
| -std::string AppsPromo::GetLastPromoId() {
|
| - return prefs_->GetString(prefs::kNtpWebStorePromoLastId);
|
| -}
|
| -
|
| -void AppsPromo::SetLastPromoId(const std::string& id) {
|
| - prefs_->SetString(prefs::kNtpWebStorePromoLastId, id);
|
| -}
|
| -
|
| -int AppsPromo::GetPromoCounter() const {
|
| - return prefs_->GetInteger(prefs::kAppsPromoCounter);
|
| -}
|
| -
|
| -void AppsPromo::SetPromoCounter(int val) {
|
| - prefs_->SetInteger(prefs::kAppsPromoCounter, val);
|
| -}
|
| -
|
| -bool AppsPromo::GetDefaultAppsInstalled() const {
|
| - return prefs_->GetBoolean(prefs::kDefaultAppsInstalled);
|
| -}
|
| -
|
| -AppsPromo::UserGroup AppsPromo::GetCurrentUserGroup() const {
|
| - const PrefService::Preference* last_promo_id
|
| - = prefs_->FindPreference(prefs::kNtpWebStorePromoLastId);
|
| - CHECK(last_promo_id);
|
| - return last_promo_id->IsDefaultValue() ? USERS_NEW : USERS_EXISTING;
|
| -}
|
| -
|
| -AppsPromoLogoFetcher::AppsPromoLogoFetcher(
|
| - Profile* profile,
|
| - const AppsPromo::PromoData& promo_data)
|
| - : profile_(profile),
|
| - promo_data_(promo_data) {
|
| - if (SupportsLogoURL()) {
|
| - if (HaveCachedLogo()) {
|
| - promo_data_.logo = AppsPromo::GetPromo().logo;
|
| - SavePromo();
|
| - } else {
|
| - FetchLogo();
|
| - }
|
| - } else {
|
| - // We only care about the source URL when this fetches the logo.
|
| - AppsPromo::SetSourcePromoLogoURL(GURL());
|
| - SavePromo();
|
| - }
|
| -}
|
| -
|
| -AppsPromoLogoFetcher::~AppsPromoLogoFetcher() {}
|
| -
|
| -void AppsPromoLogoFetcher::OnURLFetchComplete(
|
| - const net::URLFetcher* source) {
|
| - std::string data;
|
| - std::string base64_data;
|
| -
|
| - CHECK(source == url_fetcher_.get());
|
| - source->GetResponseAsString(&data);
|
| -
|
| - if (source->GetStatus().is_success() &&
|
| - source->GetResponseCode() == kHttpSuccess &&
|
| - base::Base64Encode(data, &base64_data)) {
|
| - AppsPromo::SetSourcePromoLogoURL(promo_data_.logo);
|
| - promo_data_.logo = GURL(kPNGDataURLPrefix + base64_data);
|
| - } else {
|
| - // The logo wasn't downloaded correctly or we failed to encode it in
|
| - // base64. Reset the source URL so we fetch it again next time. AppsPromo
|
| - // will revert to the default logo.
|
| - AppsPromo::SetSourcePromoLogoURL(GURL());
|
| - }
|
| -
|
| - SavePromo();
|
| -}
|
| -
|
| -void AppsPromoLogoFetcher::FetchLogo() {
|
| - CHECK(promo_data_.logo.scheme() == chrome::kHttpsScheme);
|
| -
|
| - url_fetcher_.reset(net::URLFetcher::Create(
|
| - 0, promo_data_.logo, net::URLFetcher::GET, this));
|
| - url_fetcher_->SetRequestContext(
|
| - g_browser_process->system_request_context());
|
| - url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
|
| - net::LOAD_DO_NOT_SAVE_COOKIES);
|
| - url_fetcher_->Start();
|
| -}
|
| -
|
| -bool AppsPromoLogoFetcher::HaveCachedLogo() {
|
| - return promo_data_.logo == AppsPromo::GetSourcePromoLogoURL();
|
| -}
|
| -
|
| -void AppsPromoLogoFetcher::SavePromo() {
|
| - AppsPromo::SetPromo(promo_data_);
|
| -
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_WEB_STORE_PROMO_LOADED,
|
| - content::Source<Profile>(profile_),
|
| - content::NotificationService::NoDetails());
|
| -}
|
| -
|
| -bool AppsPromoLogoFetcher::SupportsLogoURL() {
|
| - URLPattern allowed_urls(URLPattern::SCHEME_HTTPS, kValidLogoPattern);
|
| - return allowed_urls.MatchesURL(promo_data_.logo);
|
| -}
|
|
|