1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/search/contextual_search_promo_source_android.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/json/json_string_value_serializer.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted_memory.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/string_util.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/stringprintf.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/values.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/url_constants.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/variations/variations_associated_data.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "grit/browser_resources.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/l10n/l10n_util.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/resource/resource_bundle.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/webui/jstemplate_builder.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "url/gurl.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kPromoConfigPath[] = "/config.js";
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kPromoHTMLPath[] = "/promo.html";
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kPromoCSSPath[] = "/promo.css";
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kPromoJSPath[] = "/promo.js";
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kRobotoWoffPath[] = "/roboto.woff";
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kRobotoWoff2Path[] = "/roboto.woff2";
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Field trial related constants.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kContextualSearchFieldTrialName[] = "ContextualSearch";
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kContextualSearchHidePromoHeaderParam[] = "hide_promo_header";
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kContextualSearchEnabledValue[] = "enabled";
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns whether we should hide the first-run promo header.
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ShouldHidePromoHeader() {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return variations::GetVariationParamValue(
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kContextualSearchFieldTrialName, kContextualSearchHidePromoHeaderParam) ==
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kContextualSearchEnabledValue;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns a JS dictionary of configuration data for the Contextual Search
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// promo.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string GetConfigData() {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue config_data;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  config_data.SetBoolean("hideHeader", ShouldHidePromoHeader());
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Serialize the dictionary.
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string js_text;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  JSONStringValueSerializer serializer(&js_text);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  serializer.Serialize(config_data);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string config_data_js;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  config_data_js.append("var config = ");
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  config_data_js.append(js_text);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  config_data_js.append(";");
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return config_data_js;
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ContextualSearchPromoSourceAndroid::ContextualSearchPromoSourceAndroid() {}
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ContextualSearchPromoSourceAndroid::~ContextualSearchPromoSourceAndroid() {}
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ContextualSearchPromoSourceAndroid::StartDataRequest(
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& path_and_query, int render_process_id,
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int render_frame_id,
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::URLDataSource::GotDataCallback& callback) {
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GURL url(std::string(chrome::kChromeUIContextualSearchPromoURL) + "/" +
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           path_and_query);
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string path(url.path());
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (path == kPromoHTMLPath) {
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SendHtmlWithStrings(callback);
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (path == kPromoCSSPath) {
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SendResource(IDR_CONTEXTUAL_SEARCH_PROMO_CSS, callback);
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (path == kPromoJSPath) {
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SendResource(IDR_CONTEXTUAL_SEARCH_PROMO_JS, callback);
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (path == kPromoConfigPath) {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SendConfigResource(callback);
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else if (path == kRobotoWoffPath) {
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SendResource(IDR_ROBOTO_WOFF, callback);
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else if (path == kRobotoWoff2Path) {
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SendResource(IDR_ROBOTO_WOFF2, callback);
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(NULL);
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string ContextualSearchPromoSourceAndroid::GetSource() const {
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return chrome::kChromeUIContextualSearchPromoHost;
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::string ContextualSearchPromoSourceAndroid::GetMimeType(
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& path_and_query) const {
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string path(GURL("chrome://host/" + path_and_query).path());
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (EndsWith(path, ".js", false)) return "application/javascript";
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (EndsWith(path, ".png", false)) return "image/png";
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (EndsWith(path, ".css", false)) return "text/css";
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (EndsWith(path, ".html", false)) return "text/html";
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (EndsWith(path, ".woff", false)) return "font/woff";
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (EndsWith(path, ".woff2", false)) return "font/woff2";
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return "";
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ContextualSearchPromoSourceAndroid::ShouldDenyXFrameOptions() const {
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ContextualSearchPromoSourceAndroid::ShouldAddContentSecurityPolicy() const {
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return false;
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ContextualSearchPromoSourceAndroid::SendResource(
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int resource_id, const content::URLDataSource::GotDataCallback& callback) {
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<base::RefCountedStaticMemory> response(
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ResourceBundle::GetSharedInstance().LoadDataResourceBytes(resource_id));
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  callback.Run(response.get());
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ContextualSearchPromoSourceAndroid::SendConfigResource(
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const content::URLDataSource::GotDataCallback& callback) {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string response = GetConfigData();
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback.Run(base::RefCountedString::TakeString(&response));
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ContextualSearchPromoSourceAndroid::SendHtmlWithStrings(
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::URLDataSource::GotDataCallback& callback) {
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::DictionaryValue strings_data;
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The three following statements are part of the description paragraph.
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  strings_data.SetString(
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "description-1",
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      l10n_util::GetStringUTF16(IDS_CONTEXTUAL_SEARCH_PROMO_DESCRIPTION_1));
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  strings_data.SetString(
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "feature-name",
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      l10n_util::GetStringUTF16(IDS_CONTEXTUAL_SEARCH_PROMO_FEATURE_NAME));
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  strings_data.SetString(
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "description-2",
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      l10n_util::GetStringUTF16(IDS_CONTEXTUAL_SEARCH_PROMO_DESCRIPTION_2));
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  strings_data.SetString(
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "heading", l10n_util::GetStringUTF16(IDS_CONTEXTUAL_SEARCH_HEADER));
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  strings_data.SetString(
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "optIn", l10n_util::GetStringUTF16(IDS_CONTEXTUAL_SEARCH_PROMO_OPTIN));
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  strings_data.SetString(
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "optOut", l10n_util::GetStringUTF16(IDS_CONTEXTUAL_SEARCH_PROMO_OPTOUT));
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::StringPiece html(
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ResourceBundle::GetSharedInstance().GetRawDataResource(
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         IDR_CONTEXTUAL_SEARCH_PROMO_HTML));
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  webui::UseVersion2 version;
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string response(webui::GetI18nTemplateHtml(html, &strings_data));
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  callback.Run(base::RefCountedString::TakeString(&response));
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
157