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