Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2409)

Side by Side Diff: components/signin/core/browser/gaia_cookie_manager_service.cc

Issue 1044933002: GaiaCookieServiceManager handles general request types (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase (and fixes) Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/signin/core/browser/gaia_cookie_manager_service.h" 5 #include "components/signin/core/browser/gaia_cookie_manager_service.h"
6 6
7 #include <queue>
7 #include <vector> 8 #include <vector>
8 9
9 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
10 #include "base/stl_util.h" 11 #include "base/stl_util.h"
11 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
12 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
13 #include "base/time/time.h" 14 #include "base/time/time.h"
14 #include "base/values.h" 15 #include "base/values.h"
15 #include "components/signin/core/browser/signin_metrics.h" 16 #include "components/signin/core/browser/signin_metrics.h"
16 #include "google_apis/gaia/gaia_auth_fetcher.h" 17 #include "google_apis/gaia/gaia_auth_fetcher.h"
17 #include "google_apis/gaia/gaia_constants.h" 18 #include "google_apis/gaia/gaia_constants.h"
18 #include "google_apis/gaia/gaia_urls.h" 19 #include "google_apis/gaia/gaia_urls.h"
19 #include "google_apis/gaia/oauth2_token_service.h" 20 #include "google_apis/gaia/oauth2_token_service.h"
20 #include "net/base/load_flags.h" 21 #include "net/base/load_flags.h"
21 #include "net/http/http_status_code.h" 22 #include "net/http/http_status_code.h"
22 #include "net/url_request/url_fetcher.h" 23 #include "net/url_request/url_fetcher.h"
23 #include "net/url_request/url_fetcher_delegate.h" 24 #include "net/url_request/url_fetcher_delegate.h"
24 25
25
26 namespace { 26 namespace {
27 27
28 // In case of an error while fetching using the GaiaAuthFetcher, retry with 28 // In case of an error while fetching using the GaiaAuthFetcher, retry with
29 // exponential backoff. Try up to 7 times within 15 minutes. 29 // exponential backoff. Try up to 7 times within 15 minutes.
30 const net::BackoffEntry::Policy kBackoffPolicy = { 30 const net::BackoffEntry::Policy kBackoffPolicy = {
31 // Number of initial errors (in sequence) to ignore before applying 31 // Number of initial errors (in sequence) to ignore before applying
32 // exponential back-off rules. 32 // exponential back-off rules.
33 0, 33 0,
34 34
35 // Initial delay for exponential backoff in ms. 35 // Initial delay for exponential backoff in ms.
(...skipping 18 matching lines...) Expand all
54 }; 54 };
55 55
56 const int kMaxGaiaAuthFetcherRetries = 8; 56 const int kMaxGaiaAuthFetcherRetries = 8;
57 57
58 bool IsTransientError(const GoogleServiceAuthError& error) { 58 bool IsTransientError(const GoogleServiceAuthError& error) {
59 return error.state() == GoogleServiceAuthError::CONNECTION_FAILED || 59 return error.state() == GoogleServiceAuthError::CONNECTION_FAILED ||
60 error.state() == GoogleServiceAuthError::SERVICE_UNAVAILABLE || 60 error.state() == GoogleServiceAuthError::SERVICE_UNAVAILABLE ||
61 error.state() == GoogleServiceAuthError::REQUEST_CANCELED; 61 error.state() == GoogleServiceAuthError::REQUEST_CANCELED;
62 } 62 }
63 63
64 enum GaiaCookieRequestType {
65 ADD_ACCOUNT,
66 LOG_OUT_ALL_ACCOUNTS,
67 LOG_OUT_ONE_ACCOUNT,
68 LIST_ACCOUNTS
69 };
70
64 } // namespace 71 } // namespace
65 72
73 GaiaCookieManagerService::GaiaCookieRequest::GaiaCookieRequest(
74 GaiaCookieRequestType request_type,
75 const std::string& account_id,
76 const GaiaCookieManagerService::ListAccountsCallback&
77 list_accounts_callback)
78 : request_type_(request_type),
79 account_id_(account_id),
80 list_accounts_callback_(list_accounts_callback) {}
81
82 GaiaCookieManagerService::GaiaCookieRequest::~GaiaCookieRequest() {
83 }
84
85 // static
86 GaiaCookieManagerService::GaiaCookieRequest
87 GaiaCookieManagerService::GaiaCookieRequest::CreateAddAccountRequest(
88 const std::string& account_id) {
89 return GaiaCookieManagerService::GaiaCookieRequest(
90 GaiaCookieManagerService::GaiaCookieRequestType::ADD_ACCOUNT,
91 account_id,
92 GaiaCookieManagerService::ListAccountsCallback());
93 }
94
95 // static
96 GaiaCookieManagerService::GaiaCookieRequest
97 GaiaCookieManagerService::GaiaCookieRequest::CreateLogOutRequest() {
98 return GaiaCookieManagerService::GaiaCookieRequest(
99 GaiaCookieManagerService::GaiaCookieRequestType::LOG_OUT,
100 std::string(),
101 GaiaCookieManagerService::ListAccountsCallback());
102 }
103
104 GaiaCookieManagerService::GaiaCookieRequest
105 GaiaCookieManagerService::GaiaCookieRequest::CreateListAccountsRequest(
106 const GaiaCookieManagerService::ListAccountsCallback&
107 list_accounts_callback) {
108 return GaiaCookieManagerService::GaiaCookieRequest(
109 GaiaCookieManagerService::GaiaCookieRequestType::LIST_ACCOUNTS,
110 std::string(),
111 list_accounts_callback);
112 }
113
66 GaiaCookieManagerService::ExternalCcResultFetcher::ExternalCcResultFetcher( 114 GaiaCookieManagerService::ExternalCcResultFetcher::ExternalCcResultFetcher(
67 GaiaCookieManagerService* helper) 115 GaiaCookieManagerService* helper)
68 : helper_(helper) { 116 : helper_(helper) {
69 DCHECK(helper_); 117 DCHECK(helper_);
70 } 118 }
71 119
72 GaiaCookieManagerService::ExternalCcResultFetcher::~ExternalCcResultFetcher() { 120 GaiaCookieManagerService::ExternalCcResultFetcher::~ExternalCcResultFetcher() {
73 CleanupTransientState(); 121 CleanupTransientState();
74 } 122 }
75 123
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 : token_service_(token_service), 276 : token_service_(token_service),
229 signin_client_(signin_client), 277 signin_client_(signin_client),
230 external_cc_result_fetcher_(this), 278 external_cc_result_fetcher_(this),
231 gaia_auth_fetcher_backoff_(&kBackoffPolicy), 279 gaia_auth_fetcher_backoff_(&kBackoffPolicy),
232 gaia_auth_fetcher_retries_(0), 280 gaia_auth_fetcher_retries_(0),
233 source_(source) { 281 source_(source) {
234 } 282 }
235 283
236 GaiaCookieManagerService::~GaiaCookieManagerService() { 284 GaiaCookieManagerService::~GaiaCookieManagerService() {
237 CancelAll(); 285 CancelAll();
238 DCHECK(accounts_.empty()); 286 DCHECK(requests_.empty());
239 } 287 }
240 288
241 void GaiaCookieManagerService::AddAccountToCookie( 289 void GaiaCookieManagerService::AddAccountToCookie(
242 const std::string& account_id) { 290 const std::string& account_id) {
243 DCHECK(!account_id.empty()); 291 DCHECK(!account_id.empty());
244 VLOG(1) << "GaiaCookieManagerService::AddAccountToCookie: " << account_id; 292 VLOG(1) << "GaiaCookieManagerService::AddAccountToCookie: " << account_id;
245 accounts_.push_back(account_id); 293 requests_.push_back(GaiaCookieRequest::CreateAddAccountRequest(account_id));
246 if (accounts_.size() == 1) 294 if (requests_.size() == 1)
247 StartFetching(); 295 StartFetchingUbertoken();
296 }
297
298 void GaiaCookieManagerService::ListAccounts(
299 const ListAccountsCallback& callback) {
300 // Not implemented yet.
301 NOTREACHED();
302
303 // TODO(mlerman): Once this service listens to all GAIA cookie changes, cache
304 // the results of ListAccounts, and return them here if the GAIA cookie
305 // hasn't changed since the last call.
306
307 // If there's a GAIA call being executed, wait for it to complete. If it was
308 // another /ListAccounts then we'll use the results it caches.
309 if (gaia_auth_fetcher_)
310 return;
311
312 VLOG(1) << "GaiaCookieManagerService::ListAccounts";
313 gaia_auth_fetcher_.reset(
314 new GaiaAuthFetcher(this, source_,
315 signin_client_->GetURLRequestContext()));
316 gaia_auth_fetcher_->StartListAccounts();
317 }
318
319 void GaiaCookieManagerService::LogOutAllAccounts() {
320 VLOG(1) << "GaiaCookieManagerService::LogOutAllAccounts";
321
322 bool log_out_queued = false;
323 if (!requests_.empty()) {
324 // Track requests to keep; all other unstarted requests will be removed.
325 std::vector<GaiaCookieRequest> requests_to_keep;
326
327 // Check all pending, non-executing requests.
328 for (auto it = requests_.begin() + 1; it != requests_.end(); ++it) {
329 if (it->request_type() == GaiaCookieRequestType::ADD_ACCOUNT) {
330 // We have a pending log in request for an account followed by
331 // a signout.
332 GoogleServiceAuthError error(GoogleServiceAuthError::REQUEST_CANCELED);
333 SignalComplete(it->account_id(), error);
334 }
335
336 // Keep all requests except for ADD_ACCOUNTS.
337 if (it->request_type() != GaiaCookieRequestType::ADD_ACCOUNT)
338 requests_to_keep.push_back(*it);
339
340 // Verify a LOG_OUT isn't already queued.
341 if (it->request_type() == GaiaCookieRequestType::LOG_OUT)
342 log_out_queued = true;
343 }
344
345 // Verify a LOG_OUT isn't currently being processed.
346 if (requests_.front().request_type() == GaiaCookieRequestType::LOG_OUT)
347 log_out_queued = true;
348
349 // Remove all but the executing request. Re-add all requests being kept.
350 if (requests_.size() > 1) {
351 requests_.erase(requests_.begin() + 1, requests_.end());
352 requests_.insert(
353 requests_.end(), requests_to_keep.begin(), requests_to_keep.end());
354 }
355 }
356
357 if (!log_out_queued) {
358 requests_.push_back(GaiaCookieRequest::CreateLogOutRequest());
359 if (requests_.size() == 1)
360 StartLogOutUrlFetch();
361 }
248 } 362 }
249 363
250 void GaiaCookieManagerService::AddObserver(Observer* observer) { 364 void GaiaCookieManagerService::AddObserver(Observer* observer) {
251 observer_list_.AddObserver(observer); 365 observer_list_.AddObserver(observer);
252 } 366 }
253 367
254 void GaiaCookieManagerService::RemoveObserver(Observer* observer) { 368 void GaiaCookieManagerService::RemoveObserver(Observer* observer) {
255 observer_list_.RemoveObserver(observer); 369 observer_list_.RemoveObserver(observer);
256 } 370 }
257 371
258 void GaiaCookieManagerService::CancelAll() { 372 void GaiaCookieManagerService::CancelAll() {
259 VLOG(1) << "GaiaCookieManagerService::CancelAll"; 373 VLOG(1) << "GaiaCookieManagerService::CancelAll";
260 gaia_auth_fetcher_.reset(); 374 gaia_auth_fetcher_.reset();
261 uber_token_fetcher_.reset(); 375 uber_token_fetcher_.reset();
262 accounts_.clear(); 376 requests_.clear();
263 gaia_auth_fetcher_timer_.Stop(); 377 gaia_auth_fetcher_timer_.Stop();
264 } 378 }
265 379
266 void GaiaCookieManagerService::LogOut(
267 const std::string& account_id,
268 const std::vector<std::string>& accounts) {
269 DCHECK(!account_id.empty());
270 VLOG(1) << "GaiaCookieManagerService::LogOut: " << account_id
271 << " accounts=" << accounts.size();
272 LogOutInternal(account_id, accounts);
273 }
274
275 void GaiaCookieManagerService::LogOutInternal(
276 const std::string& account_id,
277 const std::vector<std::string>& accounts) {
278 bool pending = !accounts_.empty();
279
280 if (pending) {
281 for (std::deque<std::string>::const_iterator it = accounts_.begin() + 1;
282 it != accounts_.end(); it++) {
283 if (!it->empty() &&
284 (std::find(accounts.begin(), accounts.end(), *it) == accounts.end() ||
285 *it == account_id)) {
286 // We have a pending log in request for an account followed by
287 // a signout.
288 GoogleServiceAuthError error(GoogleServiceAuthError::REQUEST_CANCELED);
289 SignalComplete(*it, error);
290 }
291 }
292
293 // Remove every thing in the work list besides the one that is running.
294 accounts_.resize(1);
295 }
296
297 // Signal a logout to be the next thing to do unless the pending
298 // action is already a logout.
299 if (!pending || !accounts_.front().empty())
300 accounts_.push_back("");
301
302 for (std::vector<std::string>::const_iterator it = accounts.begin();
303 it != accounts.end(); it++) {
304 if (*it != account_id) {
305 DCHECK(!it->empty());
306 accounts_.push_back(*it);
307 }
308 }
309
310 if (!pending)
311 StartLogOutUrlFetch();
312 }
313
314 void GaiaCookieManagerService::LogOutAllAccounts() {
315 VLOG(1) << "GaiaCookieManagerService::LogOutAllAccounts";
316 LogOutInternal("", std::vector<std::string>());
317 }
318
319 void GaiaCookieManagerService::SignalComplete( 380 void GaiaCookieManagerService::SignalComplete(
320 const std::string& account_id, 381 const std::string& account_id,
321 const GoogleServiceAuthError& error) { 382 const GoogleServiceAuthError& error) {
322 // Its possible for the observer to delete |this| object. Don't access 383 // Its possible for the observer to delete |this| object. Don't access
323 // access any members after this calling the observer. This method should 384 // access any members after this calling the observer. This method should
324 // be the last call in any other method. 385 // be the last call in any other method.
325 FOR_EACH_OBSERVER(Observer, observer_list_, 386 FOR_EACH_OBSERVER(Observer, observer_list_,
326 OnAddAccountToCookieCompleted(account_id, error)); 387 OnAddAccountToCookieCompleted(account_id, error));
327 } 388 }
328 389
329 void GaiaCookieManagerService::StartFetchingExternalCcResult() { 390 void GaiaCookieManagerService::StartFetchingExternalCcResult() {
330 if (!external_cc_result_fetcher_.IsRunning()) 391 if (!external_cc_result_fetcher_.IsRunning())
331 external_cc_result_fetcher_.Start(); 392 external_cc_result_fetcher_.Start();
332 } 393 }
333 394
334 void GaiaCookieManagerService::StartLogOutUrlFetch() { 395 void GaiaCookieManagerService::StartLogOutUrlFetch() {
335 DCHECK(accounts_.front().empty()); 396 DCHECK(requests_.front().request_type() == GaiaCookieRequestType::LOG_OUT);
336 VLOG(1) << "GaiaCookieManagerService::StartLogOutUrlFetch"; 397 VLOG(1) << "GaiaCookieManagerService::StartLogOutUrlFetch";
337 GURL logout_url(GaiaUrls::GetInstance()->service_logout_url().Resolve( 398 GURL logout_url(GaiaUrls::GetInstance()->service_logout_url().Resolve(
338 base::StringPrintf("?source=%s", source_.c_str()))); 399 base::StringPrintf("?source=%s", source_.c_str())));
339 net::URLFetcher* fetcher = 400 net::URLFetcher* fetcher =
340 net::URLFetcher::Create(logout_url, net::URLFetcher::GET, this); 401 net::URLFetcher::Create(logout_url, net::URLFetcher::GET, this);
341 fetcher->SetRequestContext(signin_client_->GetURLRequestContext()); 402 fetcher->SetRequestContext(signin_client_->GetURLRequestContext());
342 fetcher->Start(); 403 fetcher->Start();
343 } 404 }
344 405
345 void GaiaCookieManagerService::OnUbertokenSuccess( 406 void GaiaCookieManagerService::OnUbertokenSuccess(
346 const std::string& uber_token) { 407 const std::string& uber_token) {
347 VLOG(1) << "GaiaCookieManagerService::OnUbertokenSuccess" 408 VLOG(1) << "GaiaCookieManagerService::OnUbertokenSuccess"
348 << " account=" << accounts_.front(); 409 << " account=" << requests_.front().account_id();
349 gaia_auth_fetcher_retries_ = 0; 410 gaia_auth_fetcher_retries_ = 0;
350 uber_token_ = uber_token; 411 uber_token_ = uber_token;
351 StartFetchingMergeSession(); 412 StartFetchingMergeSession();
352 } 413 }
353 414
354 void GaiaCookieManagerService::OnUbertokenFailure( 415 void GaiaCookieManagerService::OnUbertokenFailure(
355 const GoogleServiceAuthError& error) { 416 const GoogleServiceAuthError& error) {
356 VLOG(1) << "Failed to retrieve ubertoken" 417 VLOG(1) << "Failed to retrieve ubertoken"
357 << " account=" << accounts_.front() << " error=" << error.ToString(); 418 << " account=" << requests_.front().account_id()
358 const std::string account_id = accounts_.front(); 419 << " error=" << error.ToString();
359 HandleNextAccount(); 420 const std::string account_id = requests_.front().account_id();
421 HandleNextRequest();
360 SignalComplete(account_id, error); 422 SignalComplete(account_id, error);
361 } 423 }
362 424
363 void GaiaCookieManagerService::OnMergeSessionSuccess(const std::string& data) { 425 void GaiaCookieManagerService::OnMergeSessionSuccess(const std::string& data) {
364 VLOG(1) << "MergeSession successful account=" << accounts_.front(); 426 VLOG(1) << "MergeSession successful account="
365 const std::string account_id = accounts_.front(); 427 << requests_.front().account_id();
366 HandleNextAccount(); 428 const std::string account_id = requests_.front().account_id();
429 HandleNextRequest();
367 SignalComplete(account_id, GoogleServiceAuthError::AuthErrorNone()); 430 SignalComplete(account_id, GoogleServiceAuthError::AuthErrorNone());
368 431
369 gaia_auth_fetcher_backoff_.InformOfRequest(true); 432 gaia_auth_fetcher_backoff_.InformOfRequest(true);
370 uber_token_ = std::string(); 433 uber_token_ = std::string();
371 } 434 }
372 435
373 void GaiaCookieManagerService::OnMergeSessionFailure( 436 void GaiaCookieManagerService::OnMergeSessionFailure(
374 const GoogleServiceAuthError& error) { 437 const GoogleServiceAuthError& error) {
375 VLOG(1) << "Failed MergeSession" 438 VLOG(1) << "Failed MergeSession"
376 << " account=" << accounts_.front() << " error=" << error.ToString() 439 << " account=" << requests_.front().account_id()
377 << " on retry=" << gaia_auth_fetcher_retries_; 440 << " error=" << error.ToString();
378 441
379 if (++gaia_auth_fetcher_retries_ < kMaxGaiaAuthFetcherRetries && 442 if (++gaia_auth_fetcher_retries_ < kMaxGaiaAuthFetcherRetries &&
380 IsTransientError(error)) { 443 IsTransientError(error)) {
381 gaia_auth_fetcher_backoff_.InformOfRequest(false); 444 gaia_auth_fetcher_backoff_.InformOfRequest(false);
382 gaia_auth_fetcher_timer_.Start( 445 gaia_auth_fetcher_timer_.Start(
383 FROM_HERE, gaia_auth_fetcher_backoff_.GetTimeUntilRelease(), this, 446 FROM_HERE, gaia_auth_fetcher_backoff_.GetTimeUntilRelease(), this,
384 &GaiaCookieManagerService::StartFetchingMergeSession); 447 &GaiaCookieManagerService::StartFetchingMergeSession);
385 return; 448 return;
386 } 449 }
387 450
388 uber_token_ = std::string(); 451 uber_token_ = std::string();
389 const std::string account_id = accounts_.front(); 452 const std::string account_id = requests_.front().account_id();
390 HandleNextAccount(); 453 HandleNextRequest();
391 SignalComplete(account_id, error); 454 SignalComplete(account_id, error);
392 } 455 }
393 456
394 void GaiaCookieManagerService::StartFetching() { 457 void GaiaCookieManagerService::StartFetchingUbertoken() {
395 VLOG(1) << "GaiaCookieManagerService::StartFetching account_id=" 458 VLOG(1) << "GaiaCookieManagerService::StartFetching account_id="
396 << accounts_.front(); 459 << requests_.front().account_id();
397 uber_token_fetcher_.reset( 460 uber_token_fetcher_.reset(
398 new UbertokenFetcher(token_service_, this, source_, 461 new UbertokenFetcher(token_service_, this, source_,
399 signin_client_->GetURLRequestContext())); 462 signin_client_->GetURLRequestContext()));
400 uber_token_fetcher_->StartFetchingToken(accounts_.front()); 463 uber_token_fetcher_->StartFetchingToken(requests_.front().account_id());
401 } 464 }
402 465
403 void GaiaCookieManagerService::StartFetchingMergeSession() { 466 void GaiaCookieManagerService::StartFetchingMergeSession() {
404 DCHECK(!uber_token_.empty()); 467 DCHECK(!uber_token_.empty());
405 gaia_auth_fetcher_.reset( 468 gaia_auth_fetcher_.reset(
406 new GaiaAuthFetcher(this, source_, 469 new GaiaAuthFetcher(this, source_,
407 signin_client_->GetURLRequestContext())); 470 signin_client_->GetURLRequestContext()));
408 471
409 // It's possible that not all external checks have completed. 472 // It's possible that not all external checks have completed.
410 // GetExternalCcResult() returns results for those that have. 473 // GetExternalCcResult() returns results for those that have.
411 gaia_auth_fetcher_->StartMergeSession(uber_token_, 474 gaia_auth_fetcher_->StartMergeSession(uber_token_,
412 external_cc_result_fetcher_.GetExternalCcResult()); 475 external_cc_result_fetcher_.GetExternalCcResult());
413 } 476 }
414 477
415 void GaiaCookieManagerService::OnURLFetchComplete( 478 void GaiaCookieManagerService::OnURLFetchComplete(
416 const net::URLFetcher* source) { 479 const net::URLFetcher* source) {
417 DCHECK(accounts_.front().empty()); 480 DCHECK(requests_.front().request_type() == GaiaCookieRequestType::LOG_OUT);
418 VLOG(1) << "GaiaCookieManagerService::OnURLFetchComplete"; 481 VLOG(1) << "GaiaCookieManagerService::OnURLFetchComplete";
419 HandleNextAccount(); 482 HandleNextRequest();
420 } 483 }
421 484
422 void GaiaCookieManagerService::HandleNextAccount() { 485 void GaiaCookieManagerService::HandleNextRequest() {
423 VLOG(1) << "GaiaCookieManagerService::HandleNextAccount"; 486 VLOG(1) << "GaiaCookieManagerService::HandleNextRequest";
424 accounts_.pop_front(); 487 requests_.pop_front();
425 gaia_auth_fetcher_.reset(); 488 gaia_auth_fetcher_.reset();
426 if (accounts_.empty()) { 489 if (requests_.empty()) {
427 VLOG(1) << "GaiaCookieManagerService::HandleNextAccount: no more"; 490 VLOG(1) << "GaiaCookieManagerService::HandleNextRequest: no more";
428 uber_token_fetcher_.reset(); 491 uber_token_fetcher_.reset();
429 } else { 492 } else {
430 if (accounts_.front().empty()) { 493 switch (requests_.front().request_type()) {
431 StartLogOutUrlFetch(); 494 case GaiaCookieRequestType::ADD_ACCOUNT:
432 } else { 495 StartFetchingUbertoken();
433 StartFetching(); 496 break;
434 } 497 case GaiaCookieRequestType::LOG_OUT:
498 StartLogOutUrlFetch();
499 break;
500 case GaiaCookieRequestType::LIST_ACCOUNTS:
501 break;
502 };
435 } 503 }
436 } 504 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698