| Index: chrome/browser/web_resource/notification_promo.cc
|
| ===================================================================
|
| --- chrome/browser/web_resource/notification_promo.cc (revision 111558)
|
| +++ chrome/browser/web_resource/notification_promo.cc (working copy)
|
| @@ -4,13 +4,19 @@
|
|
|
| #include "chrome/browser/web_resource/notification_promo.h"
|
|
|
| +#include "base/bind.h"
|
| #include "base/rand_util.h"
|
| #include "base/string_number_conversions.h"
|
| +#include "base/string_split.h"
|
| #include "base/time.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| +#include "chrome/browser/profiles/profile_impl.h"
|
| #include "chrome/browser/web_resource/promo_resource_service.h"
|
| #include "chrome/common/pref_names.h"
|
| +#include "googleurl/src/gurl.h"
|
| +#include "net/base/cookie_store.h"
|
| +#include "net/url_request/url_request_context.h"
|
|
|
| namespace {
|
|
|
| @@ -33,6 +39,10 @@
|
| static const char kTimeProperty[] = "inproduct";
|
| static const char kParamsProperty[] = "question";
|
|
|
| +static const char kGPlusDomainUrl[] = "http://plus.google.com/";
|
| +static const char kGPlusDomainSecureCookieId[] = "SID=";
|
| +static const char kSplitStringToken = ';';
|
| +
|
| // Time getters.
|
| double GetTimeFromDict(const DictionaryValue* dict) {
|
| std::string time_str;
|
| @@ -52,9 +62,10 @@
|
|
|
| } // namespace
|
|
|
| -NotificationPromo::NotificationPromo(PrefService* prefs, Delegate* delegate)
|
| - : prefs_(prefs),
|
| +NotificationPromo::NotificationPromo(Profile* profile, Delegate* delegate)
|
| + : profile_(profile),
|
| delegate_(delegate),
|
| + prefs_(profile_->GetPrefs()),
|
| start_(0.0),
|
| end_(0.0),
|
| build_(PromoResourceService::NO_BUILD),
|
| @@ -65,11 +76,17 @@
|
| group_(0),
|
| views_(0),
|
| text_(),
|
| - closed_(false) {
|
| - DCHECK(prefs);
|
| + closed_(false),
|
| + gplus_(false),
|
| + feature_mask_(0) {
|
| + DCHECK(profile);
|
| + DCHECK(prefs_);
|
| }
|
|
|
| -void NotificationPromo::InitFromJson(const DictionaryValue& json) {
|
| +NotificationPromo::~NotificationPromo() {}
|
| +
|
| +void NotificationPromo::InitFromJson(const DictionaryValue& json,
|
| + bool do_cookie_check) {
|
| DictionaryValue* dict;
|
| if (json.GetDictionary(kHeaderProperty, &dict)) {
|
| ListValue* answers;
|
| @@ -82,10 +99,45 @@
|
| }
|
| }
|
| }
|
| + if (do_cookie_check) {
|
| + content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&NotificationPromo::GetCookies, this,
|
| + profile_->GetRequestContext()));
|
| + } else {
|
| + CheckForNewNotification(false);
|
| + }
|
| +}
|
|
|
| - CheckForNewNotification();
|
| +// static
|
| +bool NotificationPromo::CheckForGPlusCookie(const std::string& cookies) {
|
| + std::vector<std::string> cookie_list;
|
| + base::SplitString(cookies, kSplitStringToken, &cookie_list);
|
| + for (std::vector<std::string>::const_iterator current = cookie_list.begin();
|
| + current != cookie_list.end();
|
| + ++current) {
|
| + if ((*current).find(kGPlusDomainSecureCookieId) == 0) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| }
|
|
|
| +void NotificationPromo::GetCookiesCallback(const std::string& cookies) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| + bool found_cookie = NotificationPromo::CheckForGPlusCookie(cookies);
|
| + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&NotificationPromo::CheckForNewNotification, this,
|
| + found_cookie));
|
| +}
|
| +
|
| +void NotificationPromo::GetCookies(net::URLRequestContextGetter* getter) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
| + getter->GetURLRequestContext()->cookie_store()->
|
| + GetCookiesWithOptionsAsync(
|
| + GURL(kGPlusDomainUrl), net::CookieOptions(),
|
| + base::Bind(&NotificationPromo::GetCookiesCallback, this));
|
| +}
|
| +
|
| void NotificationPromo::Parse(const DictionaryValue* dict) {
|
| std::string key;
|
| if (dict->GetString(kIdentifierProperty, &key)) {
|
| @@ -112,6 +164,7 @@
|
| max_group_ = GetNextQuestionValue(question, &index, &err);
|
| max_views_ = GetNextQuestionValue(question, &index, &err);
|
| platform_ = GetNextQuestionValue(question, &index, &err);
|
| + feature_mask_ = GetNextQuestionValue(question, &index, &err);
|
|
|
| if (err ||
|
| OutOfBounds(build_, PromoResourceService::NO_BUILD,
|
| @@ -126,32 +179,48 @@
|
| ", time_slice=" << time_slice_ <<
|
| ", max_group=" << max_group_ <<
|
| ", max_views=" << max_views_ <<
|
| - ", platform_=" << platform_;
|
| + ", platform_=" << platform_ <<
|
| + ", feature_mask=" << feature_mask_;
|
| build_ = PromoResourceService::NO_BUILD;
|
| time_slice_ = 0;
|
| max_group_ = 0;
|
| max_views_ = 0;
|
| platform_ = PLATFORM_NONE;
|
| + feature_mask_ = 0;
|
| }
|
| }
|
|
|
| -void NotificationPromo::CheckForNewNotification() {
|
| +void NotificationPromo::CheckForNewNotification(bool found_cookie) {
|
| + double start = 0.0;
|
| + double end = 0.0;
|
| + bool new_notification = false;
|
| +
|
| + gplus_ = found_cookie;
|
| const double old_start = GetTimeFromPrefs(prefs_, prefs::kNTPPromoStart);
|
| const double old_end = GetTimeFromPrefs(prefs_, prefs::kNTPPromoEnd);
|
| - const bool has_platform = prefs_->HasPrefPath(prefs::kNTPPromoPlatform);
|
| -
|
| + const bool old_gplus = prefs_->GetBoolean(prefs::kNTPPromoIsLoggedInToPlus);
|
| + const bool has_feature_mask =
|
| + prefs_->HasPrefPath(prefs::kNTPPromoFeatureMask);
|
| // Trigger a new notification if the times have changed, or if
|
| - // we previously never wrote out a platform preference. This handles
|
| - // the case where we update to a new client in the middle of a promo.
|
| - if (old_start != start_ || old_end != end_ || !has_platform)
|
| + // we previously never wrote out a feature_mask or platform preference, or
|
| + // if the user's gplus cookies have changed.
|
| + if (old_start != start_ || old_end != end_ || old_gplus != gplus_ ||
|
| + !has_feature_mask) {
|
| OnNewNotification();
|
| + start = StartTimeWithOffset();
|
| + end = end_;
|
| + new_notification = true;
|
| + }
|
| + if (delegate_) {
|
| + // If no change needed, call delegate with default values (this
|
| + // is for testing purposes).
|
| + delegate_->OnNotificationParsed(start, end, new_notification);
|
| + }
|
| }
|
|
|
| void NotificationPromo::OnNewNotification() {
|
| group_ = NewGroup();
|
| WritePrefs();
|
| - if (delegate_)
|
| - delegate_->OnNewNotification(StartTimeWithOffset(), end_);
|
| }
|
|
|
| // static
|
| @@ -196,8 +265,19 @@
|
| prefs->RegisterBooleanPref(prefs::kNTPPromoClosed,
|
| false,
|
| PrefService::UNSYNCABLE_PREF);
|
| + prefs->RegisterBooleanPref(prefs::kNTPPromoIsLoggedInToPlus,
|
| + false,
|
| + PrefService::UNSYNCABLE_PREF);
|
| + prefs->RegisterIntegerPref(prefs::kNTPPromoFeatureMask,
|
| + 0,
|
| + PrefService::UNSYNCABLE_PREF);
|
| }
|
|
|
| +// static
|
| +NotificationPromo* NotificationPromo::Create(Profile *profile,
|
| + NotificationPromo::Delegate * delegate) {
|
| + return new NotificationPromo(profile, delegate);
|
| +}
|
|
|
| void NotificationPromo::WritePrefs() {
|
| prefs_->SetDouble(prefs::kNTPPromoStart, start_);
|
| @@ -213,6 +293,8 @@
|
| prefs_->SetInteger(prefs::kNTPPromoGroup, group_);
|
| prefs_->SetInteger(prefs::kNTPPromoViews, views_);
|
| prefs_->SetBoolean(prefs::kNTPPromoClosed, closed_);
|
| + prefs_->SetBoolean(prefs::kNTPPromoIsLoggedInToPlus, gplus_);
|
| + prefs_->SetInteger(prefs::kNTPPromoFeatureMask, feature_mask_);
|
| }
|
|
|
| void NotificationPromo::InitFromPrefs() {
|
| @@ -227,6 +309,12 @@
|
| group_ = prefs_->GetInteger(prefs::kNTPPromoGroup);
|
| views_ = prefs_->GetInteger(prefs::kNTPPromoViews);
|
| closed_ = prefs_->GetBoolean(prefs::kNTPPromoClosed);
|
| +
|
| + if (prefs_->HasPrefPath(prefs::kNTPPromoIsLoggedInToPlus))
|
| + gplus_ = prefs_->GetBoolean(prefs::kNTPPromoIsLoggedInToPlus);
|
| +
|
| + if (prefs_->HasPrefPath(prefs::kNTPPromoFeatureMask))
|
| + feature_mask_ = prefs_->GetInteger(prefs::kNTPPromoFeatureMask);
|
| }
|
|
|
| bool NotificationPromo::CanShow() const {
|
| @@ -237,7 +325,8 @@
|
| IsPlatformAllowed(platform_) &&
|
| IsBuildAllowed(build_) &&
|
| base::Time::FromDoubleT(StartTimeWithOffset()) < base::Time::Now() &&
|
| - base::Time::FromDoubleT(end_) > base::Time::Now();
|
| + base::Time::FromDoubleT(end_) > base::Time::Now() &&
|
| + (!(feature_mask_ & NotificationPromo::FEATURE_GPLUS) || gplus_);
|
| }
|
|
|
| void NotificationPromo::HandleClosed() {
|
| @@ -282,7 +371,7 @@
|
| #elif defined(OS_LINUX)
|
| return PLATFORM_LINUX;
|
| #else
|
| - return PLATFORM_NONE;
|
| + return PLATFORM_NONE;
|
| #endif
|
| }
|
|
|
| @@ -322,5 +411,7 @@
|
| group_ == other.group_ &&
|
| views_ == other.views_ &&
|
| text_ == other.text_ &&
|
| - closed_ == other.closed_;
|
| + closed_ == other.closed_ &&
|
| + gplus_ == other.gplus_ &&
|
| + feature_mask_ == other.feature_mask_;
|
| }
|
|
|