15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_properties.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h"
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_bar_constants.h"
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/sync/sync_promo_ui.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/new_tab_page_handler.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/ntp_login_handler.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/sync_setup_handler.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/notification_promo.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h"
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_urls.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h"
554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/jstemplate_builder.h"
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/webui/web_ui_util.h"
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/animation.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/sys_color_change_listener.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The URL for the the Learn More page shown on incognito new tab.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLearnMoreIncognitoUrl[] =
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://www.google.com/support/chromeos/bin/answer.py?answer=95464";
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://www.google.com/support/chrome/bin/answer.py?answer=95464";
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The URL for the Learn More page shown on guest session new tab.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kLearnMoreGuestSessionUrl[] =
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "https://www.google.com/support/chromeos/bin/answer.py?answer=1057090";
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SkColorToRGBAString(SkColor color) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We convert the alpha using DoubleToString because StringPrintf will use
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // locale specific formatters (e.g., use , instead of . in German).
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::StringPrintf(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "rgba(%d,%d,%d,%s)",
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetR(color),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetG(color),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetB(color),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::DoubleToString(SkColorGetA(color) / 255.0).c_str());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates an rgb string for an SkColor, but leaves the alpha blank so that the
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// css can fill it in.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SkColorToRGBComponents(SkColor color) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::StringPrintf(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "%d,%d,%d",
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetR(color),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetG(color),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorGetB(color));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkColor GetThemeColor(ui::ThemeProvider* tp, int id) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color = tp->GetColor(id);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If web contents are being inverted because the system is in high-contrast
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode, any system theme colors we use must be inverted too to cancel out.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::IsInvertedColorScheme() ?
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      color_utils::InvertColor(color) : color;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the CSS string for the background position on the new tab page for the
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// states when the bar is attached or detached.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetNewTabBackgroundCSS(const ui::ThemeProvider* theme_provider,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   bool bar_attached) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(glen): This is a quick workaround to hide the notused.png image when
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no image is provided - we don't have time right now to figure out why
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this is painting as white.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/17593
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!theme_provider->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "-64px";
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int alignment = theme_provider->GetDisplayProperty(
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ThemeProperties::NTP_BACKGROUND_ALIGNMENT);
129424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (bar_attached)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ThemeProperties::AlignmentToString(alignment);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (alignment & ThemeProperties::ALIGN_TOP) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The bar is detached, so we must offset the background by the bar size
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if it's a top-aligned bar.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int offset = chrome::kNTPBookmarkBarHeight;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (alignment & ThemeProperties::ALIGN_LEFT)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "left " + base::IntToString(-offset) + "px";
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (alignment & ThemeProperties::ALIGN_RIGHT)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "right " + base::IntToString(-offset) + "px";
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "center " + base::IntToString(-offset) + "px";
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ThemeProperties::AlignmentToString(alignment);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How the background image on the new tab page should be tiled (see tiling
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// masks in theme_service.h).
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetNewTabBackgroundTilingCSS(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::ThemeProvider* theme_provider) {
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int repeat_mode = theme_provider->GetDisplayProperty(
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ThemeProperties::NTP_BACKGROUND_TILING);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ThemeProperties::TilingToString(repeat_mode);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NTPResourceCache::NTPResourceCache(Profile* profile)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : profile_(profile), is_swipe_tracking_from_scroll_events_enabled_(false),
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_show_apps_page_(NewTabUI::ShouldShowApps()),
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_show_most_visited_page_(true),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_show_other_devices_menu_(true),
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_show_recently_closed_menu_(true) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<ThemeService>(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ThemeServiceFactory::GetForProfile(profile)));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure callback = base::Bind(&NTPResourceCache::OnPreferenceChanged,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      base::Unretained(this));
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Watch for pref changes that cause us to need to invalidate the HTML cache.
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile_pref_change_registrar_.Init(profile_->GetPrefs());
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  profile_pref_change_registrar_.Add(bookmarks::prefs::kShowBookmarkBar,
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     callback);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile_pref_change_registrar_.Add(prefs::kNtpShownPage, callback);
179bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  profile_pref_change_registrar_.Add(prefs::kSignInPromoShowNTPBubble,
180bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                     callback);
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  profile_pref_change_registrar_.Add(prefs::kHideWebStoreIcon, callback);
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Some tests don't have a local state.
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_APP_LIST)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (g_browser_process->local_state()) {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    local_state_pref_change_registrar_.Init(g_browser_process->local_state());
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    local_state_pref_change_registrar_.Add(prefs::kShowAppLauncherPromo,
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           callback);
189b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    local_state_pref_change_registrar_.Add(
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        prefs::kAppLauncherHasBeenEnabled, callback);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NTPResourceCache::~NTPResourceCache() {}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NTPResourceCache::NewTabCacheNeedsRefresh() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalidate if the current value is different from the cached value.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_enabled = platform_util::IsSwipeTrackingFromScrollEventsEnabled();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_enabled != is_swipe_tracking_from_scroll_events_enabled_) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_swipe_tracking_from_scroll_events_enabled_ = is_enabled;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool should_show_apps_page = NewTabUI::ShouldShowApps();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (should_show_apps_page != should_show_apps_page_) {
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    should_show_apps_page_ = should_show_apps_page;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)NTPResourceCache::WindowType NTPResourceCache::GetWindowType(
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    Profile* profile, content::RenderProcessHost* render_host) {
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (profile->IsGuestSession()) {
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return NTPResourceCache::GUEST;
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (render_host) {
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Sometimes the |profile| is the parent (non-incognito) version of the user
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // so we check the |render_host| if it is provided.
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (render_host->GetBrowserContext()->IsOffTheRecord())
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return NTPResourceCache::INCOGNITO;
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (profile->IsOffTheRecord()) {
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return NTPResourceCache::INCOGNITO;
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return NTPResourceCache::NORMAL;
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::RefCountedMemory* NTPResourceCache::GetNewTabHTML(WindowType win_type) {
230e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (win_type == GUEST) {
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!new_tab_guest_html_.get())
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CreateNewTabGuestHTML();
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return new_tab_guest_html_.get();
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (win_type == INCOGNITO) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_tab_incognito_html_.get())
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateNewTabIncognitoHTML();
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return new_tab_incognito_html_.get();
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Refresh the cached HTML if necessary.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: NewTabCacheNeedsRefresh() must be called every time the new tab
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // HTML is fetched, because it needs to initialize cached values.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (NewTabCacheNeedsRefresh() || !new_tab_html_.get())
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateNewTabHTML();
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return new_tab_html_.get();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::RefCountedMemory* NTPResourceCache::GetNewTabCSS(WindowType win_type) {
250e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (win_type == GUEST) {
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!new_tab_guest_css_.get())
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      CreateNewTabGuestCSS();
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return new_tab_guest_css_.get();
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (win_type == INCOGNITO) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_tab_incognito_css_.get())
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateNewTabIncognitoCSS();
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return new_tab_incognito_css_.get();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!new_tab_css_.get())
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateNewTabCSS();
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return new_tab_css_.get();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NTPResourceCache::Observe(int type,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const content::NotificationSource& source,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const content::NotificationDetails& details) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalidate the cache.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (chrome::NOTIFICATION_BROWSER_THEME_CHANGED == type ||
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED == type) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_tab_incognito_html_ = NULL;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_tab_html_ = NULL;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_tab_incognito_css_ = NULL;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_tab_css_ = NULL;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NTPResourceCache::OnPreferenceChanged() {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A change occurred to one of the preferences we care about, so flush the
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cache.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_incognito_html_ = NULL;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_html_ = NULL;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_css_ = NULL;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NTPResourceCache::CreateNewTabIncognitoHTML() {
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue localized_strings;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings.SetString("title",
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE));
2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int new_tab_description_ids = IDS_NEW_TAB_OTR_DESCRIPTION;
2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int new_tab_heading_ids = IDS_NEW_TAB_OTR_HEADING;
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int new_tab_link_ids = IDS_NEW_TAB_OTR_LEARN_MORE_LINK;
2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int new_tab_warning_ids = IDS_NEW_TAB_OTR_MESSAGE_WARNING;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int new_tab_html_idr = IDR_INCOGNITO_TAB_HTML;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* new_tab_link = kLearnMoreIncognitoUrl;
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (profile_->IsGuestSession()) {
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    localized_strings.SetString("guestTabDescription",
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        l10n_util::GetStringUTF16(new_tab_description_ids));
3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    localized_strings.SetString("guestTabHeading",
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        l10n_util::GetStringUTF16(new_tab_heading_ids));
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  } else {
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    localized_strings.SetString("incognitoTabDescription",
3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        l10n_util::GetStringUTF16(new_tab_description_ids));
3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    localized_strings.SetString("incognitoTabHeading",
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        l10n_util::GetStringUTF16(new_tab_heading_ids));
3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    localized_strings.SetString("incognitoTabWarning",
3115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        l10n_util::GetStringUTF16(new_tab_warning_ids));
3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  localized_strings.SetString("learnMore",
3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      l10n_util::GetStringUTF16(new_tab_link_ids));
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  localized_strings.SetString("learnMoreLink", new_tab_link);
3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool bookmark_bar_attached =
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile_->GetPrefs()->GetBoolean(bookmarks::prefs::kShowBookmarkBar);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings.SetBoolean("bookmarkbarattached", bookmark_bar_attached);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::SetFontAndTextDirection(&localized_strings);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const base::StringPiece incognito_tab_html(
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new_tab_html_idr));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string full_html = webui::GetI18nTemplateHtml(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incognito_tab_html, &localized_strings);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_incognito_html_ = base::RefCountedString::TakeString(&full_html);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NTPResourceCache::CreateNewTabGuestHTML() {
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue localized_strings;
3363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  localized_strings.SetString("title",
3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE));
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const char* guest_tab_link = kLearnMoreGuestSessionUrl;
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int guest_tab_ids = IDR_GUEST_TAB_HTML;
3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int guest_tab_description_ids = IDS_NEW_TAB_GUEST_SESSION_DESCRIPTION;
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int guest_tab_heading_ids = IDS_NEW_TAB_GUEST_SESSION_HEADING;
3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  int guest_tab_link_ids = IDS_NEW_TAB_GUEST_SESSION_LEARN_MORE_LINK;
3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS)
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  guest_tab_ids = IDR_GUEST_SESSION_TAB_HTML;
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  guest_tab_link = kLearnMoreGuestSessionUrl;
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  policy::BrowserPolicyConnectorChromeOS* connector =
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      g_browser_process->platform_part()->browser_policy_connector_chromeos();
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::string enterprise_domain = connector->GetEnterpriseDomain();
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!enterprise_domain.empty()) {
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // Device is enterprise enrolled.
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    localized_strings.SetString("enterpriseInfoVisible", "true");
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::string16 enterprise_info = l10n_util::GetStringFUTF16(
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        IDS_DEVICE_OWNED_BY_NOTICE,
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        base::UTF8ToUTF16(enterprise_domain));
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    localized_strings.SetString("enterpriseInfoMessage", enterprise_info);
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    localized_strings.SetString("enterpriseLearnMore",
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        l10n_util::GetStringUTF16(IDS_LEARN_MORE));
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    localized_strings.SetString("enterpriseInfoHintLink",
362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                chrome::kLearnMoreEnterpriseURL);
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    localized_strings.SetString("enterpriseInfoVisible", "false");
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  localized_strings.SetString("guestTabDescription",
3695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      l10n_util::GetStringUTF16(guest_tab_description_ids));
3705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  localized_strings.SetString("guestTabHeading",
3715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      l10n_util::GetStringUTF16(guest_tab_heading_ids));
3725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  localized_strings.SetString("learnMore",
3735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      l10n_util::GetStringUTF16(guest_tab_link_ids));
374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  localized_strings.SetString("learnMoreLink", guest_tab_link);
3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  webui::SetFontAndTextDirection(&localized_strings);
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const base::StringPiece guest_tab_html(
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(guest_tab_ids));
3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string full_html = webui::GetI18nTemplateHtml(
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      guest_tab_html, &localized_strings);
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_tab_guest_html_ = base::RefCountedString::TakeString(&full_html);
3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NTPResourceCache::CreateNewTabHTML() {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(estade): these strings should be defined in their relevant handlers
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (in GetLocalizedValues) and should have more legible names.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show the profile name in the title and most visited labels if the current
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile is not the default.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile_->GetPrefs();
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue load_time_data;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetBoolean("bookmarkbarattached",
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prefs->GetBoolean(bookmarks::prefs::kShowBookmarkBar));
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetBoolean("hasattribution",
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ThemeServiceFactory::GetForProfile(profile_)->HasCustomImage(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDR_THEME_NTP_ATTRIBUTION));
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  load_time_data.SetBoolean("showMostvisited", should_show_most_visited_page_);
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  load_time_data.SetBoolean("showAppLauncherPromo",
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ShouldShowAppLauncherPromo());
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  load_time_data.SetBoolean("showRecentlyClosed",
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_show_recently_closed_menu_);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("title",
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("mostvisited",
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_MOST_VISITED));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("suggestions",
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_SUGGESTIONS));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("restoreThumbnailsShort",
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_RESTORE_THUMBNAILS_SHORT_LINK));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("recentlyclosed",
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("webStoreTitle",
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("webStoreTitleShort",
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE_SHORT));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("closedwindowsingle",
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED_WINDOW_SINGLE));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("closedwindowmultiple",
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED_WINDOW_MULTIPLE));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("attributionintro",
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_ATTRIBUTION_INTRO));
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("thumbnailremovednotification",
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_THUMBNAIL_REMOVED_NOTIFICATION));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("undothumbnailremove",
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("removethumbnailtooltip",
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_REMOVE_THUMBNAIL_TOOLTIP));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("appuninstall",
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("appoptions",
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_OPTIONS));
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("appdetails",
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_DETAILS));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("appcreateshortcut",
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_CREATE_SHORTCUT));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("appDefaultPageName",
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_DEFAULT_PAGE_NAME));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("applaunchtypepinned",
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_PINNED));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("applaunchtyperegular",
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_REGULAR));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("applaunchtypewindow",
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_WINDOW));
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("applaunchtypefullscreen",
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_FULLSCREEN));
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("syncpromotext",
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("syncLinkText",
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_SYNC_ADVANCED_OPTIONS));
452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  load_time_data.SetBoolean("shouldShowSyncLogin",
453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            NTPLoginHandler::ShouldShow(profile_));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("otherSessions",
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_LABEL));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("otherSessionsEmpty",
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_EMPTY));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("otherSessionsLearnMoreUrl",
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_LEARN_MORE_URL));
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("learnMore",
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LEARN_MORE));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("webStoreLink",
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      google_util::AppendGoogleLocaleParam(
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          GURL(extension_urls::GetWebstoreLaunchURL()),
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          g_browser_process->GetApplicationLocale()).spec());
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("appInstallHintText",
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_INSTALL_HINT_LABEL));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetBoolean("isDiscoveryInNTPEnabled",
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NewTabUI::IsDiscoveryInNTPEnabled());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("collapseSessionMenuItemText",
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_COLLAPSE_SESSION));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("expandSessionMenuItemText",
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_EXPAND_SESSION));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("restoreSessionMenuItemText",
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_OTHER_SESSIONS_OPEN_ALL));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("learn_more",
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_LEARN_MORE));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("tile_grid_screenreader_accessible_description",
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_TILE_GRID_ACCESSIBLE_DESCRIPTION));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("page_switcher_change_title",
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_SWITCHER_CHANGE_TITLE));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("page_switcher_same_title",
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_SWITCHER_SAME_TITLE));
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  load_time_data.SetString("appsPromoTitle",
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_APPS_PROMO_TITLE));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac OS X 10.7+, horizontal scrolling can be treated as a back or
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // forward gesture. Pass through a flag that indicates whether or not that
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // feature is enabled.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetBoolean("isSwipeTrackingFromScrollEventsEnabled",
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            is_swipe_tracking_from_scroll_events_enabled_);
4912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  load_time_data.SetBoolean("showApps", should_show_apps_page_);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  load_time_data.SetBoolean("showWebStoreIcon",
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            !prefs->GetBoolean(prefs::kHideWebStoreIcon));
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool streamlined_hosted_apps =
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extensions::util::IsStreamlinedHostedAppsEnabled();
4981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  load_time_data.SetBoolean("enableStreamlinedHostedApps",
4991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            streamlined_hosted_apps);
5001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Use a different string for launching as a regular tab for streamlined
5011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // hosted apps.
5021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (streamlined_hosted_apps) {
5031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    load_time_data.SetString("applaunchtypetab",
5041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_TAB));
5051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
5061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("expandMenu",
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_NEW_TAB_CLOSE_MENU_EXPAND));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NewTabPageHandler::GetLocalizedValues(profile_, &load_time_data);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NTPLoginHandler::GetLocalizedValues(profile_, &load_time_data);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::SetFontAndTextDirection(&load_time_data);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control fade and resize animations.
518d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  load_time_data.SetBoolean("anim",
519d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            gfx::Animation::ShouldRenderRichAnimation());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  int alignment = tp->GetDisplayProperty(
523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      ThemeProperties::NTP_BACKGROUND_ALIGNMENT);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetString("themegravity",
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (alignment & ThemeProperties::ALIGN_RIGHT) ? "right" : "");
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable the promo if this is the first run, otherwise set the promo string
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for display if there is a valid outstanding promo.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_run::IsChromeFirstRun()) {
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo::HandleClosed(NotificationPromo::NTP_NOTIFICATION_PROMO);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo notification_promo;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo.InitFromPrefs(NotificationPromo::NTP_NOTIFICATION_PROMO);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (notification_promo.CanShow()) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      load_time_data.SetString("notificationPromoText",
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               notification_promo.promo_text());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "Notification promo:" << notification_promo.promo_text();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo bubble_promo;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_promo.InitFromPrefs(NotificationPromo::NTP_BUBBLE_PROMO);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bubble_promo.CanShow()) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      load_time_data.SetString("bubblePromoText",
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bubble_promo.promo_text());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DVLOG(1) << "Bubble promo:" << bubble_promo.promo_text();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determine whether to show the menu for accessing tabs on other devices.
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_other_sessions_menu = should_show_other_devices_menu_ &&
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !CommandLine::ForCurrentProcess()->HasSwitch(
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          switches::kDisableNTPOtherSessionsMenu);
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  load_time_data.SetBoolean("showOtherSessionsMenu", show_other_sessions_menu);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_time_data.SetBoolean("isUserSignedIn",
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !prefs->GetString(prefs::kGoogleServicesUsername).empty());
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load the new tab page appropriate for this build.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece new_tab_html(ResourceBundle::GetSharedInstance().
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetRawDataResource(IDR_NEW_TAB_4_HTML));
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::UseVersion2 version2;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string full_html =
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      webui::GetI18nTemplateHtml(new_tab_html, &load_time_data);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_html_ = base::RefCountedString::TakeString(&full_html);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NTPResourceCache::CreateNewTabIncognitoCSS() {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(tp);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get our theme colors
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_background =
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_BACKGROUND);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate the replacements.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> subst;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cache-buster for background.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->GetPrefs()->GetString(prefs::kCurrentThemeID));  // $1
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Colors.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_background));  // $2
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  subst.push_back(GetNewTabBackgroundCSS(tp, false));  // $3
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  subst.push_back(GetNewTabBackgroundCSS(tp, true));  // $4
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(GetNewTabBackgroundTilingCSS(tp));  // $5
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get our template.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const base::StringPiece new_tab_theme_css(
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDR_NEW_INCOGNITO_TAB_THEME_CSS));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the string from our template and the replacements.
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string full_css = ReplaceStringPlaceholders(
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_tab_theme_css, subst, NULL);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_incognito_css_ = base::RefCountedString::TakeString(&full_css);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NTPResourceCache::CreateNewTabGuestCSS() {
6003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(tp);
6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Get our theme colors
6043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SkColor color_background =
6053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_BACKGROUND);
6063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Generate the replacements.
6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<std::string> subst;
6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Cache-buster for background.
6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  subst.push_back(
6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      profile_->GetPrefs()->GetString(prefs::kCurrentThemeID));  // $1
6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Colors.
6153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_background));  // $2
6163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  subst.push_back(GetNewTabBackgroundCSS(tp, false));  // $3
6173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  subst.push_back(GetNewTabBackgroundCSS(tp, true));  // $4
6183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  subst.push_back(GetNewTabBackgroundTilingCSS(tp));  // $5
6193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Get our template.
6213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const base::StringPiece new_tab_theme_css(
6223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(
6233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          IDR_NEW_GUEST_TAB_THEME_CSS));
6243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Create the string from our template and the replacements.
6263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string full_css = ReplaceStringPlaceholders(
6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new_tab_theme_css, subst, NULL);
6283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  new_tab_guest_css_ = base::RefCountedString::TakeString(&full_css);
6303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NTPResourceCache::CreateNewTabCSS() {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(tp);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get our theme colors
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_background =
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_BACKGROUND);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor color_text = GetThemeColor(tp, ThemeProperties::COLOR_NTP_TEXT);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor color_link = GetThemeColor(tp, ThemeProperties::COLOR_NTP_LINK);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_link_underline =
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_LINK_UNDERLINE);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section =
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_text =
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_TEXT);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_link =
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_LINK);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_link_underline =
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_header_text =
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_HEADER_TEXT);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_header_text_hover =
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_HEADER_TEXT_HOVER);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_header_rule =
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_HEADER_RULE);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_header_rule_light =
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_SECTION_HEADER_RULE_LIGHT);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_text_light =
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_TEXT_LIGHT);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_header =
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetThemeColor(tp, ThemeProperties::COLOR_NTP_HEADER);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate a lighter color for the header gradients.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  color_utils::HSL header_lighter;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  color_utils::SkColorToHSL(color_header, &header_lighter);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header_lighter.l += (1 - header_lighter.l) * 0.33;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_header_gradient_light =
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      color_utils::HSLToSkColor(header_lighter, SkColorGetA(color_header));
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate section border color from the header color. See
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BookmarkBarView::Paint for how we do this for the bookmark bar
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // borders.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor color_section_border =
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorSetARGB(80,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     SkColorGetR(color_header),
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     SkColorGetG(color_header),
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     SkColorGetB(color_header));
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generate the replacements.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> subst;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cache-buster for background.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_->GetPrefs()->GetString(prefs::kCurrentThemeID));  // $1
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Colors.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_background));  // $2
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  subst.push_back(GetNewTabBackgroundCSS(tp, false));  // $3
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  subst.push_back(GetNewTabBackgroundCSS(tp, true));  // $4
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(GetNewTabBackgroundTilingCSS(tp));  // $5
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_header));  // $6
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_header_gradient_light));  // $7
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_text));  // $8
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_link));  // $9
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section));  // $10
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section_border));  // $11
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section_text));  // $12
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section_link));  // $13
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_link_underline));  // $14
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section_link_underline));  // $15
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section_header_text));  // $16
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      color_section_header_text_hover));  // $17
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_section_header_rule));  // $18
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      color_section_header_rule_light));  // $19
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SkColorSetA(color_section_header_rule, 0)));  // $20
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBAString(color_text_light));  // $21
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBComponents(color_section_border));  // $22
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  subst.push_back(SkColorToRGBComponents(color_text));  // $23
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get our template.
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const base::StringPiece new_tab_theme_css(
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ResourceBundle::GetSharedInstance().GetRawDataResource(
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IDR_NEW_TAB_4_THEME_CSS));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the string from our template and the replacements.
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string css_string;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  css_string = ReplaceStringPlaceholders(new_tab_theme_css, subst, NULL);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_css_ = base::RefCountedString::TakeString(&css_string);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725