// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_WEB_RESOURCE_PROMO_RESOURCE_SERVICE_H_ #define CHROME_BROWSER_WEB_RESOURCE_PROMO_RESOURCE_SERVICE_H_ #pragma once #include "chrome/browser/web_resource/web_resource_service.h" namespace PromoResourceServiceUtil { // Certain promotions should only be shown to certain classes of users. This // function will change to reflect each kind of promotion. bool CanShowPromo(Profile* profile); } // namespace PromoResourceServiceUtil class PrefService; // A PromoResourceService fetches data from a web resource server to be used to // dynamically change the appearance of the New Tab Page. For example, it has // been used to fetch "tips" to be displayed on the NTP, or to display // promotional messages to certain groups of Chrome users. // // TODO(mirandac): Arrange for a server to be set up specifically for promo // messages, which have until now been piggybacked onto the old tips server // structure. (see http://crbug.com/70634 for details.) class PromoResourceService : public WebResourceService { public: static bool IsBuildTargeted(const std::string& channel, int builds_targeted); static void RegisterPrefs(PrefService* local_state); static void RegisterUserPrefs(PrefService* prefs); explicit PromoResourceService(Profile* profile); // Default server of dynamically loaded NTP HTML elements. static const char* kDefaultPromoResourceServer; private: FRIEND_TEST_ALL_PREFIXES(PromoResourceServiceTest, UnpackLogoSignal); FRIEND_TEST_ALL_PREFIXES(PromoResourceServiceTest, UnpackPromoSignal); FRIEND_TEST_ALL_PREFIXES(PromoResourceServiceTest, UnpackWebStoreSignal); // Identifies types of Chrome builds for promo targeting. enum BuildType { NO_BUILD = 0, DEV_BUILD = 1, BETA_BUILD = 1 << 1, STABLE_BUILD = 1 << 2, CANARY_BUILD = 1 << 3, }; virtual ~PromoResourceService(); int GetPromoServiceVersion(); // Gets the locale of the last promos fetched from the server. This is saved // so we can fetch new data if the locale changes. std::string GetPromoLocale(); void Init(); // Returns true if |builds_targeted| includes the release channel Chrome // belongs to. For testing purposes, you can override the current channel // with set_channel. bool IsThisBuildTargeted(int builds_targeted); // Schedule a notification that a web resource is either going to become // available or be no longer valid. void ScheduleNotification(double ms_start_time, double ms_end_time); // Schedules the initial notification for when the web resource is going // to become available or no longer valid. This performs a few additional // checks than ScheduleNotification, namely it schedules updates immediately // if the promo service or Chrome locale has changed. void ScheduleNotificationOnInit(); // Overrides the current Chrome release channel for testing purposes. void set_channel(const char* channel) { channel_ = channel; } virtual void Unpack(const DictionaryValue& parsed_json); // Unpack the web resource as a custom promo signal. Expects a start and end // signal, with the promo to be shown in the tooltip of the start signal // field. Delivery will be in json in the form of: // { // "topic": { // "answers": [ // { // "answer_id": "1067976", // "name": "promo_start", // "question": "1:24", // "tooltip": // "Click \u003ca href=http://www.google.com\u003ehere\u003c/a\u003e!", // "inproduct": "10/8/09 12:00", // "inproduct_target": null // }, // { // "answer_id": "1067976", // "name": "promo_end", // "question": "", // "tooltip": "", // "inproduct": "10/8/11 12:00", // "inproduct_target": null // }, // ... // ] // } // } // // Because the promo signal data is piggybacked onto the tip server, the // values don't exactly correspond with the field names: // // For "promo_start" or "promo_end", the date to start or stop showing the // promotional line is given by the "inproduct" line. // For "promo_start", the promotional line itself is given in the "tooltip" // field. The "question" field gives the type of builds that should be shown // this promo (see the BuildType enum in web_resource_service.cc) and the // number of hours that each promo group should see it, separated by ":". // For example, "7:24" would indicate that all builds should see the promo, // and each group should see it for 24 hours. // void UnpackPromoSignal(const DictionaryValue& parsed_json); // Unpack the promo resource as a custom logo signal. Expects a start and end // signal. Delivery will be in json in the form of: // { // "topic": { // "answers": [ // { // "answer_id": "107366", // "name": "custom_logo_start", // "question": "", // "tooltip": "", // "inproduct": "10/8/09 12:00", // "inproduct_target": null // }, // { // "answer_id": "107366", // "name": "custom_logo_end", // "question": "", // "tooltip": "", // "inproduct": "10/8/09 12:00", // "inproduct_target": null // }, // ... // ] // } // } // void UnpackLogoSignal(const DictionaryValue& parsed_json); // Unpack the web store promo. Expects JSON delivery in the following format: // { // "topic": { // "answers": [ // { // "answer_id": "1143011", // "name": "webstore_promo:15", // "question": "Browse thousands of apps and games for Chrome.", // "inproduct_target": "Visit the Chrome Web Store", // "inproduct": "https://chrome.google.com/webstore?hl=en", // "tooltip": "No thanks, hide this" // }, // ... // ] // } // } // The properties are defined as follows: // inproduct: the release channels targeted (bitwise or of BuildTypes) // question: the promo header text // inproduct_target: the promo button text // inproduct: the promo button link // tooltip: the text for the "hide this" link on the promo // name: starts with "webstore_promo" to identify the signal. the second // part contains the release channels targeted (bitwise or of // BuildTypes) // answer_id: the promo's id void UnpackWebStoreSignal(const DictionaryValue& parsed_json); // Gets mutable dictionary attached to user's preferences, so that we // can write resource data back to user's pref file. DictionaryValue* web_resource_cache_; // Overrides the current Chrome release channel for testing purposes. const char* channel_; DISALLOW_COPY_AND_ASSIGN(PromoResourceService); }; #endif // CHROME_BROWSER_WEB_RESOURCE_PROMO_RESOURCE_SERVICE_H_