diff options
author | noyau <noyau@chromium.org> | 2014-09-12 03:19:39 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-12 10:21:16 +0000 |
commit | f0e1e779e3acf7e18093550dc775e44b812a3286 (patch) | |
tree | 7e876cfc585e2125e3730162e7e30018ab5e6ab2 /components/enhanced_bookmarks/bookmark_server_service.cc | |
parent | fa32f2e56ac125ff2c95f35473f123a8d2bc2012 (diff) | |
download | chromium_src-f0e1e779e3acf7e18093550dc775e44b812a3286.zip chromium_src-f0e1e779e3acf7e18093550dc775e44b812a3286.tar.gz chromium_src-f0e1e779e3acf7e18093550dc775e44b812a3286.tar.bz2 |
Bring up of the server side full text search.
This class is used to perform a full text search on bookmarks, powered by the server side. The superclass will be used for other services in subsequent CLs.
BUG=None
Review URL: https://codereview.chromium.org/538903003
Cr-Commit-Position: refs/heads/master@{#294571}
Diffstat (limited to 'components/enhanced_bookmarks/bookmark_server_service.cc')
-rw-r--r-- | components/enhanced_bookmarks/bookmark_server_service.cc | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/components/enhanced_bookmarks/bookmark_server_service.cc b/components/enhanced_bookmarks/bookmark_server_service.cc new file mode 100644 index 0000000..a5b0e37 --- /dev/null +++ b/components/enhanced_bookmarks/bookmark_server_service.cc @@ -0,0 +1,235 @@ +// 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/bookmarks/browser/bookmark_model.h" +#include "components/bookmarks/browser/bookmark_model_observer.h" +#include "components/enhanced_bookmarks/metadata_accessor.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" + +namespace enhanced_bookmarks { + +BookmarkServerService::BookmarkServerService( + scoped_refptr<net::URLRequestContextGetter> request_context_getter, + ProfileOAuth2TokenService* token_service, + SigninManagerBase* signin_manager, + BookmarkModel* bookmark_model) + : OAuth2TokenService::Consumer("bookmark_server_service"), + bookmark_model_(bookmark_model), + token_service_(token_service), + signin_manager_(signin_manager), + request_context_getter_(request_context_getter), + inhibit_change_notifications_(false) { + DCHECK(request_context_getter.get()); + DCHECK(token_service); + DCHECK(signin_manager); + DCHECK(bookmark_model); + bookmark_model_->AddObserver(this); + if (bookmark_model_->loaded()) + BuildIdMap(); +} + +BookmarkServerService::~BookmarkServerService() { + bookmark_model_->RemoveObserver(this); +} + +void BookmarkServerService::AddObserver( + BookmarkServerServiceObserver* observer) { + observers_.AddObserver(observer); +} + +void BookmarkServerService::RemoveObserver( + BookmarkServerServiceObserver* observer) { + observers_.RemoveObserver(observer); +} + +void BookmarkServerService::BuildIdMap() { + ui::TreeNodeIterator<const BookmarkNode> iterator( + bookmark_model_->root_node()); + + while (iterator.has_next()) { + const BookmarkNode* bookmark = iterator.Next(); + if (bookmark_model_->is_permanent_node(bookmark)) + continue; + // RemoteIdFromBookmark() will create the ID if it doesn't exists yet. + std::string starid = + enhanced_bookmarks::RemoteIdFromBookmark(bookmark_model_, bookmark); + if (bookmark->is_url()) { + starsid_to_bookmark_[starid] = bookmark; + } + } +} + +const BookmarkNode* BookmarkServerService::BookmarkForRemoteId( + const std::string& remote_id) const { + std::map<std::string, const BookmarkNode*>::const_iterator it = + starsid_to_bookmark_.find(remote_id); + if (it == starsid_to_bookmark_.end()) + return NULL; + return it->second; +} + +const std::string BookmarkServerService::RemoteIDForBookmark( + const BookmarkNode* bookmark) const { + return enhanced_bookmarks::RemoteIdFromBookmark(bookmark_model_, bookmark); +} + +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. + + const std::string username(signin_manager_->GetAuthenticatedUsername()); + if (!username.length()) { + // User is not signed in. + CleanAfterFailure(); + Notify(); + return; + } + // Find a token. + OAuth2TokenService::ScopeSet scopes; + scopes.insert(GaiaConstants::kChromeSyncOAuth2Scope); + token_request_ = token_service_->StartRequest(username, scopes, this); +} + +// +// OAuth2AccessTokenConsumer methods. +// +void BookmarkServerService::OnGetTokenSuccess( + const OAuth2TokenService::Request* request, + const std::string& access_token, + const base::Time& expiration_time) { + url_fetcher_.reset(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<net::URLFetcher> 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(); +} + +// +// BookmarkModelObserver methods. +// +void BookmarkServerService::BookmarkModelLoaded(BookmarkModel* model, + bool ids_reassigned) { + BuildIdMap(); +} + +void BookmarkServerService::BookmarkNodeAdded(BookmarkModel* model, + const BookmarkNode* parent, + int index) { + DCHECK(!inhibit_change_notifications_); + const BookmarkNode* bookmark = parent->GetChild(index); + if (!bookmark->is_url()) + return; + + base::AutoReset<bool> inhibitor(&inhibit_change_notifications_, true); + std::string starid = + enhanced_bookmarks::RemoteIdFromBookmark(model, bookmark); + starsid_to_bookmark_[starid] = bookmark; +} + +void BookmarkServerService::BookmarkNodeRemoved( + BookmarkModel* model, + const BookmarkNode* parent, + int old_index, + const BookmarkNode* node, + const std::set<GURL>& removed_urls) { + DCHECK(!inhibit_change_notifications_); + if (!node->is_url()) + return; + base::AutoReset<bool> inhibitor(&inhibit_change_notifications_, true); + std::string starid = enhanced_bookmarks::RemoteIdFromBookmark(model, node); + starsid_to_bookmark_.erase(starid); +} + +void BookmarkServerService::OnWillChangeBookmarkMetaInfo( + BookmarkModel* model, + const BookmarkNode* node) { + if (!node->is_url() || inhibit_change_notifications_) + return; + base::AutoReset<bool> inhibitor(&inhibit_change_notifications_, true); + std::string starid = enhanced_bookmarks::RemoteIdFromBookmark(model, node); + starsid_to_bookmark_.erase(starid); +} + +void BookmarkServerService::BookmarkMetaInfoChanged(BookmarkModel* model, + const BookmarkNode* node) { + if (!node->is_url() || inhibit_change_notifications_) + return; + + std::string starid = enhanced_bookmarks::RemoteIdFromBookmark(model, node); + starsid_to_bookmark_[starid] = node; +} + +void BookmarkServerService::BookmarkAllUserNodesRemoved( + BookmarkModel* model, + const std::set<GURL>& removed_urls) { + DCHECK(!inhibit_change_notifications_); + starsid_to_bookmark_.clear(); +} + +SigninManagerBase* BookmarkServerService::GetSigninManager() { + DCHECK(signin_manager_); + return signin_manager_; +} + +} // namespace enhanced_bookmarks |