Commit 0659b19d authored by Hector Carmona's avatar Hector Carmona Committed by Commit Bot

NUX Email - Add icons to the bookmark cache for the selected email.

CL also includes a few minor UI fixes to match mocks and a11y.

Bug: 832933
Change-Id: Ibb9fd594b80d79692593e65f00636fbd7115eb3e
Reviewed-on: https://chromium-review.googlesource.com/1212265
Commit-Queue: Hector Carmona <hcarmona@chromium.org>
Reviewed-by: default avatarScott Chen <scottchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#590165}
parent 582cdb5b
...@@ -130,13 +130,9 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url) ...@@ -130,13 +130,9 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url)
if (onboard_during_nux && if (onboard_during_nux &&
base::FeatureList::IsEnabled(nux::kNuxEmailFeature)) { base::FeatureList::IsEnabled(nux::kNuxEmailFeature)) {
content::BrowserContext* browser_context =
web_ui->GetWebContents()->GetBrowserContext();
web_ui->AddMessageHandler(std::make_unique<nux::EmailHandler>( web_ui->AddMessageHandler(std::make_unique<nux::EmailHandler>(
profile->GetPrefs(), profile->GetPrefs(), FaviconServiceFactory::GetForProfile(
FaviconServiceFactory::GetForProfile( profile, ServiceAccessType::EXPLICIT_ACCESS)));
profile, ServiceAccessType::EXPLICIT_ACCESS),
BookmarkModelFactory::GetForBrowserContext(browser_context)));
nux::EmailHandler::AddSources(html_source, profile->GetPrefs()); nux::EmailHandler::AddSources(html_source, profile->GetPrefs());
} }
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/stl_util.h" #include "base/stl_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/bookmarks/common/bookmark_pref_names.h" #include "components/bookmarks/common/bookmark_pref_names.h"
#include "components/favicon/core/favicon_service.h" #include "components/favicon/core/favicon_service.h"
#include "components/grit/components_resources.h" #include "components/grit/components_resources.h"
...@@ -37,9 +36,9 @@ enum class EmailProviders { ...@@ -37,9 +36,9 @@ enum class EmailProviders {
struct EmailProviderType { struct EmailProviderType {
const EmailProviders id; const EmailProviders id;
const char* name; const char* name; // Icon in WebUI should use name to match CSS.
const char* url; const char* url;
const int icon; const int icon; // Corresponds with resource ID, used for bookmark cache.
}; };
const char* kEmailInteractionHistogram = const char* kEmailInteractionHistogram =
...@@ -50,12 +49,14 @@ const char* kEmailInteractionHistogram = ...@@ -50,12 +49,14 @@ const char* kEmailInteractionHistogram =
// TODO(hcarmona): populate with icon ids. // TODO(hcarmona): populate with icon ids.
const EmailProviderType kEmail[] = { const EmailProviderType kEmail[] = {
{EmailProviders::kGmail, "Gmail", {EmailProviders::kGmail, "Gmail",
"https://accounts.google.com/b/0/AddMailService", 0}, "https://accounts.google.com/b/0/AddMailService", IDR_NUX_EMAIL_GMAIL_1X},
{EmailProviders::kYahoo, "Yahoo", "https://mail.yahoo.com", 0}, {EmailProviders::kYahoo, "Yahoo", "https://mail.yahoo.com",
IDR_NUX_EMAIL_YAHOO_1X},
{EmailProviders::kOutlook, "Outlook", "https://login.live.com/login.srf?", {EmailProviders::kOutlook, "Outlook", "https://login.live.com/login.srf?",
0}, IDR_NUX_EMAIL_OUTLOOK_1X},
{EmailProviders::kAol, "AOL", "https://mail.aol.com", 0}, {EmailProviders::kAol, "AOL", "https://mail.aol.com", IDR_NUX_EMAIL_AOL_1X},
{EmailProviders::kiCloud, "iCloud", "https://www.icloud.com/mail", 0}, {EmailProviders::kiCloud, "iCloud", "https://www.icloud.com/mail",
IDR_NUX_EMAIL_ICLOUD_1X},
}; };
constexpr const int kEmailIconSize = 48; // Pixels. constexpr const int kEmailIconSize = 48; // Pixels.
...@@ -64,22 +65,15 @@ static_assert(base::size(kEmail) == (size_t)EmailProviders::kCount, ...@@ -64,22 +65,15 @@ static_assert(base::size(kEmail) == (size_t)EmailProviders::kCount,
"names and histograms must match"); "names and histograms must match");
EmailHandler::EmailHandler(PrefService* prefs, EmailHandler::EmailHandler(PrefService* prefs,
favicon::FaviconService* favicon_service, favicon::FaviconService* favicon_service)
bookmarks::BookmarkModel* bookmark_model) : prefs_(prefs), favicon_service_(favicon_service) {}
: prefs_(prefs),
favicon_service_(favicon_service),
bookmark_model_(bookmark_model) {}
EmailHandler::~EmailHandler() {} EmailHandler::~EmailHandler() {}
void EmailHandler::RegisterMessages() { void EmailHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback( web_ui()->RegisterMessageCallback(
"rejectEmails", base::BindRepeating(&EmailHandler::HandleRejectEmails, "cacheEmailIcon", base::BindRepeating(&EmailHandler::HandleCacheEmailIcon,
base::Unretained(this))); base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"addEmails", base::BindRepeating(&EmailHandler::HandleAddEmails,
base::Unretained(this)));
web_ui()->RegisterMessageCallback( web_ui()->RegisterMessageCallback(
"toggleBookmarkBar", "toggleBookmarkBar",
...@@ -87,47 +81,28 @@ void EmailHandler::RegisterMessages() { ...@@ -87,47 +81,28 @@ void EmailHandler::RegisterMessages() {
base::Unretained(this))); base::Unretained(this)));
} }
void EmailHandler::HandleRejectEmails(const base::ListValue* args) { void EmailHandler::HandleCacheEmailIcon(const base::ListValue* args) {
/* TODO(hcarmona): Add histograms and uncomment this code. int emailId;
UMA_HISTOGRAM_ENUMERATION(kEmailInteractionHistogram, args->GetInteger(0, &emailId);
EmailInteraction::kNoThanks,
EmailInteraction::kCount);
*/
}
void EmailHandler::HandleAddEmails(const base::ListValue* args) { const EmailProviderType* selectedEmail = NULL;
// Add bookmarks for all selected emails. for (size_t i = 0; i < base::size(kEmail); i++) {
int bookmarkIndex = 0; if ((int)kEmail[i].id == emailId) {
for (size_t i = 0; i < (size_t)EmailProviders::kCount; ++i) { selectedEmail = &kEmail[i];
bool selected = false; break;
CHECK(args->GetBoolean(i, &selected));
if (selected) {
/* TODO(hcarmona): Add histograms and uncomment this code.
UMA_HISTOGRAM_ENUMERATION("FirstRun.NewUserExperience.EmailSelection",
(EmailProviders)i,
EmailProviders::kCount);
*/
GURL app_url = GURL(kEmail[i].url);
bookmark_model_->AddURL(bookmark_model_->bookmark_bar_node(),
bookmarkIndex++,
base::ASCIIToUTF16(kEmail[i].name), app_url);
// Preload the favicon cache with Chrome-bundled images. Otherwise, the
// pre-populated bookmarks don't have favicons and look bad. Favicons are
// updated automatically when a user visits a site.
favicon_service_->MergeFavicon(
app_url, app_url, favicon_base::IconType::kFavicon,
ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
kEmail[i].icon),
gfx::Size(kEmailIconSize, kEmailIconSize));
} }
} }
CHECK(selectedEmail); // WebUI should not be able to pass non-existent ID.
/* TODO(hcarmona): Add histograms and uncomment this code.
UMA_HISTOGRAM_ENUMERATION(kEmailInteractionHistogram, // Preload the favicon cache with Chrome-bundled images. Otherwise, the
EmailInteraction::kGetStarted, // pre-populated bookmarks don't have favicons and look bad. Favicons are
EmailInteraction::kCount); // updated automatically when a user visits a site.
*/ GURL app_url = GURL(selectedEmail->url);
favicon_service_->MergeFavicon(
app_url, app_url, favicon_base::IconType::kFavicon,
ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
selectedEmail->icon),
gfx::Size(kEmailIconSize, kEmailIconSize));
} }
void EmailHandler::HandleToggleBookmarkBar(const base::ListValue* args) { void EmailHandler::HandleToggleBookmarkBar(const base::ListValue* args) {
...@@ -143,6 +118,12 @@ void EmailHandler::AddSources(content::WebUIDataSource* html_source, ...@@ -143,6 +118,12 @@ void EmailHandler::AddSources(content::WebUIDataSource* html_source,
html_source->AddLocalizedString("getStarted", IDS_NUX_EMAIL_GET_STARTED); html_source->AddLocalizedString("getStarted", IDS_NUX_EMAIL_GET_STARTED);
html_source->AddLocalizedString("welcomeTitle", IDS_NUX_EMAIL_WELCOME_TITLE); html_source->AddLocalizedString("welcomeTitle", IDS_NUX_EMAIL_WELCOME_TITLE);
html_source->AddLocalizedString("emailPrompt", IDS_NUX_EMAIL_PROMPT); html_source->AddLocalizedString("emailPrompt", IDS_NUX_EMAIL_PROMPT);
html_source->AddLocalizedString("bookmarkAdded",
IDS_NUX_EMAIL_BOOKMARK_ADDED);
html_source->AddLocalizedString("bookmarkRemoved",
IDS_NUX_EMAIL_BOOKMARK_REMOVED);
html_source->AddLocalizedString("bookmarkReplaced",
IDS_NUX_EMAIL_BOOKMARK_REPLACED);
// Add required resources. // Add required resources.
html_source->AddResourcePath("email", IDR_NUX_EMAIL_HTML); html_source->AddResourcePath("email", IDR_NUX_EMAIL_HTML);
......
...@@ -11,10 +11,6 @@ ...@@ -11,10 +11,6 @@
class PrefService; class PrefService;
namespace bookmarks {
class BookmarkModel;
} // namespace bookmarks
namespace content { namespace content {
class WebUIDataSource; class WebUIDataSource;
} // namespace content } // namespace content
...@@ -38,17 +34,14 @@ enum class EmailInteraction { ...@@ -38,17 +34,14 @@ enum class EmailInteraction {
class EmailHandler : public content::WebUIMessageHandler { class EmailHandler : public content::WebUIMessageHandler {
public: public:
EmailHandler(PrefService* prefs, EmailHandler(PrefService* prefs, favicon::FaviconService* favicon_service);
favicon::FaviconService* favicon_service,
bookmarks::BookmarkModel* bookmark_model);
~EmailHandler() override; ~EmailHandler() override;
// WebUIMessageHandler: // WebUIMessageHandler:
void RegisterMessages() override; void RegisterMessages() override;
// Callbacks for JS APIs. // Callbacks for JS APIs.
void HandleRejectEmails(const base::ListValue* args); void HandleCacheEmailIcon(const base::ListValue* args);
void HandleAddEmails(const base::ListValue* args);
void HandleToggleBookmarkBar(const base::ListValue* args); void HandleToggleBookmarkBar(const base::ListValue* args);
// Adds webui sources. // Adds webui sources.
...@@ -62,9 +55,6 @@ class EmailHandler : public content::WebUIMessageHandler { ...@@ -62,9 +55,6 @@ class EmailHandler : public content::WebUIMessageHandler {
// Weak reference. // Weak reference.
favicon::FaviconService* favicon_service_; favicon::FaviconService* favicon_service_;
// Weak reference.
bookmarks::BookmarkModel* bookmark_model_;
DISALLOW_COPY_AND_ASSIGN(EmailHandler); DISALLOW_COPY_AND_ASSIGN(EmailHandler);
}; };
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
<link rel="import" href="chrome://resources/cr_elements/icons.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html">
<link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html">
<link rel="import" href="chrome://resources/html/i18n_behavior.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
<link rel="import" href="chrome://welcome/email/nux_email_proxy.html"> <link rel="import" href="chrome://welcome/email/nux_email_proxy.html">
...@@ -11,7 +13,7 @@ ...@@ -11,7 +13,7 @@
<template> <template>
<style include="paper-button-style"> <style include="paper-button-style">
:host { :host {
display: initial; display: block;
white-space: nowrap; white-space: nowrap;
} }
...@@ -34,7 +36,7 @@ ...@@ -34,7 +36,7 @@
outline: 0; outline: 0;
} }
.option:not(:first-child) { .option:not(:first-of-type) {
margin-inline-start: 24px; margin-inline-start: 24px;
} }
......
...@@ -19,6 +19,9 @@ nux_email.EmailProviderModel; ...@@ -19,6 +19,9 @@ nux_email.EmailProviderModel;
Polymer({ Polymer({
is: 'email-chooser', is: 'email-chooser',
behaviors: [I18nBehavior],
properties: { properties: {
emailList: Array, emailList: Array,
...@@ -29,7 +32,7 @@ Polymer({ ...@@ -29,7 +32,7 @@ Polymer({
}, },
/** @private */ /** @private */
gotStarted_: Boolean, finalized_: Boolean,
/** @private {nux_email.EmailProviderModel} */ /** @private {nux_email.EmailProviderModel} */
selectedEmailProvider_: { selectedEmailProvider_: {
...@@ -42,6 +45,13 @@ Polymer({ ...@@ -42,6 +45,13 @@ Polymer({
/** @private {NuxEmailProxy} */ /** @private {NuxEmailProxy} */
browserProxy_: null, browserProxy_: null,
/** @override */
attached: function() {
Polymer.RenderStatus.afterNextRender(this, function() {
Polymer.IronA11yAnnouncer.requestAvailability();
});
},
/** @override */ /** @override */
ready: function() { ready: function() {
this.browserProxy_ = nux.NuxEmailProxyImpl.getInstance(); this.browserProxy_ = nux.NuxEmailProxyImpl.getInstance();
...@@ -50,13 +60,16 @@ Polymer({ ...@@ -50,13 +60,16 @@ Polymer({
this.emailList = this.browserProxy_.getEmailList(); this.emailList = this.browserProxy_.getEmailList();
window.addEventListener('beforeunload', () => { window.addEventListener('beforeunload', () => {
// Only need to clean up if user didn't choose "Get Started". // Only need to clean up if user didn't interact with the buttons.
if (this.gotStarted_) if (this.finalized_)
return; return;
this.revertBookmark_(); if (this.selectedEmailProvider_) {
this.browserProxy_.recordProviderSelected(
this.selectedEmailProvider_.id);
}
this.browserProxy_.recordFinalize(); this.browserProxy_.recordFinalize();
this.browserProxy_.toggleBookmarkBar(this.bookmarkBarWasShown_);
}); });
}, },
...@@ -125,24 +138,42 @@ Polymer({ ...@@ -125,24 +138,42 @@ Polymer({
if (newEmail) { if (newEmail) {
this.browserProxy_.toggleBookmarkBar(true); this.browserProxy_.toggleBookmarkBar(true);
this.browserProxy_.addBookmark( this.browserProxy_.addBookmark(
{title: newEmail.name, url: newEmail.url, parentId: '1'}, results => { {
title: newEmail.name,
url: newEmail.url,
parentId: '1',
},
newEmail.id, results => {
this.selectedEmailProvider_.bookmarkId = results.id; this.selectedEmailProvider_.bookmarkId = results.id;
}); });
} else { } else {
this.browserProxy_.toggleBookmarkBar(this.bookmarkBarWasShown_); this.browserProxy_.toggleBookmarkBar(this.bookmarkBarWasShown_);
} }
// Announcements are mutually exclusive, so keeping separate.
if (prevEmail && newEmail) {
this.fire('iron-announce', {text: this.i18n('bookmarkReplaced')});
} else if (prevEmail) {
this.fire('iron-announce', {text: this.i18n('bookmarkRemoved')});
} else if (newEmail) {
this.fire('iron-announce', {text: this.i18n('bookmarkAdded')});
}
}, },
/** @private */ /** @private */
onNoThanksClicked_: function() { onNoThanksClicked_: function() {
this.finalized_ = true;
this.revertBookmark_();
this.browserProxy_.toggleBookmarkBar(this.bookmarkBarWasShown_);
this.browserProxy_.recordNoThanks(); this.browserProxy_.recordNoThanks();
window.location.replace('chrome://newtab'); window.location.replace('chrome://newtab');
}, },
/** @private */ /** @private */
onGetStartedClicked_: function() { onGetStartedClicked_: function() {
this.gotStarted_ = true; this.finalized_ = true;
this.browserProxy_.recordGetStarted(this.selectedEmailProvider_.id); this.browserProxy_.recordProviderSelected(this.selectedEmailProvider_.id);
this.browserProxy_.recordGetStarted();
window.location.replace(this.selectedEmailProvider_.url); window.location.replace(this.selectedEmailProvider_.url);
}, },
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
<script src="strings.js"></script> <script src="strings.js"></script>
<link rel="import" href="chrome://resources/html/polymer.html"> <link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://welcome/email/email_chooser.html"> <link rel="import" href="chrome://welcome/email/email_chooser.html">
<link rel="import" href="chrome://welcome/email/nux_email_proxy.html">
<link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
<style> <style>
body { body {
...@@ -21,21 +20,24 @@ ...@@ -21,21 +20,24 @@
:host { :host {
align-items: center; align-items: center;
display: flex; display: flex;
height: 100vh; height: fit-content;
justify-content: space-around; margin: auto;
min-height: 100vh;
width: fit-content;
} }
.email-ask { .email-ask {
text-align: center; text-align: center;
width: 800px;
} }
.email-logo { .email-logo {
background: red; /* TODO(scottchen): replace with logo. */ content: -webkit-image-set(
height: 36px; url('chrome://welcome/logo.png') 1x,
url('chrome://welcome/logo2x.png') 2x);
height: 48px;
margin: auto; margin: auto;
margin-bottom: 16px; margin-bottom: 16px;
width: 36px; width: 48px;
} }
h1 { h1 {
...@@ -61,7 +63,7 @@ ...@@ -61,7 +63,7 @@
} }
</style> </style>
<div class="email-ask"> <div class="email-ask">
<div class="email-logo"></div> <div class="email-logo" alt=""></div>
<h1>$i18n{welcomeTitle}</h1> <h1>$i18n{welcomeTitle}</h1>
<h2>$i18n{emailPrompt}</h2> <h2>$i18n{emailPrompt}</h2>
<email-chooser id="emailChooser"></email-chooser> <email-chooser id="emailChooser"></email-chooser>
......
...@@ -44,15 +44,34 @@ cr.define('nux', function() { ...@@ -44,15 +44,34 @@ cr.define('nux', function() {
/** /**
* @param {!bookmarkData} data * @param {!bookmarkData} data
* @param {number} emailProviderId
* @param {!Function} callback * @param {!Function} callback
*/ */
addBookmark(data, callback) {} addBookmark(data, emailProviderId, callback) {}
/** @param {boolean} show */ /** @param {boolean} show */
toggleBookmarkBar(show) {} toggleBookmarkBar(show) {}
/** @return {!Array<Object>} Array of email providers. */ /** @return {!Array<Object>} Array of email providers. */
getEmailList() {} getEmailList() {}
recordPageInitialized() {}
recordClickedOption() {}
recordClickedDisabledButton() {}
/**
* @param {number} providerId This should match one of the histogram enum
* value for NuxEmailProvidersSelections.
*/
recordProviderSelected(providerId) {}
recordNoThanks() {}
recordGetStarted() {}
recordFinalize() {}
} }
/** @implements {NuxEmailProxy} */ /** @implements {NuxEmailProxy} */
...@@ -63,9 +82,9 @@ cr.define('nux', function() { ...@@ -63,9 +82,9 @@ cr.define('nux', function() {
} }
/** @override */ /** @override */
addBookmark(data, callback) { addBookmark(data, emailProviderId, callback) {
chrome.bookmarks.create(data, callback); chrome.bookmarks.create(data, callback);
// TODO(scottchen): request C++ to cache favicon chrome.send('cacheEmailIcon', [emailProviderId]);
} }
/** @override */ /** @override */
...@@ -88,6 +107,7 @@ cr.define('nux', function() { ...@@ -88,6 +107,7 @@ cr.define('nux', function() {
return emailList; return emailList;
} }
/** @override */
recordPageInitialized() { recordPageInitialized() {
chrome.metricsPrivate.recordEnumerationValue( chrome.metricsPrivate.recordEnumerationValue(
INTERACTION_METRIC_NAME, NuxEmailProvidersInteractions.PageShown, INTERACTION_METRIC_NAME, NuxEmailProvidersInteractions.PageShown,
...@@ -100,47 +120,46 @@ cr.define('nux', function() { ...@@ -100,47 +120,46 @@ cr.define('nux', function() {
this.lastPart = 'AndNavigatedAway'; this.lastPart = 'AndNavigatedAway';
} }
/** @override */
recordClickedOption() { recordClickedOption() {
// Only overwrite this.firstPart if it's not overwritten already // Only overwrite this.firstPart if it's not overwritten already
if (this.firstPart == 'DidNothing') if (this.firstPart == 'DidNothing')
this.firstPart = 'ChoseAnOption'; this.firstPart = 'ChoseAnOption';
} }
/** @override */
recordClickedDisabledButton() { recordClickedDisabledButton() {
// Only overwrite this.firstPart if it's not overwritten already // Only overwrite this.firstPart if it's not overwritten already
if (this.firstPart == 'DidNothing') if (this.firstPart == 'DidNothing')
this.firstPart = 'ClickedDisabledNextButton'; this.firstPart = 'ClickedDisabledNextButton';
} }
/** @override */
recordProviderSelected(providerId) {
chrome.metricsPrivate.recordEnumerationValue(
SELECTION_METRIC_NAME, providerId,
loadTimeData.getInteger('email_count'));
}
/** @override */
recordNoThanks() { recordNoThanks() {
this.lastPart = 'AndChoseSkip'; this.lastPart = 'AndChoseSkip';
this.recordFinalize(); this.recordFinalize();
} }
/** /** @override */
* @param {number} providerId This should match one of the histogram enum recordGetStarted() {
* value for NuxEmailProvidersSelections.
*/
recordGetStarted(providerId) {
chrome.metricsPrivate.recordEnumerationValue(
SELECTION_METRIC_NAME, providerId,
loadTimeData.getInteger('email_count'));
this.lastPart = 'AndChoseNext'; this.lastPart = 'AndChoseNext';
this.recordFinalize(); this.recordFinalize();
} }
/** @override */
recordFinalize() { recordFinalize() {
// Don't record again if it's already recorded before unloading.
if (this.finalized)
return;
let finalValue = this.firstPart + this.lastPart; let finalValue = this.firstPart + this.lastPart;
chrome.metricsPrivate.recordEnumerationValue( chrome.metricsPrivate.recordEnumerationValue(
INTERACTION_METRIC_NAME, NuxEmailProvidersInteractions[finalValue], INTERACTION_METRIC_NAME, NuxEmailProvidersInteractions[finalValue],
INTERACTION_METRIC_COUNT); INTERACTION_METRIC_COUNT);
this.finalized = true;
} }
} }
......
components/nux/email/resources/yahoo_1x.png

686 Bytes | W: | H:

components/nux/email/resources/yahoo_1x.png

742 Bytes | W: | H:

components/nux/email/resources/yahoo_1x.png
components/nux/email/resources/yahoo_1x.png
components/nux/email/resources/yahoo_1x.png
components/nux/email/resources/yahoo_1x.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -9,4 +9,13 @@ ...@@ -9,4 +9,13 @@
<message name="IDS_NUX_EMAIL_WELCOME_TITLE" desc="Text shown to welcome the users to chrome."> <message name="IDS_NUX_EMAIL_WELCOME_TITLE" desc="Text shown to welcome the users to chrome.">
Make Chrome your own Make Chrome your own
</message> </message>
<message name="IDS_NUX_EMAIL_BOOKMARK_ADDED" desc="String read for accessibility to inform the user a bookmark was added.">
Bookmark added
</message>
<message name="IDS_NUX_EMAIL_BOOKMARK_REMOVED" desc="String read for accessibility to inform the user a bookmark was removed.">
Bookmark removed
</message>
<message name="IDS_NUX_EMAIL_BOOKMARK_REPLACED" desc="String read for accessibility to inform the user a bookmark was replaced.">
Bookmark replaced
</message>
</grit-part> </grit-part>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment