172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/ntp_resource_cache.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <algorithm>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/command_line.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted_memory.h"
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/time.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/google/google_util.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/metrics/user_metrics.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service_factory.h"
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/shown_sections_handler.h"
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/web_resource/promo_resource_service.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension_constants.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/jstemplate_builder.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/browser_resources.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "ui/base/animation/animation.h"
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/theme_provider.h"
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/color_utils.h"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_MACOSX)
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_constants.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_POSIX)
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/gtk/bookmarks/bookmark_bar_gtk.h"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickusing base::Time;
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The URL for the the Learn More page shown on incognito new tab.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kLearnMoreIncognitoUrl[] =
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(OS_CHROMEOS)
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "https://www.google.com/support/chromeos/bin/answer.py?answer=95464";
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#else
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "https://www.google.com/support/chrome/bin/answer.py?answer=95464";
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// The URL for the Learn More page shown on guest session new tab.
684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochconst char kLearnMoreGuestSessionUrl[] =
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "https://www.google.com/support/chromeos/bin/answer.py?answer=1057090";
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The URL for bookmark sync service help.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kSyncServiceHelpUrl[] =
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "https://www.google.com/support/chrome/bin/answer.py?answer=165139";
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The URL to be loaded to display Help.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kHelpContentUrl[] =
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    "https://www.google.com/support/chrome/";
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstring16 GetUrlWithLang(const GURL& url) {
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ASCIIToUTF16(google_util::AppendGoogleLocaleParam(url).spec());
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string SkColorToRGBAString(SkColor color) {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We convert the alpha using DoubleToString because StringPrintf will use
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // locale specific formatters (e.g., use , instead of . in German).
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return StringPrintf("rgba(%d,%d,%d,%s)", SkColorGetR(color),
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkColorGetG(color), SkColorGetB(color),
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::DoubleToString(SkColorGetA(color) / 255.0).c_str());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Get the CSS string for the background position on the new tab page for the
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// states when the bar is attached or detached.
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string GetNewTabBackgroundCSS(const ui::ThemeProvider* theme_provider,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   bool bar_attached) {
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int alignment;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  theme_provider->GetDisplayProperty(
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ThemeService::NTP_BACKGROUND_ALIGNMENT, &alignment);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(glen): This is a quick workaround to hide the notused.png image when
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // no image is provided - we don't have time right now to figure out why
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this is painting as white.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // http://crbug.com/17593
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!theme_provider->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return "-64px";
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (bar_attached)
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ThemeService::AlignmentToString(alignment);
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The bar is detached, so we must offset the background by the bar size
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if it's a top-aligned bar.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int offset = BookmarkBarView::kNewtabBarHeight;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_MACOSX)
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int offset = bookmarks::kNTPBookmarkBarHeight;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_POSIX)
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int offset = BookmarkBarGtk::kBookmarkBarNTPHeight;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int offset = 0;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (alignment & ThemeService::ALIGN_TOP) {
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (alignment & ThemeService::ALIGN_LEFT)
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return "0% " + base::IntToString(-offset) + "px";
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    else if (alignment & ThemeService::ALIGN_RIGHT)
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return "100% " + base::IntToString(-offset) + "px";
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return "center " + base::IntToString(-offset) + "px";
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return ThemeService::AlignmentToString(alignment);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// How the background image on the new tab page should be tiled (see tiling
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// masks in theme_service.h).
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string GetNewTabBackgroundTilingCSS(
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const ui::ThemeProvider* theme_provider) {
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int repeat_mode;
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  theme_provider->GetDisplayProperty(
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ThemeService::NTP_BACKGROUND_TILING, &repeat_mode);
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return ThemeService::TilingToString(repeat_mode);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Is the current time within a given date range?
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool InDateRange(double begin, double end) {
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Time start_time = Time::FromDoubleT(begin);
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Time end_time = Time::FromDoubleT(end);
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return start_time < Time::Now() && end_time > Time::Now();
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochNTPResourceCache::NTPResourceCache(Profile* profile) : profile_(profile) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  registrar_.Add(this, NotificationType::PROMO_RESOURCE_STATE_CHANGED,
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                 NotificationService::AllSources());
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Watch for pref changes that cause us to need to invalidate the HTML cache.
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pref_change_registrar_.Init(profile_->GetPrefs());
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pref_change_registrar_.Add(prefs::kShowBookmarkBar, this);
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  pref_change_registrar_.Add(prefs::kEnableBookmarkBar, this);
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  pref_change_registrar_.Add(prefs::kNTPShownSections, this);
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickNTPResourceCache::~NTPResourceCache() {}
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenRefCountedBytes* NTPResourceCache::GetNewTabHTML(bool is_incognito) {
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (is_incognito) {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!new_tab_incognito_html_.get())
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CreateNewTabIncognitoHTML();
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!new_tab_html_.get())
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CreateNewTabHTML();
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return is_incognito ? new_tab_incognito_html_.get()
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      : new_tab_html_.get();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenRefCountedBytes* NTPResourceCache::GetNewTabCSS(bool is_incognito) {
180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (is_incognito) {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!new_tab_incognito_css_.get())
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CreateNewTabIncognitoCSS();
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!new_tab_css_.get())
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      CreateNewTabCSS();
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return is_incognito ? new_tab_incognito_css_.get()
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      : new_tab_css_.get();
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid NTPResourceCache::Observe(NotificationType type,
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NotificationSource& source, const NotificationDetails& details) {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invalidate the cache.
195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (NotificationType::BROWSER_THEME_CHANGED == type ||
196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      NotificationType::PROMO_RESOURCE_STATE_CHANGED == type) {
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_tab_incognito_html_ = NULL;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_tab_html_ = NULL;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_tab_incognito_css_ = NULL;
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    new_tab_css_ = NULL;
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (NotificationType::PREF_CHANGED == type) {
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string* pref_name = Details<std::string>(details).ptr();
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (*pref_name == prefs::kShowBookmarkBar ||
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        *pref_name == prefs::kEnableBookmarkBar ||
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        *pref_name == prefs::kHomePageIsNewTabPage ||
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        *pref_name == prefs::kNTPShownSections) {
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_tab_incognito_html_ = NULL;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_tab_html_ = NULL;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid NTPResourceCache::CreateNewTabIncognitoHTML() {
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue localized_strings;
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("title",
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE));
2214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int new_tab_message_ids = IDS_NEW_TAB_OTR_MESSAGE;
2224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  int new_tab_html_idr = IDR_INCOGNITO_TAB_HTML;
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  const char* new_tab_link = kLearnMoreIncognitoUrl;
2244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // TODO(altimofeev): consider implementation without 'if def' usage.
2254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#if defined(OS_CHROMEOS)
2264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession)) {
2274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    new_tab_message_ids = IDS_NEW_TAB_GUEST_SESSION_MESSAGE;
2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    new_tab_html_idr = IDR_GUEST_SESSION_TAB_HTML;
2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    new_tab_link = kLearnMoreGuestSessionUrl;
2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("content",
2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      l10n_util::GetStringFUTF16(new_tab_message_ids,
2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                                 GetUrlWithLang(GURL(new_tab_link))));
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("extensionsmessage",
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringFUTF16(IDS_NEW_TAB_OTR_EXTENSIONS_MESSAGE,
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME),
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                 ASCIIToUTF16(chrome::kChromeUIExtensionsURL)));
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool bookmark_bar_attached = profile_->GetPrefs()->GetBoolean(
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      prefs::kShowBookmarkBar);
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("bookmarkbarattached",
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      bookmark_bar_attached ? "true" : "false");
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeURLDataManager::DataSource::SetFontAndTextDirection(&localized_strings);
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const base::StringPiece incognito_tab_html(
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ResourceBundle::GetSharedInstance().GetRawDataResource(
2484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch          new_tab_html_idr));
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string full_html = jstemplate_builder::GetI18nTemplateHtml(
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      incognito_tab_html, &localized_strings);
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_incognito_html_ = new RefCountedBytes;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_incognito_html_->data.resize(full_html.size());
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::copy(full_html.begin(), full_html.end(),
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            new_tab_incognito_html_->data.begin());
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid NTPResourceCache::CreateNewTabHTML() {
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Show the profile name in the title and most visited labels if the current
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // profile is not the default.
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 apps = l10n_util::GetStringUTF16(IDS_NEW_TAB_APPS);
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 title = l10n_util::GetStringUTF16(IDS_NEW_TAB_TITLE);
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  string16 most_visited = l10n_util::GetStringUTF16(IDS_NEW_TAB_MOST_VISITED);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue localized_strings;
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("bookmarkbarattached",
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar) ?
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "true" : "false");
2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("hasattribution",
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ThemeServiceFactory::GetForProfile(profile_)->HasCustomImage(
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDR_THEME_NTP_ATTRIBUTION) ?
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      "true" : "false");
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("apps", apps);
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("title", title);
2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("mostvisited", most_visited);
2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("restorethumbnails",
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_RESTORE_THUMBNAILS_LINK));
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("recentlyclosed",
2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED));
2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("closedwindowsingle",
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED_WINDOW_SINGLE));
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  localized_strings.SetString("foreignsessions",
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      l10n_util::GetStringUTF16(IDS_SYNC_DATATYPE_SESSIONS));
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("closedwindowmultiple",
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_RECENTLY_CLOSED_WINDOW_MULTIPLE));
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("attributionintro",
2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_ATTRIBUTION_INTRO));
2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("thumbnailremovednotification",
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_THUMBNAIL_REMOVED_NOTIFICATION));
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("undothumbnailremove",
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE));
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("removethumbnailtooltip",
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_REMOVE_THUMBNAIL_TOOLTIP));
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("pinthumbnailtooltip",
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_PIN_THUMBNAIL_TOOLTIP));
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("unpinthumbnailtooltip",
2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_UNPIN_THUMBNAIL_TOOLTIP));
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("showhidethumbnailtooltip",
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_SHOW_HIDE_THUMBNAIL_TOOLTIP));
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("showhidelisttooltip",
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_SHOW_HIDE_LIST_TOOLTIP));
3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("pagedisplaytooltip",
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_PAGE_DISPLAY_TOOLTIP));
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("closefirstrunnotification",
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_CLOSE_FIRST_RUN_NOTIFICATION));
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("close", l10n_util::GetStringUTF16(IDS_CLOSE));
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("history",
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_HISTORY));
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("downloads",
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_DOWNLOADS));
3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("help",
3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_HELP));
3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("helpurl",
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetUrlWithLang(GURL(kHelpContentUrl)));
3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("appsettings",
3163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_SETTINGS));
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("appuninstall",
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_UNINSTALL));
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("appoptions",
3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_OPTIONS));
321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString("appcreateshortcut",
322201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF16(IDS_NEW_TAB_APP_CREATE_SHORTCUT));
3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("applaunchtypepinned",
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_PINNED));
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("applaunchtyperegular",
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_REGULAR));
327201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString("applaunchtypewindow",
328201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_WINDOW));
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("applaunchtypefullscreen",
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_APP_CONTEXT_MENU_OPEN_FULLSCREEN));
3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("web_store_title",
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE));
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("web_store_url",
334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      GetUrlWithLang(GURL(Extension::ChromeStoreLaunchURL())));
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings.SetString("syncpromotext",
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL));
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_CHROMEOS)
338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString("expandMenu",
339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF16(IDS_NEW_TAB_CLOSE_MENU_EXPAND));
340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Don't initiate the sync related message passing with the page if the sync
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // code is not present.
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (profile_->GetProfileSyncService())
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    localized_strings.SetString("syncispresent", "true");
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  else
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    localized_strings.SetString("syncispresent", "false");
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ChromeURLDataManager::DataSource::SetFontAndTextDirection(&localized_strings);
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Control fade and resize animations.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string anim =
3533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      ui::Animation::ShouldRenderRichAnimation() ? "true" : "false";
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetString("anim", anim);
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Pass the shown_sections pref early so that we can prevent flicker.
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int shown_sections = ShownSectionsHandler::GetShownSections(
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      profile_->GetPrefs());
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  localized_strings.SetInteger("shown_sections", shown_sections);
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // If the user has preferences for a start and end time for a custom logo,
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // and the time now is between these two times, show the custom logo.
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (profile_->GetPrefs()->FindPreference(prefs::kNTPCustomLogoStart) &&
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      profile_->GetPrefs()->FindPreference(prefs::kNTPCustomLogoEnd)) {
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    localized_strings.SetString("customlogo",
36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        InDateRange(profile_->GetPrefs()->GetDouble(prefs::kNTPCustomLogoStart),
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    profile_->GetPrefs()->GetDouble(prefs::kNTPCustomLogoEnd)) ?
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "true" : "false");
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    localized_strings.SetString("customlogo", "false");
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If the user has preferences for a start and end time for a promo from
374201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the server, and this promo string exists, set the localized string.
375201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (profile_->GetPrefs()->FindPreference(prefs::kNTPPromoStart) &&
376201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      profile_->GetPrefs()->FindPreference(prefs::kNTPPromoEnd) &&
377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      profile_->GetPrefs()->FindPreference(prefs::kNTPPromoLine) &&
378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      PromoResourceServiceUtil::CanShowPromo(profile_)) {
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    localized_strings.SetString("serverpromo",
38072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        InDateRange(profile_->GetPrefs()->GetDouble(prefs::kNTPPromoStart),
38172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    profile_->GetPrefs()->GetDouble(prefs::kNTPPromoEnd)) ?
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                    profile_->GetPrefs()->GetString(prefs::kNTPPromoLine) :
383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                                    std::string());
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    UserMetrics::RecordAction(UserMetricsAction("NTPPromoShown"));
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Load the new tab page appropriate for this build
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Note that some builds (eg. TOUCHUI) don't make use of everything we
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // do here (all of the template data, etc.), but we keep the back end
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // consistent across builds, supporting the union of all NTP front-ends
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // for simplicity.
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string full_html;
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewTabPage4)) {
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    base::StringPiece new_tab_html(ResourceBundle::GetSharedInstance().
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        GetRawDataResource(IDR_NEW_TAB_4_HTML));
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    full_html = jstemplate_builder::GetI18nTemplateHtml(new_tab_html,
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                        &localized_strings);
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    base::StringPiece new_tab_html(ResourceBundle::GetSharedInstance().
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        GetRawDataResource(IDR_NEW_TAB_HTML));
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Inject the template data into the HTML so that it is available before any
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // layout is needed.
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::string json_html;
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    jstemplate_builder::AppendJsonHtml(&localized_strings, &json_html);
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static const base::StringPiece template_data_placeholder(
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "<!-- template data placeholder -->");
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    size_t pos = new_tab_html.find(template_data_placeholder);
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (pos != base::StringPiece::npos) {
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      full_html.assign(new_tab_html.data(), pos);
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      full_html.append(json_html);
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      size_t after_offset = pos + template_data_placeholder.size();
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      full_html.append(new_tab_html.data() + after_offset,
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       new_tab_html.size() - after_offset);
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else {
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      full_html.assign(new_tab_html.data(), new_tab_html.size());
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_html_ = new RefCountedBytes;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_html_->data.resize(full_html.size());
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::copy(full_html.begin(), full_html.end(), new_tab_html_->data.begin());
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid NTPResourceCache::CreateNewTabIncognitoCSS() {
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(tp);
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get our theme colors
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_background =
434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_BACKGROUND);
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate the replacements.
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> subst;
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cache-buster for background.
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_->GetPrefs()->GetString(prefs::kCurrentThemeID));  // $1
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Colors.
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(SkColorToRGBAString(color_background));  // $2
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(GetNewTabBackgroundCSS(tp, false));  // $3
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(GetNewTabBackgroundCSS(tp, true));  // $4
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(GetNewTabBackgroundTilingCSS(tp));  // $5
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get our template.
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const base::StringPiece new_tab_theme_css(
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ResourceBundle::GetSharedInstance().GetRawDataResource(
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IDR_NEW_INCOGNITO_TAB_THEME_CSS));
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create the string from our template and the replacements.
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string full_css = ReplaceStringPlaceholders(
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_tab_theme_css, subst, NULL);
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_incognito_css_ = new RefCountedBytes;
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_incognito_css_->data.resize(full_css.size());
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::copy(full_css.begin(), full_css.end(),
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            new_tab_incognito_css_->data.begin());
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid NTPResourceCache::CreateNewTabCSS() {
465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(tp);
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get our theme colors
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_background =
470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_BACKGROUND);
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SkColor color_text = tp->GetColor(ThemeService::COLOR_NTP_TEXT);
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SkColor color_link = tp->GetColor(ThemeService::COLOR_NTP_LINK);
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_link_underline =
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_LINK_UNDERLINE);
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_section =
477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION);
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_section_text =
479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_TEXT);
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_section_link =
481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_LINK);
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_section_link_underline =
483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_LINK_UNDERLINE);
4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkColor color_section_header_text =
485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_HEADER_TEXT);
4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkColor color_section_header_text_hover =
487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_HEADER_TEXT_HOVER);
4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkColor color_section_header_rule =
489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_HEADER_RULE);
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkColor color_section_header_rule_light =
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_SECTION_HEADER_RULE_LIGHT);
492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  SkColor color_text_light =
493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_TEXT_LIGHT);
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_header =
496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tp->GetColor(ThemeService::COLOR_NTP_HEADER);
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate a lighter color for the header gradients.
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  color_utils::HSL header_lighter;
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  color_utils::SkColorToHSL(color_header, &header_lighter);
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  header_lighter.l += (1 - header_lighter.l) * 0.33;
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_header_gradient_light =
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      color_utils::HSLToSkColor(header_lighter, SkColorGetA(color_header));
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate section border color from the header color. See
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkBarView::Paint for how we do this for the bookmark bar
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // borders.
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkColor color_section_border =
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      SkColorSetARGB(80,
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     SkColorGetR(color_header),
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     SkColorGetG(color_header),
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     SkColorGetB(color_header));
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate the replacements.
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> subst;
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A second list of replacements, each of which must be in $$x format,
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // where x is a digit from 1-9.
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> subst2;
5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<std::string> subst3;
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cache-buster for background.
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_->GetPrefs()->GetString(prefs::kCurrentThemeID));  // $1
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Colors.
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(SkColorToRGBAString(color_background));  // $2
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(GetNewTabBackgroundCSS(tp, false));  // $3
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(GetNewTabBackgroundCSS(tp, true));  // $4
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(GetNewTabBackgroundTilingCSS(tp));  // $5
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(SkColorToRGBAString(color_header));  // $6
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(SkColorToRGBAString(color_header_gradient_light));  // $7
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(SkColorToRGBAString(color_text));  // $8
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst.push_back(SkColorToRGBAString(color_link));  // $9
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst2.push_back(SkColorToRGBAString(color_section));  // $$1
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst2.push_back(SkColorToRGBAString(color_section_border));  // $$2
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst2.push_back(SkColorToRGBAString(color_section_text));  // $$3
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subst2.push_back(SkColorToRGBAString(color_section_link));  // $$4
5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst2.push_back(SkColorToRGBAString(color_link_underline));  // $$5
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst2.push_back(SkColorToRGBAString(color_section_link_underline));  // $$6
5403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst2.push_back(SkColorToRGBAString(color_section_header_text)); // $$7
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst2.push_back(SkColorToRGBAString(
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      color_section_header_text_hover)); // $$8
5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst2.push_back(SkColorToRGBAString(color_section_header_rule));  // $$9
5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst3.push_back(SkColorToRGBAString(
5463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      color_section_header_rule_light));  // $$$1
5473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  subst3.push_back(SkColorToRGBAString(
5483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      SkColorSetA(color_section_header_rule, 0)));  // $$$2
549731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  subst3.push_back(SkColorToRGBAString(color_text_light));  // $$$3
5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get our template.
552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int ntp_css_resource_id =
553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      CommandLine::ForCurrentProcess()->HasSwitch(switches::kNewTabPage4) ?
554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDR_NEW_TAB_4_THEME_CSS : IDR_NEW_TAB_THEME_CSS;
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const base::StringPiece new_tab_theme_css(
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ResourceBundle::GetSharedInstance().GetRawDataResource(
557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          ntp_css_resource_id));
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create the string from our template and the replacements.
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string css_string;
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  css_string = ReplaceStringPlaceholders(new_tab_theme_css, subst, NULL);
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  css_string = ReplaceStringPlaceholders(css_string, subst2, NULL);
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  css_string = ReplaceStringPlaceholders(css_string, subst3, NULL);
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  new_tab_css_ = new RefCountedBytes;
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  new_tab_css_->data.resize(css_string.size());
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::copy(css_string.begin(), css_string.end(),
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            new_tab_css_->data.begin());
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
570