1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
10 #include "base/command_line.h"
11 #include "base/memory/ref_counted_memory.h"
12 #include "base/prefs/pref_service.h"
13 #include "base/strings/string16.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/stringprintf.h"
16 #include "base/strings/utf_string_conversions.h"
17 #include "base/values.h"
18 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/chrome_notification_types.h"
20 #include "chrome/browser/first_run/first_run.h"
21 #include "chrome/browser/google/google_util.h"
22 #include "chrome/browser/policy/browser_policy_connector.h"
23 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/search/search.h"
25 #include "chrome/browser/sync/profile_sync_service.h"
26 #include "chrome/browser/sync/profile_sync_service_factory.h"
27 #include "chrome/browser/themes/theme_properties.h"
28 #include "chrome/browser/themes/theme_service.h"
29 #include "chrome/browser/themes/theme_service_factory.h"
30 #include "chrome/browser/ui/app_list/app_list_util.h"
31 #include "chrome/browser/ui/bookmarks/bookmark_bar_constants.h"
32 #include "chrome/browser/ui/sync/sync_promo_ui.h"
33 #include "chrome/browser/ui/webui/ntp/new_tab_page_handler.h"
34 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
35 #include "chrome/browser/ui/webui/ntp/ntp_login_handler.h"
36 #include "chrome/browser/ui/webui/sync_setup_handler.h"
37 #include "chrome/browser/web_resource/notification_promo.h"
38 #include "chrome/common/chrome_switches.h"
39 #include "chrome/common/extensions/extension_constants.h"
40 #include "chrome/common/pref_names.h"
41 #include "chrome/common/url_constants.h"
42 #include "content/public/browser/browser_thread.h"
43 #include "content/public/browser/notification_service.h"
44 #include "content/public/browser/render_process_host.h"
45 #include "extensions/common/extension.h"
46 #include "grit/browser_resources.h"
47 #include "grit/chromium_strings.h"
48 #include "grit/generated_resources.h"
49 #include "grit/locale_settings.h"
50 #include "grit/theme_resources.h"
51 #include "ui/base/l10n/l10n_util.h"
52 #include "ui/base/resource/resource_bundle.h"
53 #include "ui/base/theme_provider.h"
54 #include "ui/base/webui/jstemplate_builder.h"
55 #include "ui/base/webui/web_ui_util.h"
56 #include "ui/gfx/animation/animation.h"
57 #include "ui/gfx/color_utils.h"
58 #include "ui/gfx/sys_color_change_listener.h"
60 #if defined(OS_CHROMEOS)
61 #include "chromeos/chromeos_switches.h"
64 #if defined(OS_MACOSX)
65 #include "chrome/browser/platform_util.h"
68 using content::BrowserThread
;
72 // The URL for the the Learn More page shown on incognito new tab.
73 const char kLearnMoreIncognitoUrl
[] =
74 #if defined(OS_CHROMEOS)
75 "https://www.google.com/support/chromeos/bin/answer.py?answer=95464";
77 "https://www.google.com/support/chrome/bin/answer.py?answer=95464";
80 // The URL for the Learn More page shown on guest session new tab.
81 const char kLearnMoreGuestSessionUrl
[] =
82 "https://www.google.com/support/chromeos/bin/answer.py?answer=1057090";
84 base::string16
GetUrlWithLang(const GURL
& url
) {
85 return base::ASCIIToUTF16(google_util::AppendGoogleLocaleParam(url
).spec());
88 std::string
SkColorToRGBAString(SkColor color
) {
89 // We convert the alpha using DoubleToString because StringPrintf will use
90 // locale specific formatters (e.g., use , instead of . in German).
91 return base::StringPrintf(
96 base::DoubleToString(SkColorGetA(color
) / 255.0).c_str());
99 // Creates an rgb string for an SkColor, but leaves the alpha blank so that the
100 // css can fill it in.
101 std::string
SkColorToRGBComponents(SkColor color
) {
102 return base::StringPrintf(
109 SkColor
GetThemeColor(ui::ThemeProvider
* tp
, int id
) {
110 SkColor color
= tp
->GetColor(id
);
111 // If web contents are being inverted because the system is in high-contrast
112 // mode, any system theme colors we use must be inverted too to cancel out.
113 return gfx::IsInvertedColorScheme() ?
114 color_utils::InvertColor(color
) : color
;
117 // Get the CSS string for the background position on the new tab page for the
118 // states when the bar is attached or detached.
119 std::string
GetNewTabBackgroundCSS(const ui::ThemeProvider
* theme_provider
,
121 // TODO(glen): This is a quick workaround to hide the notused.png image when
122 // no image is provided - we don't have time right now to figure out why
123 // this is painting as white.
124 // http://crbug.com/17593
125 if (!theme_provider
->HasCustomImage(IDR_THEME_NTP_BACKGROUND
)) {
129 int alignment
= theme_provider
->GetDisplayProperty(
130 ThemeProperties::NTP_BACKGROUND_ALIGNMENT
);
133 return ThemeProperties::AlignmentToString(alignment
);
135 if (alignment
& ThemeProperties::ALIGN_TOP
) {
136 // The bar is detached, so we must offset the background by the bar size
137 // if it's a top-aligned bar.
138 int offset
= chrome::kNTPBookmarkBarHeight
;
140 if (alignment
& ThemeProperties::ALIGN_LEFT
)
141 return "left " + base::IntToString(-offset
) + "px";
142 else if (alignment
& ThemeProperties::ALIGN_RIGHT
)
143 return "right " + base::IntToString(-offset
) + "px";
144 return "center " + base::IntToString(-offset
) + "px";
147 return ThemeProperties::AlignmentToString(alignment
);
150 // How the background image on the new tab page should be tiled (see tiling
151 // masks in theme_service.h).
152 std::string
GetNewTabBackgroundTilingCSS(
153 const ui::ThemeProvider
* theme_provider
) {
154 int repeat_mode
= theme_provider
->GetDisplayProperty(
155 ThemeProperties::NTP_BACKGROUND_TILING
);
156 return ThemeProperties::TilingToString(repeat_mode
);
161 NTPResourceCache::NTPResourceCache(Profile
* profile
)
162 : profile_(profile
), is_swipe_tracking_from_scroll_events_enabled_(false),
163 should_show_apps_page_(NewTabUI::ShouldShowApps()),
164 should_show_most_visited_page_(true),
165 should_show_other_devices_menu_(true),
166 should_show_recently_closed_menu_(true) {
167 registrar_
.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED
,
168 content::Source
<ThemeService
>(
169 ThemeServiceFactory::GetForProfile(profile
)));
170 registrar_
.Add(this, chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED
,
171 content::NotificationService::AllSources());
173 base::Closure callback
= base::Bind(&NTPResourceCache::OnPreferenceChanged
,
174 base::Unretained(this));
176 // Watch for pref changes that cause us to need to invalidate the HTML cache.
177 profile_pref_change_registrar_
.Init(profile_
->GetPrefs());
178 profile_pref_change_registrar_
.Add(prefs::kSyncAcknowledgedSyncTypes
,
180 profile_pref_change_registrar_
.Add(prefs::kShowBookmarkBar
, callback
);
181 profile_pref_change_registrar_
.Add(prefs::kNtpShownPage
, callback
);
182 profile_pref_change_registrar_
.Add(prefs::kSignInPromoShowNTPBubble
,
184 profile_pref_change_registrar_
.Add(prefs::kHideWebStoreIcon
, callback
);
186 // Some tests don't have a local state.
187 #if defined(ENABLE_APP_LIST)
188 if (g_browser_process
->local_state()) {
189 local_state_pref_change_registrar_
.Init(g_browser_process
->local_state());
190 local_state_pref_change_registrar_
.Add(prefs::kShowAppLauncherPromo
,
192 local_state_pref_change_registrar_
.Add(
193 prefs::kAppLauncherHasBeenEnabled
, callback
);
198 NTPResourceCache::~NTPResourceCache() {}
200 bool NTPResourceCache::NewTabCacheNeedsRefresh() {
201 #if defined(OS_MACOSX)
202 // Invalidate if the current value is different from the cached value.
203 bool is_enabled
= platform_util::IsSwipeTrackingFromScrollEventsEnabled();
204 if (is_enabled
!= is_swipe_tracking_from_scroll_events_enabled_
) {
205 is_swipe_tracking_from_scroll_events_enabled_
= is_enabled
;
209 bool should_show_apps_page
= NewTabUI::ShouldShowApps();
210 if (should_show_apps_page
!= should_show_apps_page_
) {
211 should_show_apps_page_
= should_show_apps_page
;
217 NTPResourceCache::WindowType
NTPResourceCache::GetWindowType(
218 Profile
* profile
, content::RenderProcessHost
* render_host
) {
219 if (profile
->IsGuestSession()) {
220 return NTPResourceCache::GUEST
;
221 } else if (render_host
) {
222 // Sometimes the |profile| is the parent (non-incognito) version of the user
223 // so we check the |render_host| if it is provided.
224 if (render_host
->GetBrowserContext()->IsOffTheRecord())
225 return NTPResourceCache::INCOGNITO
;
226 } else if (profile
->IsOffTheRecord()) {
227 return NTPResourceCache::INCOGNITO
;
229 return NTPResourceCache::NORMAL
;
232 base::RefCountedMemory
* NTPResourceCache::GetNewTabHTML(WindowType win_type
) {
233 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI
));
234 if (win_type
== GUEST
) {
235 if (!new_tab_guest_html_
.get())
236 CreateNewTabGuestHTML();
237 return new_tab_guest_html_
.get();
238 } else if (win_type
== INCOGNITO
) {
239 if (!new_tab_incognito_html_
.get())
240 CreateNewTabIncognitoHTML();
241 return new_tab_incognito_html_
.get();
243 // Refresh the cached HTML if necessary.
244 // NOTE: NewTabCacheNeedsRefresh() must be called every time the new tab
245 // HTML is fetched, because it needs to initialize cached values.
246 if (NewTabCacheNeedsRefresh() || !new_tab_html_
.get())
248 return new_tab_html_
.get();
252 base::RefCountedMemory
* NTPResourceCache::GetNewTabCSS(WindowType win_type
) {
253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI
));
254 if (win_type
== GUEST
) {
255 if (!new_tab_guest_css_
.get())
256 CreateNewTabGuestCSS();
257 return new_tab_guest_css_
.get();
258 } else if (win_type
== INCOGNITO
) {
259 if (!new_tab_incognito_css_
.get())
260 CreateNewTabIncognitoCSS();
261 return new_tab_incognito_css_
.get();
263 if (!new_tab_css_
.get())
265 return new_tab_css_
.get();
269 void NTPResourceCache::Observe(int type
,
270 const content::NotificationSource
& source
,
271 const content::NotificationDetails
& details
) {
272 // Invalidate the cache.
273 if (chrome::NOTIFICATION_BROWSER_THEME_CHANGED
== type
||
274 chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED
== type
) {
275 new_tab_incognito_html_
= NULL
;
276 new_tab_html_
= NULL
;
277 new_tab_incognito_css_
= NULL
;
284 void NTPResourceCache::OnPreferenceChanged() {
285 // A change occurred to one of the preferences we care about, so flush the
287 new_tab_incognito_html_
= NULL
;
288 new_tab_html_
= NULL
;
292 void NTPResourceCache::CreateNewTabIncognitoHTML() {
293 base::DictionaryValue localized_strings
;
294 localized_strings
.SetString("title",
295 l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE
));
296 int new_tab_message_ids
= IDS_NEW_TAB_OTR_MESSAGE
;
297 int new_tab_html_idr
= IDR_INCOGNITO_TAB_HTML
;
298 const char* new_tab_link
= kLearnMoreIncognitoUrl
;
299 // TODO(altimofeev): consider implementation without 'if def' usage.
300 #if defined(OS_CHROMEOS)
301 if (CommandLine::ForCurrentProcess()->HasSwitch(
302 chromeos::switches::kGuestSession
)) {
303 new_tab_message_ids
= IDS_NEW_TAB_GUEST_SESSION_MESSAGE
;
304 new_tab_html_idr
= IDR_GUEST_SESSION_TAB_HTML
;
305 new_tab_link
= kLearnMoreGuestSessionUrl
;
307 std::string enterprise_domain
=
308 g_browser_process
->browser_policy_connector()->GetEnterpriseDomain();
309 if (!enterprise_domain
.empty()) {
310 // Device is enterprise enrolled.
311 localized_strings
.SetString("enterpriseInfoVisible", "true");
312 base::string16 enterprise_info
= l10n_util::GetStringFUTF16(
313 IDS_DEVICE_OWNED_BY_NOTICE
,
314 base::UTF8ToUTF16(enterprise_domain
));
315 localized_strings
.SetString("enterpriseInfoMessage", enterprise_info
);
316 localized_strings
.SetString("learnMore",
317 l10n_util::GetStringUTF16(IDS_LEARN_MORE
));
318 localized_strings
.SetString("enterpriseInfoHintLink",
319 GetUrlWithLang(GURL(chrome::kLearnMoreEnterpriseURL
)));
321 localized_strings
.SetString("enterpriseInfoVisible", "false");
325 localized_strings
.SetString("content",
326 l10n_util::GetStringFUTF16(new_tab_message_ids
,
327 GetUrlWithLang(GURL(new_tab_link
))));
328 localized_strings
.SetString("extensionsmessage",
329 l10n_util::GetStringFUTF16(
330 IDS_NEW_TAB_OTR_EXTENSIONS_MESSAGE
,
331 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME
),
332 base::ASCIIToUTF16(chrome::kChromeUIExtensionsURL
)));
333 bool bookmark_bar_attached
= profile_
->GetPrefs()->GetBoolean(
334 prefs::kShowBookmarkBar
);
335 localized_strings
.SetBoolean("bookmarkbarattached", bookmark_bar_attached
);
337 webui::SetFontAndTextDirection(&localized_strings
);
339 static const base::StringPiece
incognito_tab_html(
340 ResourceBundle::GetSharedInstance().GetRawDataResource(
343 std::string full_html
= webui::GetI18nTemplateHtml(
344 incognito_tab_html
, &localized_strings
);
346 new_tab_incognito_html_
= base::RefCountedString::TakeString(&full_html
);
349 void NTPResourceCache::CreateNewTabGuestHTML() {
350 base::DictionaryValue localized_strings
;
351 localized_strings
.SetString("title",
352 l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE
));
353 const char* new_tab_link
= kLearnMoreGuestSessionUrl
;
354 localized_strings
.SetString("content",
355 l10n_util::GetStringFUTF16(IDS_NEW_TAB_GUEST_SESSION_MESSAGE
,
356 GetUrlWithLang(GURL(new_tab_link
))));
358 webui::SetFontAndTextDirection(&localized_strings
);
360 static const base::StringPiece
guest_tab_html(
361 ResourceBundle::GetSharedInstance().GetRawDataResource(
362 IDR_GUEST_TAB_HTML
));
364 std::string full_html
= webui::GetI18nTemplateHtml(
365 guest_tab_html
, &localized_strings
);
367 new_tab_guest_html_
= base::RefCountedString::TakeString(&full_html
);
370 void NTPResourceCache::CreateNewTabHTML() {
371 // TODO(estade): these strings should be defined in their relevant handlers
372 // (in GetLocalizedValues) and should have more legible names.
373 // Show the profile name in the title and most visited labels if the current
374 // profile is not the default.
375 PrefService
* prefs
= profile_
->GetPrefs();
376 base::DictionaryValue load_time_data
;
377 load_time_data
.SetBoolean("bookmarkbarattached",
378 prefs
->GetBoolean(prefs::kShowBookmarkBar
));
379 load_time_data
.SetBoolean("hasattribution",
380 ThemeServiceFactory::GetForProfile(profile_
)->HasCustomImage(
381 IDR_THEME_NTP_ATTRIBUTION
));
382 load_time_data
.SetBoolean("showMostvisited", should_show_most_visited_page_
);
383 load_time_data
.SetBoolean("showAppLauncherPromo",
384 ShouldShowAppLauncherPromo());
385 load_time_data
.SetBoolean("showRecentlyClosed",
386 should_show_recently_closed_menu_
);
387 load_time_data
.SetString("title",
388 l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE
));
389 load_time_data
.SetString("mostvisited",
390 l10n_util::GetStringUTF16(IDS_NEW_TAB_MOST_VISITED
));
391 load_time_data
.SetString("suggestions",
392 l10n_util::GetStringUTF16(IDS_NEW_TAB_SUGGESTIONS
));
393 load_time_data
.SetString("restoreThumbnailsShort",
394 l10n_util::GetStringUTF16(IDS_NEW_TAB_RESTORE_THUMBNAILS_SHORT_LINK
));
395 load_time_data
.SetString("recentlyclosed",
396 l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED
));
397 load_time_data
.SetString("webStoreTitle",
398 l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE
));
399 load_time_data
.SetString("webStoreTitleShort",
400 l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE_SHORT
));
401 load_time_data
.SetString("closedwindowsingle",
402 l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED_WINDOW_SINGLE
));
403 load_time_data
.SetString("closedwindowmultiple",
404 l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED_WINDOW_MULTIPLE
));
405 load_time_data
.SetString("attributionintro",
406 l10n_util::GetStringUTF16(IDS_NEW_TAB_ATTRIBUTION_INTRO
));
407 load_time_data
.SetString("thumbnailremovednotification",
408 l10n_util::GetStringUTF16(IDS_NEW_TAB_THUMBNAIL_REMOVED_NOTIFICATION
));
409 load_time_data
.SetString("undothumbnailremove",
410 l10n_util::GetStringUTF16(IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE
));
411 load_time_data
.SetString("removethumbnailtooltip",
412 l10n_util::GetStringUTF16(IDS_NEW_TAB_REMOVE_THUMBNAIL_TOOLTIP
));
413 load_time_data
.SetString("appuninstall",
414 l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL
));
415 load_time_data
.SetString("appoptions",
416 l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_OPTIONS
));
417 load_time_data
.SetString("appdetails",
418 l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_DETAILS
));
419 load_time_data
.SetString("appcreateshortcut",
420 l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_CREATE_SHORTCUT
));
421 load_time_data
.SetString("appDefaultPageName",
422 l10n_util::GetStringUTF16(IDS_APP_DEFAULT_PAGE_NAME
));
423 load_time_data
.SetString("applaunchtypepinned",
424 l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_PINNED
));
425 load_time_data
.SetString("applaunchtyperegular",
426 l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_REGULAR
));
427 load_time_data
.SetString("applaunchtypewindow",
428 l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_WINDOW
));
429 load_time_data
.SetString("applaunchtypefullscreen",
430 l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_FULLSCREEN
));
431 load_time_data
.SetString("syncpromotext",
432 l10n_util::GetStringUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL
));
433 load_time_data
.SetString("syncLinkText",
434 l10n_util::GetStringUTF16(IDS_SYNC_ADVANCED_OPTIONS
));
435 load_time_data
.SetBoolean("shouldShowSyncLogin",
436 NTPLoginHandler::ShouldShow(profile_
));
437 load_time_data
.SetString("otherSessions",
438 l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_LABEL
));
439 load_time_data
.SetString("otherSessionsEmpty",
440 l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_EMPTY
));
441 load_time_data
.SetString("otherSessionsLearnMoreUrl",
442 l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_LEARN_MORE_URL
));
443 load_time_data
.SetString("learnMore",
444 l10n_util::GetStringUTF16(IDS_LEARN_MORE
));
445 load_time_data
.SetString("webStoreLink",
446 GetUrlWithLang(GURL(extension_urls::GetWebstoreLaunchURL())));
447 load_time_data
.SetString("appInstallHintText",
448 l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_INSTALL_HINT_LABEL
));
449 load_time_data
.SetBoolean("isDiscoveryInNTPEnabled",
450 NewTabUI::IsDiscoveryInNTPEnabled());
451 load_time_data
.SetString("collapseSessionMenuItemText",
452 l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_COLLAPSE_SESSION
));
453 load_time_data
.SetString("expandSessionMenuItemText",
454 l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_EXPAND_SESSION
));
455 load_time_data
.SetString("restoreSessionMenuItemText",
456 l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_OPEN_ALL
));
457 load_time_data
.SetString("learn_more",
458 l10n_util::GetStringUTF16(IDS_LEARN_MORE
));
459 load_time_data
.SetString("tile_grid_screenreader_accessible_description",
460 l10n_util::GetStringUTF16(IDS_NEW_TAB_TILE_GRID_ACCESSIBLE_DESCRIPTION
));
461 load_time_data
.SetString("page_switcher_change_title",
462 l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_SWITCHER_CHANGE_TITLE
));
463 load_time_data
.SetString("page_switcher_same_title",
464 l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_SWITCHER_SAME_TITLE
));
465 load_time_data
.SetString("appsPromoTitle",
466 l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_APPS_PROMO_TITLE
));
467 // On Mac OS X 10.7+, horizontal scrolling can be treated as a back or
468 // forward gesture. Pass through a flag that indicates whether or not that
469 // feature is enabled.
470 load_time_data
.SetBoolean("isSwipeTrackingFromScrollEventsEnabled",
471 is_swipe_tracking_from_scroll_events_enabled_
);
472 // Managed users can not have apps installed currently so there's no need to
473 // show the app cards.
474 if (profile_
->IsManaged())
475 should_show_apps_page_
= false;
477 load_time_data
.SetBoolean("showApps", should_show_apps_page_
);
478 load_time_data
.SetBoolean("showWebStoreIcon",
479 !prefs
->GetBoolean(prefs::kHideWebStoreIcon
));
481 bool streamlined_hosted_apps
= CommandLine::ForCurrentProcess()->HasSwitch(
482 switches::kEnableStreamlinedHostedApps
);
483 load_time_data
.SetBoolean("enableStreamlinedHostedApps",
484 streamlined_hosted_apps
);
485 // Use a different string for launching as a regular tab for streamlined
487 if (streamlined_hosted_apps
) {
488 load_time_data
.SetString("applaunchtypetab",
489 l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_TAB
));
492 #if defined(OS_MACOSX)
493 load_time_data
.SetBoolean(
494 "disableCreateAppShortcut",
495 CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableAppShims
));
498 #if defined(OS_CHROMEOS)
499 load_time_data
.SetString("expandMenu",
500 l10n_util::GetStringUTF16(IDS_NEW_TAB_CLOSE_MENU_EXPAND
));
503 NewTabPageHandler::GetLocalizedValues(profile_
, &load_time_data
);
504 NTPLoginHandler::GetLocalizedValues(profile_
, &load_time_data
);
506 webui::SetFontAndTextDirection(&load_time_data
);
508 // Control fade and resize animations.
509 load_time_data
.SetBoolean("anim",
510 gfx::Animation::ShouldRenderRichAnimation());
512 ui::ThemeProvider
* tp
= ThemeServiceFactory::GetForProfile(profile_
);
513 int alignment
= tp
->GetDisplayProperty(
514 ThemeProperties::NTP_BACKGROUND_ALIGNMENT
);
515 load_time_data
.SetString("themegravity",
516 (alignment
& ThemeProperties::ALIGN_RIGHT
) ? "right" : "");
518 // Disable the promo if this is the first run, otherwise set the promo string
519 // for display if there is a valid outstanding promo.
520 if (first_run::IsChromeFirstRun()) {
521 NotificationPromo::HandleClosed(NotificationPromo::NTP_NOTIFICATION_PROMO
);
523 NotificationPromo notification_promo
;
524 notification_promo
.InitFromPrefs(NotificationPromo::NTP_NOTIFICATION_PROMO
);
525 if (notification_promo
.CanShow()) {
526 load_time_data
.SetString("notificationPromoText",
527 notification_promo
.promo_text());
528 DVLOG(1) << "Notification promo:" << notification_promo
.promo_text();
531 NotificationPromo bubble_promo
;
532 bubble_promo
.InitFromPrefs(NotificationPromo::NTP_BUBBLE_PROMO
);
533 if (bubble_promo
.CanShow()) {
534 load_time_data
.SetString("bubblePromoText",
535 bubble_promo
.promo_text());
536 DVLOG(1) << "Bubble promo:" << bubble_promo
.promo_text();
540 // Determine whether to show the menu for accessing tabs on other devices.
541 bool show_other_sessions_menu
= should_show_other_devices_menu_
&&
542 !CommandLine::ForCurrentProcess()->HasSwitch(
543 switches::kDisableNTPOtherSessionsMenu
);
544 load_time_data
.SetBoolean("showOtherSessionsMenu", show_other_sessions_menu
);
545 load_time_data
.SetBoolean("isUserSignedIn",
546 !prefs
->GetString(prefs::kGoogleServicesUsername
).empty());
548 // Load the new tab page appropriate for this build.
549 base::StringPiece
new_tab_html(ResourceBundle::GetSharedInstance().
550 GetRawDataResource(IDR_NEW_TAB_4_HTML
));
551 webui::UseVersion2 version2
;
552 std::string full_html
=
553 webui::GetI18nTemplateHtml(new_tab_html
, &load_time_data
);
554 new_tab_html_
= base::RefCountedString::TakeString(&full_html
);
557 void NTPResourceCache::CreateNewTabIncognitoCSS() {
558 ui::ThemeProvider
* tp
= ThemeServiceFactory::GetForProfile(profile_
);
561 // Get our theme colors
562 SkColor color_background
=
563 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_BACKGROUND
);
565 // Generate the replacements.
566 std::vector
<std::string
> subst
;
568 // Cache-buster for background.
570 profile_
->GetPrefs()->GetString(prefs::kCurrentThemeID
)); // $1
573 subst
.push_back(SkColorToRGBAString(color_background
)); // $2
574 subst
.push_back(GetNewTabBackgroundCSS(tp
, false)); // $3
575 subst
.push_back(GetNewTabBackgroundCSS(tp
, true)); // $4
576 subst
.push_back(GetNewTabBackgroundTilingCSS(tp
)); // $5
579 static const base::StringPiece
new_tab_theme_css(
580 ResourceBundle::GetSharedInstance().GetRawDataResource(
581 IDR_NEW_INCOGNITO_TAB_THEME_CSS
));
583 // Create the string from our template and the replacements.
584 std::string full_css
= ReplaceStringPlaceholders(
585 new_tab_theme_css
, subst
, NULL
);
587 new_tab_incognito_css_
= base::RefCountedString::TakeString(&full_css
);
590 void NTPResourceCache::CreateNewTabGuestCSS() {
591 ui::ThemeProvider
* tp
= ThemeServiceFactory::GetForProfile(profile_
);
594 // Get our theme colors
595 SkColor color_background
=
596 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_BACKGROUND
);
598 // Generate the replacements.
599 std::vector
<std::string
> subst
;
601 // Cache-buster for background.
603 profile_
->GetPrefs()->GetString(prefs::kCurrentThemeID
)); // $1
606 subst
.push_back(SkColorToRGBAString(color_background
)); // $2
607 subst
.push_back(GetNewTabBackgroundCSS(tp
, false)); // $3
608 subst
.push_back(GetNewTabBackgroundCSS(tp
, true)); // $4
609 subst
.push_back(GetNewTabBackgroundTilingCSS(tp
)); // $5
612 static const base::StringPiece
new_tab_theme_css(
613 ResourceBundle::GetSharedInstance().GetRawDataResource(
614 IDR_NEW_GUEST_TAB_THEME_CSS
));
616 // Create the string from our template and the replacements.
617 std::string full_css
= ReplaceStringPlaceholders(
618 new_tab_theme_css
, subst
, NULL
);
620 new_tab_guest_css_
= base::RefCountedString::TakeString(&full_css
);
623 void NTPResourceCache::CreateNewTabCSS() {
624 ui::ThemeProvider
* tp
= ThemeServiceFactory::GetForProfile(profile_
);
627 // Get our theme colors
628 SkColor color_background
=
629 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_BACKGROUND
);
630 SkColor color_text
= GetThemeColor(tp
, ThemeProperties::COLOR_NTP_TEXT
);
631 SkColor color_link
= GetThemeColor(tp
, ThemeProperties::COLOR_NTP_LINK
);
632 SkColor color_link_underline
=
633 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_LINK_UNDERLINE
);
635 SkColor color_section
=
636 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION
);
637 SkColor color_section_text
=
638 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_TEXT
);
639 SkColor color_section_link
=
640 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_LINK
);
641 SkColor color_section_link_underline
=
642 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE
);
643 SkColor color_section_header_text
=
644 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_HEADER_TEXT
);
645 SkColor color_section_header_text_hover
=
646 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_HEADER_TEXT_HOVER
);
647 SkColor color_section_header_rule
=
648 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_HEADER_RULE
);
649 SkColor color_section_header_rule_light
=
650 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_SECTION_HEADER_RULE_LIGHT
);
651 SkColor color_text_light
=
652 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_TEXT_LIGHT
);
654 SkColor color_header
=
655 GetThemeColor(tp
, ThemeProperties::COLOR_NTP_HEADER
);
656 // Generate a lighter color for the header gradients.
657 color_utils::HSL header_lighter
;
658 color_utils::SkColorToHSL(color_header
, &header_lighter
);
659 header_lighter
.l
+= (1 - header_lighter
.l
) * 0.33;
660 SkColor color_header_gradient_light
=
661 color_utils::HSLToSkColor(header_lighter
, SkColorGetA(color_header
));
663 // Generate section border color from the header color. See
664 // BookmarkBarView::Paint for how we do this for the bookmark bar
666 SkColor color_section_border
=
668 SkColorGetR(color_header
),
669 SkColorGetG(color_header
),
670 SkColorGetB(color_header
));
672 // Generate the replacements.
673 std::vector
<std::string
> subst
;
675 // Cache-buster for background.
677 profile_
->GetPrefs()->GetString(prefs::kCurrentThemeID
)); // $1
680 subst
.push_back(SkColorToRGBAString(color_background
)); // $2
681 subst
.push_back(GetNewTabBackgroundCSS(tp
, false)); // $3
682 subst
.push_back(GetNewTabBackgroundCSS(tp
, true)); // $4
683 subst
.push_back(GetNewTabBackgroundTilingCSS(tp
)); // $5
684 subst
.push_back(SkColorToRGBAString(color_header
)); // $6
685 subst
.push_back(SkColorToRGBAString(color_header_gradient_light
)); // $7
686 subst
.push_back(SkColorToRGBAString(color_text
)); // $8
687 subst
.push_back(SkColorToRGBAString(color_link
)); // $9
688 subst
.push_back(SkColorToRGBAString(color_section
)); // $10
689 subst
.push_back(SkColorToRGBAString(color_section_border
)); // $11
690 subst
.push_back(SkColorToRGBAString(color_section_text
)); // $12
691 subst
.push_back(SkColorToRGBAString(color_section_link
)); // $13
692 subst
.push_back(SkColorToRGBAString(color_link_underline
)); // $14
693 subst
.push_back(SkColorToRGBAString(color_section_link_underline
)); // $15
694 subst
.push_back(SkColorToRGBAString(color_section_header_text
)); // $16
695 subst
.push_back(SkColorToRGBAString(
696 color_section_header_text_hover
)); // $17
697 subst
.push_back(SkColorToRGBAString(color_section_header_rule
)); // $18
698 subst
.push_back(SkColorToRGBAString(
699 color_section_header_rule_light
)); // $19
700 subst
.push_back(SkColorToRGBAString(
701 SkColorSetA(color_section_header_rule
, 0))); // $20
702 subst
.push_back(SkColorToRGBAString(color_text_light
)); // $21
703 subst
.push_back(SkColorToRGBComponents(color_section_border
)); // $22
704 subst
.push_back(SkColorToRGBComponents(color_text
)); // $23
707 static const base::StringPiece
new_tab_theme_css(
708 ResourceBundle::GetSharedInstance().GetRawDataResource(
709 IDR_NEW_TAB_4_THEME_CSS
));
711 // Create the string from our template and the replacements.
712 std::string css_string
;
713 css_string
= ReplaceStringPlaceholders(new_tab_theme_css
, subst
, NULL
);
714 new_tab_css_
= base::RefCountedString::TakeString(&css_string
);