summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjstritar@chromium.org <jstritar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-29 22:50:16 +0000
committerjstritar@chromium.org <jstritar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-29 22:50:16 +0000
commit739cb54e6f2d9357d3af821edfdfcec133fc3534 (patch)
treefc4a570ee3bb8f476fb073732f20cecf937cdfa5 /chrome
parentb124b43aa88e393cd55d714a30ce49fd8e4a88c0 (diff)
downloadchromium_src-739cb54e6f2d9357d3af821edfdfcec133fc3534.zip
chromium_src-739cb54e6f2d9357d3af821edfdfcec133fc3534.tar.gz
chromium_src-739cb54e6f2d9357d3af821edfdfcec133fc3534.tar.bz2
Add ability to change web store promo logo at runtime.
This updates the web store promo system so that we can change the promo's logo to any URL from the promo server. BUG=84082 TEST=ExtensionAppsPromo, PromoResourceServiceTest Review URL: http://codereview.chromium.org/7074032 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87209 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/apps_promo.cc23
-rw-r--r--chrome/browser/extensions/apps_promo.h9
-rw-r--r--chrome/browser/extensions/apps_promo_unittest.cc43
-rw-r--r--chrome/browser/resources/ntp/apps.css2
-rw-r--r--chrome/browser/resources/ntp/apps.js2
-rw-r--r--chrome/browser/ui/webui/ntp/app_launcher_handler.cc1
-rw-r--r--chrome/browser/web_resource/promo_resource_service.cc23
-rw-r--r--chrome/browser/web_resource/promo_resource_service.h6
-rw-r--r--chrome/browser/web_resource/promo_resource_service_unittest.cc4
-rw-r--r--chrome/common/pref_names.cc3
-rw-r--r--chrome/common/pref_names.h1
11 files changed, 96 insertions, 21 deletions
diff --git a/chrome/browser/extensions/apps_promo.cc b/chrome/browser/extensions/apps_promo.cc
index 8c43af9..2644fea 100644
--- a/chrome/browser/extensions/apps_promo.cc
+++ b/chrome/browser/extensions/apps_promo.cc
@@ -15,6 +15,13 @@
const int AppsPromo::kDefaultAppsCounterMax = 10;
+namespace {
+
+// The default logo for the promo.
+const char kDefaultPromoLogo[] = "chrome://theme/IDR_WEBSTORE_ICON";
+
+} // namespace
+
// static
void AppsPromo::RegisterPrefs(PrefService* local_state) {
std::string empty;
@@ -22,6 +29,7 @@ void AppsPromo::RegisterPrefs(PrefService* local_state) {
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::kNTPWebStorePromoExpire, empty);
}
@@ -47,6 +55,7 @@ void AppsPromo::ClearPromo() {
local_state->ClearPref(prefs::kNTPWebStorePromoHeader);
local_state->ClearPref(prefs::kNTPWebStorePromoButton);
local_state->ClearPref(prefs::kNTPWebStorePromoLink);
+ local_state->ClearPref(prefs::kNTPWebStorePromoLogo);
local_state->ClearPref(prefs::kNTPWebStorePromoExpire);
}
@@ -75,6 +84,15 @@ GURL AppsPromo::GetPromoLink() {
}
// static
+GURL AppsPromo::GetPromoLogo() {
+ PrefService* local_state = g_browser_process->local_state();
+ GURL logo_url(local_state->GetString(prefs::kNTPWebStorePromoLogo));
+ if (logo_url.is_valid() && logo_url.SchemeIs("data"))
+ return logo_url;
+ return GURL(kDefaultPromoLogo);
+}
+
+// static
std::string AppsPromo::GetPromoExpireText() {
PrefService* local_state = g_browser_process->local_state();
return local_state->GetString(prefs::kNTPWebStorePromoExpire);
@@ -85,12 +103,14 @@ void AppsPromo::SetPromo(const std::string& id,
const std::string& header_text,
const std::string& button_text,
const GURL& link,
- const std::string& expire_text) {
+ const std::string& expire_text,
+ const GURL& logo) {
PrefService* local_state = g_browser_process->local_state();
local_state->SetString(prefs::kNTPWebStorePromoId, id);
local_state->SetString(prefs::kNTPWebStorePromoButton, button_text);
local_state->SetString(prefs::kNTPWebStorePromoHeader, header_text);
local_state->SetString(prefs::kNTPWebStorePromoLink, link.spec());
+ local_state->SetString(prefs::kNTPWebStorePromoLogo, logo.spec());
local_state->SetString(prefs::kNTPWebStorePromoExpire, expire_text);
}
@@ -103,6 +123,7 @@ bool AppsPromo::IsPromoSupportedForLocale() {
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);
}
diff --git a/chrome/browser/extensions/apps_promo.h b/chrome/browser/extensions/apps_promo.h
index 772df00..31abbe0 100644
--- a/chrome/browser/extensions/apps_promo.h
+++ b/chrome/browser/extensions/apps_promo.h
@@ -39,15 +39,20 @@ class AppsPromo {
// Gets the promo link.
static GURL GetPromoLink();
+ // Gets the URL of the promo logo image.
+ static GURL GetPromoLogo();
+
// Gets the text for the promo "hide this" link.
static std::string GetPromoExpireText();
- // Called to set the current promo data.
+ // Called to set the current promo data. The default web store logo will be
+ // used if |logo| is empty or not valid.
static void SetPromo(const std::string& id,
const std::string& header_text,
const std::string& button_text,
const GURL& link,
- const std::string& expire_text);
+ const std::string& expire_text,
+ const GURL& logo);
explicit AppsPromo(PrefService* prefs);
~AppsPromo();
diff --git a/chrome/browser/extensions/apps_promo_unittest.cc b/chrome/browser/extensions/apps_promo_unittest.cc
index cbfa1ba..e808f08 100644
--- a/chrome/browser/extensions/apps_promo_unittest.cc
+++ b/chrome/browser/extensions/apps_promo_unittest.cc
@@ -19,6 +19,7 @@ const char kPromoId[] = "23123123";
const char kPromoHeader[] = "Get great apps!";
const char kPromoButton[] = "Click for apps!";
const char kPromoLink[] = "http://apps.com";
+const char kPromoLogo[] = "chrome://theme/IDR_WEBSTORE_ICON";
const char kPromoExpire[] = "No thanks.";
} // namespace
@@ -73,8 +74,8 @@ TEST_F(ExtensionAppsPromo, HappyPath) {
EXPECT_FALSE(promo_just_expired);
// Once the promo is set, we show both the promo and app launcher.
- AppsPromo::SetPromo(
- kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire);
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(""));
EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
EXPECT_TRUE(apps_promo()->ShouldShowAppLauncher(installed_ids));
@@ -113,8 +114,8 @@ TEST_F(ExtensionAppsPromo, HappyPath) {
// Tests get and set of promo content.
TEST_F(ExtensionAppsPromo, PromoPrefs) {
// Store a promo....
- AppsPromo::SetPromo(
- kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire);
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(""));
// ... then make sure AppsPromo can access it.
EXPECT_EQ(kPromoId, AppsPromo::GetPromoId());
@@ -122,6 +123,8 @@ TEST_F(ExtensionAppsPromo, PromoPrefs) {
EXPECT_EQ(kPromoButton, AppsPromo::GetPromoButtonText());
EXPECT_EQ(GURL(kPromoLink), AppsPromo::GetPromoLink());
EXPECT_EQ(kPromoExpire, AppsPromo::GetPromoExpireText());
+ // The promo logo should be the default value.
+ EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromoLogo());
EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
AppsPromo::ClearPromo();
@@ -130,7 +133,35 @@ TEST_F(ExtensionAppsPromo, PromoPrefs) {
EXPECT_EQ("", AppsPromo::GetPromoButtonText());
EXPECT_EQ(GURL(""), AppsPromo::GetPromoLink());
EXPECT_EQ("", AppsPromo::GetPromoExpireText());
+ EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromoLogo());
EXPECT_FALSE(AppsPromo::IsPromoSupportedForLocale());
+
+ // Make sure we can set the logo to something other than the default.
+ std::string promo_logo = "data:image/png;base64,iVBORw0kGgoAAAN";
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(promo_logo));
+ EXPECT_EQ(GURL(promo_logo), AppsPromo::GetPromoLogo());
+ EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
+
+ // Verify that the default is returned instead of http or https URLs.
+ promo_logo = "http://google.com/logo.png";
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(promo_logo));
+ EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromoLogo());
+ EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
+
+ promo_logo = "https://google.com/logo.png";
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(promo_logo));
+ EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromoLogo());
+ EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
+
+ // Try an invalid URL.
+ promo_logo = "sldkfjlsdn";
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(promo_logo));
+ EXPECT_EQ(GURL(kPromoLogo), AppsPromo::GetPromoLogo());
+ EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
}
// Tests that the apps section is maxmized when showing a promo for the first
@@ -144,8 +175,8 @@ TEST_F(ExtensionAppsPromo, UpdatePromoFocus) {
EXPECT_FALSE(promo_just_expired);
// Set the promo content.
- AppsPromo::SetPromo(
- kPromoId, kPromoHeader, kPromoButton, GURL(kPromoLink), kPromoExpire);
+ AppsPromo::SetPromo(kPromoId, kPromoHeader, kPromoButton,
+ GURL(kPromoLink), kPromoExpire, GURL(""));
// After asking if we should show the promo, the
EXPECT_TRUE(AppsPromo::IsPromoSupportedForLocale());
diff --git a/chrome/browser/resources/ntp/apps.css b/chrome/browser/resources/ntp/apps.css
index 967a964..479a108 100644
--- a/chrome/browser/resources/ntp/apps.css
+++ b/chrome/browser/resources/ntp/apps.css
@@ -142,7 +142,6 @@ menu > button.default {
}
html.apps-promo-visible #apps-promo {
- background: url('chrome://theme/IDR_WEBSTORE_ICON') no-repeat;
height: 125px;
-webkit-padding-start: 125px;
display: table-cell;
@@ -200,4 +199,3 @@ html[dir=rtl] .app.web-store-entry.loner {
padding: 2px 10px;
white-space: nowrap;
}
-
diff --git a/chrome/browser/resources/ntp/apps.js b/chrome/browser/resources/ntp/apps.js
index 0340e7f..77b599d 100644
--- a/chrome/browser/resources/ntp/apps.js
+++ b/chrome/browser/resources/ntp/apps.js
@@ -67,6 +67,8 @@ function getAppsCallback(data) {
appsPromoLink.href = data.promoLink;
appsPromoLink.textContent = data.promoButton;
appsPromoLink.ping = appsPromoPing;
+ $('apps-promo').style.background =
+ "url('" + data.promoLogo + "') no-repeat";
$('apps-promo-hide').textContent = data.promoExpire;
// ... then display the promo.
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index 71e507e..1767e18 100644
--- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -269,6 +269,7 @@ void AppLauncherHandler::FillPromoDictionary(DictionaryValue* dictionary) {
dictionary->SetString("promoHeader", AppsPromo::GetPromoHeaderText());
dictionary->SetString("promoButton", AppsPromo::GetPromoButtonText());
dictionary->SetString("promoLink", AppsPromo::GetPromoLink().spec());
+ dictionary->SetString("promoLogo", AppsPromo::GetPromoLogo().spec());
dictionary->SetString("promoExpire", AppsPromo::GetPromoExpireText());
}
diff --git a/chrome/browser/web_resource/promo_resource_service.cc b/chrome/browser/web_resource/promo_resource_service.cc
index 8d9d145..f66e791 100644
--- a/chrome/browser/web_resource/promo_resource_service.cc
+++ b/chrome/browser/web_resource/promo_resource_service.cc
@@ -309,6 +309,7 @@ void PromoResourceService::UnpackWebStoreSignal(
std::string promo_button = "";
std::string promo_link = "";
std::string promo_expire = "";
+ std::string promo_logo = "";
int target_builds = 0;
if (!parsed_json.GetDictionary("topic", &topic_dict) ||
@@ -321,20 +322,28 @@ void PromoResourceService::UnpackWebStoreSignal(
continue;
DictionaryValue* a_dic =
static_cast<DictionaryValue*>(*answer_iter);
+
+ // The "name" field has three different values packed into it, each
+ // separated by a ':'.
std::string name;
if (!a_dic->GetString("name", &name))
continue;
+ // (1) the string "webstore_promo"
size_t split = name.find(":");
- if (split == std::string::npos)
+ if (split == std::string::npos || name.substr(0, split) != "webstore_promo")
continue;
- std::string promo_signal = name.substr(0, split);
-
- if (promo_signal != "webstore_promo" ||
- !base::StringToInt(name.substr(split+1), &target_builds))
+ // (2) an integer specifying which builds the promo targets
+ name = name.substr(split+1);
+ split = name.find(':');
+ if (split == std::string::npos ||
+ !base::StringToInt(name.substr(0, split), &target_builds))
continue;
+ // (3) optional text that specifies a URL of a logo image
+ promo_logo = name.substr(split+1);
+
if (!a_dic->GetString(kAnswerIdProperty, &promo_id) ||
!a_dic->GetString(kWebStoreHeaderProperty, &promo_header) ||
!a_dic->GetString(kWebStoreButtonProperty, &promo_button) ||
@@ -344,8 +353,8 @@ void PromoResourceService::UnpackWebStoreSignal(
if (IsThisBuildTargeted(target_builds)) {
// Store the first web store promo that targets the current build.
- AppsPromo::SetPromo(
- promo_id, promo_header, promo_button, GURL(promo_link), promo_expire);
+ AppsPromo::SetPromo(promo_id, promo_header, promo_button,
+ GURL(promo_link), promo_expire, GURL(promo_logo));
signal_found = true;
break;
}
diff --git a/chrome/browser/web_resource/promo_resource_service.h b/chrome/browser/web_resource/promo_resource_service.h
index bc9b791..ad1af83 100644
--- a/chrome/browser/web_resource/promo_resource_service.h
+++ b/chrome/browser/web_resource/promo_resource_service.h
@@ -164,7 +164,7 @@ class PromoResourceService
// "answers": [
// {
// "answer_id": "1143011",
- // "name": "webstore_promo:15",
+ // "name": "webstore_promo:15:",
// "question": "Browse thousands of apps and games for Chrome.",
// "inproduct_target": "Visit the Chrome Web Store",
// "inproduct": "https://chrome.google.com/webstore?hl=en",
@@ -182,7 +182,9 @@ class PromoResourceService
// tooltip: the text for the "hide this" link on the promo
// name: starts with "webstore_promo" to identify the signal. the second
// part contains the release channels targeted (bitwise or of
- // BuildTypes)
+ // BuildTypes). The third part is optional and specifies the URL of
+ // the logo image. In the example above, the URL is empty so the
+ // default webstore logo will be used.
// answer_id: the promo's id
void UnpackWebStoreSignal(const DictionaryValue& parsed_json);
diff --git a/chrome/browser/web_resource/promo_resource_service_unittest.cc b/chrome/browser/web_resource/promo_resource_service_unittest.cc
index d149b36..cd6f141 100644
--- a/chrome/browser/web_resource/promo_resource_service_unittest.cc
+++ b/chrome/browser/web_resource/promo_resource_service_unittest.cc
@@ -176,7 +176,7 @@ TEST_F(PromoResourceServiceTest, UnpackWebStoreSignal) {
" \"answers\": ["
" {"
" \"answer_id\": \"341252\","
- " \"name\": \"webstore_promo:15\","
+ " \"name\": \"webstore_promo:15:\","
" \"question\": \"The header!\","
" \"inproduct_target\": \"The button label!\","
" \"inproduct\": \"http://link.com\","
@@ -201,6 +201,8 @@ TEST_F(PromoResourceServiceTest, UnpackWebStoreSignal) {
EXPECT_EQ("The button label!", AppsPromo::GetPromoButtonText());
EXPECT_EQ(GURL("http://link.com"), AppsPromo::GetPromoLink());
EXPECT_EQ("No thanks, hide this.", AppsPromo::GetPromoExpireText());
+ EXPECT_EQ(GURL("chrome://theme/IDR_WEBSTORE_ICON"),
+ AppsPromo::GetPromoLogo());
}
TEST_F(PromoResourceServiceTest, IsBuildTargeted) {
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 6050a09..3cc1322 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1152,6 +1152,9 @@ const char kNTPWebStorePromoButton[] = "ntp.webstorepromo.button";
// The button link for the NTP web store promo.
const char kNTPWebStorePromoLink[] = "ntp.webstorepromo.link";
+// The image URL for the NTP web store promo logo.
+const char kNTPWebStorePromoLogo[] = "ntp.webstorepromo.logo";
+
// The "hide this" link text for the NTP web store promo.
const char kNTPWebStorePromoExpire[] = "ntp.webstorepromo.expire";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 8eeff29..4539838 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -405,6 +405,7 @@ extern const char kNTPWebStorePromoId[];
extern const char kNTPWebStorePromoHeader[];
extern const char kNTPWebStorePromoButton[];
extern const char kNTPWebStorePromoLink[];
+extern const char kNTPWebStorePromoLogo[];
extern const char kNTPWebStorePromoExpire[];
extern const char kGpuBlacklist[];