// Copyright 2014 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. #include "components/enhanced_bookmarks/bookmark_server_service.h" #include "base/auto_reset.h" #include "components/enhanced_bookmarks/enhanced_bookmark_model.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_manager_base.h" #include "google_apis/gaia/gaia_constants.h" #include "net/base/load_flags.h" #include "net/url_request/url_request_context_getter.h" #include "ui/base/models/tree_node_iterator.h" using bookmarks::BookmarkNode; namespace enhanced_bookmarks { BookmarkServerService::BookmarkServerService( scoped_refptr request_context_getter, ProfileOAuth2TokenService* token_service, SigninManagerBase* signin_manager, EnhancedBookmarkModel* enhanced_bookmark_model) : OAuth2TokenService::Consumer("bookmark_server_service"), model_(enhanced_bookmark_model), token_service_(token_service), signin_manager_(signin_manager), request_context_getter_(request_context_getter) { DCHECK(request_context_getter.get()); DCHECK(token_service); DCHECK(signin_manager); DCHECK(enhanced_bookmark_model); model_->AddObserver(this); } BookmarkServerService::~BookmarkServerService() { model_->RemoveObserver(this); } void BookmarkServerService::AddObserver( BookmarkServerServiceObserver* observer) { observers_.AddObserver(observer); } void BookmarkServerService::RemoveObserver( BookmarkServerServiceObserver* observer) { observers_.RemoveObserver(observer); } const BookmarkNode* BookmarkServerService::BookmarkForRemoteId( const std::string& remote_id) const { return model_->BookmarkForRemoteId(remote_id); } const std::string BookmarkServerService::RemoteIDForBookmark( const BookmarkNode* bookmark) const { return model_->GetRemoteId(bookmark); } void BookmarkServerService::Cancel() { url_fetcher_.reset(); token_request_.reset(); } void BookmarkServerService::Notify() { FOR_EACH_OBSERVER(BookmarkServerServiceObserver, observers_, OnChange(this)); } void BookmarkServerService::TriggerTokenRequest(bool cancel_previous) { if (cancel_previous) url_fetcher_.reset(); if (token_request_ || url_fetcher_) return; // Fetcher is already running. if (!signin_manager_->IsAuthenticated()) { // User is not signed in. CleanAfterFailure(); Notify(); return; } // Find a token. OAuth2TokenService::ScopeSet scopes; scopes.insert(GaiaConstants::kChromeSyncOAuth2Scope); token_request_ = token_service_->StartRequest( signin_manager_->GetAuthenticatedAccountId(), scopes, this); } // // OAuth2AccessTokenConsumer methods. // void BookmarkServerService::OnGetTokenSuccess( const OAuth2TokenService::Request* request, const std::string& access_token, const base::Time& expiration_time) { url_fetcher_ = CreateFetcher(); // Free the token request. token_request_.reset(); if (!url_fetcher_) { CleanAfterFailure(); Notify(); return; } url_fetcher_->SetRequestContext(request_context_getter_.get()); // Add the token. std::string headers; headers = "Authorization: Bearer "; headers += access_token; headers += "\r\n"; url_fetcher_->SetExtraRequestHeaders(headers); // Do not pollute the cookie store with cruft, or mix the users cookie in this // request. url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES); url_fetcher_->Start(); } void BookmarkServerService::OnGetTokenFailure( const OAuth2TokenService::Request* request, const GoogleServiceAuthError& error) { // Free the request. token_request_.reset(); CleanAfterFailure(); Notify(); } // // net::URLFetcherDelegate methods. // void BookmarkServerService::OnURLFetchComplete(const net::URLFetcher* source) { scoped_ptr url_fetcher(url_fetcher_.Pass()); std::string response; bool should_notify = true; if (url_fetcher->GetResponseCode() != 200 || !url_fetcher->GetResponseAsString(&response) || !ProcessResponse(response, &should_notify)) { CleanAfterFailure(); } if (should_notify) Notify(); } void BookmarkServerService::EnhancedBookmarkModelShuttingDown() { NOTREACHED(); } SigninManagerBase* BookmarkServerService::GetSigninManager() { DCHECK(signin_manager_); return signin_manager_; } } // namespace enhanced_bookmarks