Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/enhanced_bookmarks/bookmark_server_service.h" | |
| 6 | |
| 7 #include "base/auto_reset.h" | |
| 8 #include "components/bookmarks/browser/bookmark_model.h" | |
| 9 #include "components/bookmarks/browser/bookmark_model_observer.h" | |
| 10 #include "components/enhanced_bookmarks/metadata_accessor.h" | |
| 11 #include "components/signin/core/browser/profile_oauth2_token_service.h" | |
| 12 #include "components/signin/core/browser/signin_manager_base.h" | |
| 13 #include "net/base/load_flags.h" | |
| 14 #include "net/url_request/url_request_context_getter.h" | |
| 15 #include "ui/base/models/tree_node_iterator.h" | |
| 16 | |
| 17 namespace { | |
| 18 const std::string kScope("https://www.googleapis.com/auth/chromesync"); | |
|
Yaron
2014/09/05 04:37:52
use GaiaConstants::kChromeSyncOAuth2Scope instead.
noyau (Ping after 24h)
2014/09/08 09:46:48
Done.
| |
| 19 } | |
| 20 | |
| 21 namespace enhanced_bookmarks { | |
| 22 | |
| 23 BookmarkServerService::BookmarkServerService( | |
| 24 scoped_refptr<net::URLRequestContextGetter> request_context_getter, | |
| 25 ProfileOAuth2TokenService* token_service, | |
| 26 SigninManagerBase* signin_manager, | |
| 27 BookmarkModel* bookmark_model) | |
| 28 : OAuth2TokenService::Consumer("bookmark_server_service"), | |
| 29 bookmark_model_(bookmark_model), | |
| 30 token_service_(token_service), | |
| 31 signin_manager_(signin_manager), | |
| 32 request_context_getter_(request_context_getter), | |
| 33 inhibit_change_notifications_(false) { | |
| 34 DCHECK(request_context_getter); | |
| 35 DCHECK(token_service); | |
| 36 DCHECK(signin_manager); | |
| 37 DCHECK(bookmark_model); | |
| 38 bookmark_model_->AddObserver(this); | |
| 39 if (bookmark_model_->loaded()) | |
| 40 BuildIdMap(); | |
| 41 } | |
| 42 | |
| 43 BookmarkServerService::~BookmarkServerService() { | |
| 44 bookmark_model_->RemoveObserver(this); | |
| 45 } | |
| 46 | |
| 47 void BookmarkServerService::AddObserver( | |
| 48 BookmarkServerServiceObserver* observer) { | |
| 49 observers_.AddObserver(observer); | |
| 50 } | |
| 51 | |
| 52 void BookmarkServerService::RemoveObserver( | |
| 53 BookmarkServerServiceObserver* observer) { | |
| 54 observers_.RemoveObserver(observer); | |
| 55 } | |
| 56 | |
| 57 void BookmarkServerService::BuildIdMap() { | |
| 58 ui::TreeNodeIterator<const BookmarkNode> iterator( | |
| 59 bookmark_model_->root_node()); | |
| 60 | |
| 61 while (iterator.has_next()) { | |
| 62 const BookmarkNode* bookmark = iterator.Next(); | |
| 63 if (bookmark_model_->is_permanent_node(bookmark)) | |
| 64 continue; | |
| 65 // RemoteIdFromBookmark() will create the ID if it doesn't exists yet. | |
| 66 std::string starid = | |
| 67 enhanced_bookmarks::RemoteIdFromBookmark(bookmark_model_, bookmark); | |
| 68 if (bookmark->is_url()) { | |
| 69 starsid_to_bookmark_[starid] = bookmark; | |
| 70 } | |
| 71 } | |
| 72 } | |
| 73 | |
| 74 const BookmarkNode* BookmarkServerService::BookmarkForRemoteId( | |
| 75 const std::string& remote_id) const { | |
| 76 std::map<std::string, const BookmarkNode*>::const_iterator it = | |
| 77 starsid_to_bookmark_.find(remote_id); | |
| 78 if (it == starsid_to_bookmark_.end()) | |
| 79 return NULL; | |
| 80 return it->second; | |
| 81 } | |
| 82 | |
| 83 const std::string BookmarkServerService::RemoteIDForBookmark( | |
| 84 const BookmarkNode* bookmark) const { | |
| 85 return enhanced_bookmarks::RemoteIdFromBookmark(bookmark_model_, bookmark); | |
| 86 } | |
| 87 | |
| 88 void BookmarkServerService::Notify() { | |
| 89 FOR_EACH_OBSERVER(BookmarkServerServiceObserver, observers_, OnChange(this)); | |
| 90 } | |
| 91 | |
| 92 void BookmarkServerService::TriggerTokenRequest(bool cancel_previous) { | |
| 93 if (cancel_previous) | |
| 94 url_fetcher_.reset(); | |
| 95 | |
| 96 if (token_request_ || url_fetcher_) | |
| 97 return; // Fetcher is already running. | |
| 98 | |
| 99 const std::string username(signin_manager_->GetAuthenticatedUsername()); | |
| 100 if (!username.length()) { | |
| 101 // User is not signed in. | |
| 102 CleanAfterFailure(); | |
| 103 Notify(); | |
| 104 return; | |
| 105 } | |
| 106 // Find a token. | |
| 107 OAuth2TokenService::ScopeSet scopes; | |
| 108 scopes.insert(kScope); | |
| 109 token_request_ = token_service_->StartRequest(username, scopes, this); | |
| 110 } | |
| 111 | |
| 112 // | |
| 113 // OAuth2AccessTokenConsumer methods. | |
| 114 // | |
| 115 void BookmarkServerService::OnGetTokenSuccess( | |
| 116 const OAuth2TokenService::Request* request, | |
| 117 const std::string& access_token, | |
| 118 const base::Time& expiration_time) { | |
| 119 url_fetcher_.reset(CreateFetcherWithToken(access_token)); | |
| 120 // Free the token request. | |
| 121 token_request_.reset(); | |
| 122 | |
| 123 if (!url_fetcher_) { | |
| 124 CleanAfterFailure(); | |
| 125 Notify(); | |
| 126 return; | |
| 127 } | |
| 128 url_fetcher_->SetRequestContext(request_context_getter_); | |
| 129 | |
| 130 // Add the token. | |
| 131 std::string headers; | |
| 132 headers = "Authorization: Bearer "; | |
| 133 headers += access_token; | |
| 134 headers += "\r\n"; | |
| 135 url_fetcher_->SetExtraRequestHeaders(headers); | |
| 136 | |
| 137 // Do not pollute the cookie store with cruft, or mix the users cookie in this | |
| 138 // request. | |
| 139 url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | | |
| 140 net::LOAD_DO_NOT_SAVE_COOKIES); | |
| 141 | |
| 142 url_fetcher_->Start(); | |
| 143 } | |
| 144 | |
| 145 void BookmarkServerService::OnGetTokenFailure( | |
| 146 const OAuth2TokenService::Request* request, | |
| 147 const GoogleServiceAuthError& error) { | |
| 148 // Free the request. | |
| 149 token_request_.reset(); | |
| 150 CleanAfterFailure(); | |
| 151 Notify(); | |
| 152 } | |
| 153 | |
| 154 // | |
| 155 // net::URLFetcherDelegate methods. | |
| 156 // | |
| 157 void BookmarkServerService::OnURLFetchComplete(const net::URLFetcher* source) { | |
| 158 scoped_ptr<net::URLFetcher> url_fetcher(url_fetcher_.Pass()); | |
| 159 std::string response; | |
| 160 bool should_notify = true; | |
| 161 | |
| 162 if (url_fetcher->GetResponseCode() != 200 || | |
| 163 !url_fetcher->GetResponseAsString(&response) || | |
| 164 !ProcessResponse(response, &should_notify)) { | |
| 165 CleanAfterFailure(); | |
| 166 } | |
| 167 if (should_notify) | |
| 168 Notify(); | |
| 169 } | |
| 170 | |
| 171 // | |
| 172 // BookmarkModelObserver methods. | |
| 173 // | |
| 174 void BookmarkServerService::BookmarkModelLoaded(BookmarkModel* model, | |
| 175 bool ids_reassigned) { | |
| 176 BuildIdMap(); | |
| 177 } | |
| 178 | |
| 179 void BookmarkServerService::BookmarkNodeAdded(BookmarkModel* model, | |
| 180 const BookmarkNode* parent, | |
| 181 int index) { | |
| 182 DCHECK(!inhibit_change_notifications_); | |
| 183 const BookmarkNode* bookmark = parent->GetChild(index); | |
| 184 if (!bookmark->is_url()) | |
| 185 return; | |
| 186 | |
| 187 base::AutoReset<bool> inhibitor(&inhibit_change_notifications_, true); | |
| 188 std::string starid = | |
| 189 enhanced_bookmarks::RemoteIdFromBookmark(model, bookmark); | |
| 190 starsid_to_bookmark_[starid] = bookmark; | |
| 191 } | |
| 192 | |
| 193 void BookmarkServerService::BookmarkNodeRemoved( | |
| 194 BookmarkModel* model, | |
| 195 const BookmarkNode* parent, | |
| 196 int old_index, | |
| 197 const BookmarkNode* node, | |
| 198 const std::set<GURL>& removed_urls) { | |
| 199 DCHECK(!inhibit_change_notifications_); | |
| 200 if (!node->is_url()) | |
| 201 return; | |
| 202 base::AutoReset<bool> inhibitor(&inhibit_change_notifications_, true); | |
| 203 std::string starid = enhanced_bookmarks::RemoteIdFromBookmark(model, node); | |
| 204 starsid_to_bookmark_.erase(starid); | |
| 205 } | |
| 206 | |
| 207 void BookmarkServerService::OnWillChangeBookmarkMetaInfo( | |
| 208 BookmarkModel* model, | |
| 209 const BookmarkNode* node) { | |
| 210 if (!node->is_url() || inhibit_change_notifications_) | |
| 211 return; | |
| 212 base::AutoReset<bool> inhibitor(&inhibit_change_notifications_, true); | |
| 213 std::string starid = enhanced_bookmarks::RemoteIdFromBookmark(model, node); | |
| 214 starsid_to_bookmark_.erase(starid); | |
| 215 } | |
| 216 | |
| 217 void BookmarkServerService::BookmarkMetaInfoChanged(BookmarkModel* model, | |
| 218 const BookmarkNode* node) { | |
| 219 if (!node->is_url() || inhibit_change_notifications_) | |
| 220 return; | |
| 221 | |
| 222 std::string starid = enhanced_bookmarks::RemoteIdFromBookmark(model, node); | |
| 223 starsid_to_bookmark_[starid] = node; | |
| 224 } | |
| 225 | |
| 226 void BookmarkServerService::BookmarkAllUserNodesRemoved( | |
| 227 BookmarkModel* model, | |
| 228 const std::set<GURL>& removed_urls) { | |
| 229 DCHECK(!inhibit_change_notifications_); | |
| 230 starsid_to_bookmark_.clear(); | |
| 231 } | |
| 232 | |
| 233 SigninManagerBase* BookmarkServerService::GetSigninManager() { | |
| 234 DCHECK(signin_manager_); | |
| 235 return signin_manager_; | |
| 236 } | |
| 237 | |
| 238 } // namespace enhanced_bookmarks | |
| OLD | NEW |