1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_data_service.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/stl_util-inl.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h" 103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_profile.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/credit_card.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/profile_error_dialog.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/autofill_change.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/autofill_entry.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_database.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_constants.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "third_party/skia/include/core/SkBitmap.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "webkit/glue/form_field.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/password_form.h" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebDataService implementation. 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::Time; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::FormField; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::PasswordForm; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWDAppImagesResult::WDAppImagesResult() : has_all_images(false) {} 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 41731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWDAppImagesResult::~WDAppImagesResult() {} 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 43731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWDKeywordsResult::WDKeywordsResult() 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : default_search_provider_id(0), 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick builtin_keyword_version(0) { 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 48731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWDKeywordsResult::~WDKeywordsResult() {} 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::WebDataService() 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : is_running_(false), 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_(NULL), 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch failed_init_(false), 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch should_commit_(false), 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_request_handle_(1), 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch main_loop_(MessageLoop::current()) { 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebDataService::Init(const FilePath& profile_path) { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath path = profile_path; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path = path.Append(chrome::kWebDataFilename); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return InitWithPath(path); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::Shutdown() { 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UnloadDatabase(); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebDataService::IsRunning() const { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return is_running_; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::UnloadDatabase() { 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::ShutdownDatabase)); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::CancelRequest(Handle h) { 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock l(pending_lock_); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestMap::iterator i = pending_requests_.find(h); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i == pending_requests_.end()) { 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Canceling a nonexistent web data service request"; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i->second->Cancel(); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebDataService::IsDatabaseLoaded() { 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return db_ != NULL; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDatabase* WebDataService::GetDatabase() { 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return db_; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////// 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keywords. 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////// 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::AddKeyword(const TemplateURL& url) { 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Ensure that the keyword is already generated (and cached) before caching 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // the TemplateURL for use on another keyword. 1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick url.EnsureKeyword(); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<TemplateURL>* request = 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<TemplateURL>(this, GetNextRequestHandle(), NULL, url); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::AddKeywordImpl, 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveKeyword(const TemplateURL& url) { 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<TemplateURLID>* request = 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new GenericRequest<TemplateURLID>(this, GetNextRequestHandle(), 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, url.id()); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, &WebDataService::RemoveKeywordImpl, request)); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::UpdateKeyword(const TemplateURL& url) { 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Ensure that the keyword is already generated (and cached) before caching 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // the TemplateURL for use on another keyword. 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick url.EnsureKeyword(); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<TemplateURL>* request = 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<TemplateURL>(this, GetNextRequestHandle(), NULL, url); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, &WebDataService::UpdateKeywordImpl, request)); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetKeywords( 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataRequest* request = 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WebDataRequest(this, GetNextRequestHandle(), consumer); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::GetKeywordsImpl, 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetDefaultSearchProvider(const TemplateURL* url) { 1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<TemplateURLID>* request = 1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new GenericRequest<TemplateURLID>(this, 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetNextRequestHandle(), 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, 1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick url ? url->id() : 0); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, &WebDataService::SetDefaultSearchProviderImpl, 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetBuiltinKeywordVersion(int version) { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<int>* request = 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<int>(this, GetNextRequestHandle(), NULL, version); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, &WebDataService::SetBuiltinKeywordVersionImpl, 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////// 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Web Apps 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////// 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetWebAppImage(const GURL& app_url, 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const SkBitmap& image) { 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<GURL, SkBitmap>* request = 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest2<GURL, SkBitmap>(this, GetNextRequestHandle(), 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, app_url, image); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::SetWebAppImageImpl, 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetWebAppHasAllImages(const GURL& app_url, 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_all_images) { 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<GURL, bool>* request = 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest2<GURL, bool>(this, GetNextRequestHandle(), 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, app_url, has_all_images); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::SetWebAppHasAllImagesImpl, 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveWebApp(const GURL& app_url) { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<GURL>* request = 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<GURL>(this, GetNextRequestHandle(), NULL, app_url); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::RemoveWebAppImpl, 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetWebAppImages( 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& app_url, 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<GURL>* request = 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<GURL>(this, GetNextRequestHandle(), consumer, app_url); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::GetWebAppImagesImpl, 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Token Service 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WebDataService::SetTokenForService(const std::string& service, 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& token) { 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest2<std::string, std::string>* request = 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new GenericRequest2<std::string, std::string>( 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick this, GetNextRequestHandle(), NULL, service, token); 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterRequest(request); 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScheduleTask(NewRunnableMethod(this, &WebDataService::SetTokenForServiceImpl, 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request)); 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WebDataService::RemoveAllTokens() { 2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<std::string>* request = 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new GenericRequest<std::string>( 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick this, GetNextRequestHandle(), NULL, std::string()); 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterRequest(request); 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScheduleTask(NewRunnableMethod(this, 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &WebDataService::RemoveAllTokensImpl, 2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request)); 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Null on failure. Success is WDResult<std::string> 2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickWebDataService::Handle WebDataService::GetAllTokens( 2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebDataServiceConsumer* consumer) { 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<std::string>* request = 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new GenericRequest<std::string>( 2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick this, GetNextRequestHandle(), consumer, std::string()); 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RegisterRequest(request); 2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScheduleTask(NewRunnableMethod(this, 2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &WebDataService::GetAllTokensImpl, 2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request)); 2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return request->GetHandle(); 2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Password manager. 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::AddLogin(const PasswordForm& form) { 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<PasswordForm>* request = 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<PasswordForm>(this, GetNextRequestHandle(), NULL, 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form); 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::AddLoginImpl, 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::UpdateLogin(const PasswordForm& form) { 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<PasswordForm>* request = 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<PasswordForm>(this, GetNextRequestHandle(), 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, form); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::UpdateLoginImpl, 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveLogin(const PasswordForm& form) { 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<PasswordForm>* request = 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<PasswordForm>(this, GetNextRequestHandle(), NULL, 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::RemoveLoginImpl, 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveLoginsCreatedBetween(const Time& delete_begin, 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Time& delete_end) { 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<Time, Time>* request = 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest2<Time, Time>(this, 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetNextRequestHandle(), 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete_begin, 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete_end); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::RemoveLoginsCreatedBetweenImpl, request)); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveLoginsCreatedAfter(const Time& delete_begin) { 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RemoveLoginsCreatedBetween(delete_begin, Time()); 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetLogins( 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const PasswordForm& form, 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<PasswordForm>* request = 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<PasswordForm>(this, GetNextRequestHandle(), 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch consumer, form); 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::GetLoginsImpl, 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetAutofillableLogins( 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataRequest* request = 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WebDataRequest(this, GetNextRequestHandle(), consumer); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::GetAutofillableLoginsImpl, 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetBlacklistLogins( 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataRequest* request = 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WebDataRequest(this, GetNextRequestHandle(), consumer); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::GetBlacklistLoginsImpl, 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Autofill. 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::AddFormFields( 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<FormField>& fields) { 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<std::vector<FormField> >* request = 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<std::vector<FormField> >( 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, GetNextRequestHandle(), NULL, fields); 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::AddFormElementsImpl, 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetFormValuesForElementName( 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& name, const string16& prefix, int limit, 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataRequest* request = 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WebDataRequest(this, GetNextRequestHandle(), consumer); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::GetFormValuesForElementNameImpl, 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request, 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name, 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefix, 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch limit)); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveFormElementsAddedBetween(const Time& delete_begin, 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Time& delete_end) { 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<Time, Time>* request = 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest2<Time, Time>(this, 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetNextRequestHandle(), 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete_begin, 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete_end); 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::RemoveFormElementsAddedBetweenImpl, request)); 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveFormValueForElementName( 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& name, const string16& value) { 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<string16, string16>* request = 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest2<string16, string16>(this, 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetNextRequestHandle(), 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL, 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name, value); 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::RemoveFormValueForElementNameImpl, 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::AddAutofillProfile(const AutofillProfile& profile) { 397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenericRequest<AutofillProfile>* request = 398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new GenericRequest<AutofillProfile>( 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, GetNextRequestHandle(), NULL, profile); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &WebDataService::AddAutofillProfileImpl, 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::UpdateAutofillProfile(const AutofillProfile& profile) { 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenericRequest<AutofillProfile>* request = 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new GenericRequest<AutofillProfile>( 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, GetNextRequestHandle(), NULL, profile); 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &WebDataService::UpdateAutofillProfileImpl, 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::RemoveAutofillProfile(const std::string& guid) { 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GenericRequest<std::string>* request = 418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new GenericRequest<std::string>( 419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this, GetNextRequestHandle(), NULL, guid); 420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterRequest(request); 421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ScheduleTask(NewRunnableMethod(this, 422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &WebDataService::RemoveAutofillProfileImpl, 423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request)); 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenWebDataService::Handle WebDataService::GetAutofillProfiles( 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataRequest* request = 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WebDataRequest(this, GetNextRequestHandle(), consumer); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &WebDataService::GetAutofillProfilesImpl, 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::EmptyMigrationTrash(bool notify_sync) { 439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenericRequest<bool>* request = 440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new GenericRequest<bool>( 441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this, GetNextRequestHandle(), NULL, notify_sync); 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RegisterRequest(request); 443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleTask(NewRunnableMethod(this, 444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &WebDataService::EmptyMigrationTrashImpl, 445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request)); 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 448dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WebDataService::AddCreditCard(const CreditCard& credit_card) { 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<CreditCard>* request = 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<CreditCard>( 451513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch this, GetNextRequestHandle(), NULL, credit_card); 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 454dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &WebDataService::AddCreditCardImpl, 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WebDataService::UpdateCreditCard(const CreditCard& credit_card) { 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<CreditCard>* request = 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new GenericRequest<CreditCard>( 461513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch this, GetNextRequestHandle(), NULL, credit_card); 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &WebDataService::UpdateCreditCardImpl, 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WebDataService::RemoveCreditCard(const std::string& guid) { 469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GenericRequest<std::string>* request = 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new GenericRequest<std::string>( 471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this, GetNextRequestHandle(), NULL, guid); 472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterRequest(request); 473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ScheduleTask(NewRunnableMethod(this, 474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &WebDataService::RemoveCreditCardImpl, 475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request)); 476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::GetCreditCards( 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) { 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataRequest* request = 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WebDataRequest(this, GetNextRequestHandle(), consumer); 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RegisterRequest(request); 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask( 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::GetCreditCardsImpl, 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request)); 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->GetHandle(); 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetween( 491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const Time& delete_begin, 492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const Time& delete_end) { 493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GenericRequest2<Time, Time>* request = 494513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch new GenericRequest2<Time, Time>(this, 495513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch GetNextRequestHandle(), 496513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NULL, 497513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delete_begin, 498513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch delete_end); 499731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick RegisterRequest(request); 500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ScheduleTask(NewRunnableMethod( 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this, 502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl, 503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request)); 504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::~WebDataService() { 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (is_running_ && db_) { 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DLOG_ASSERT("WebDataService dtor called without Shutdown"); 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebDataService::InitWithPath(const FilePath& path) { 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch path_ = path; 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch is_running_ = true; 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::InitializeDatabaseIfNecessary)); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RequestCompleted(Handle h) { 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_lock_.Acquire(); 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch RequestMap::iterator i = pending_requests_.find(h); 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (i == pending_requests_.end()) { 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Request completed called for an unknown request"; 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_lock_.Release(); 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Take ownership of the request object and remove it from the map. 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<WebDataRequest> request(i->second); 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_requests_.erase(i); 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_lock_.Release(); 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify the consumer if needed. 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer; 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!request->IsCancelled() && (consumer = request->GetConsumer())) { 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch consumer->OnWebDataServiceRequestDone(request->GetHandle(), 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->GetResult()); 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Nobody is taken ownership of the result, either because it is canceled 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // or there is no consumer. Destroy results that require special handling. 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WDTypedResult const *result = request->GetResult(); 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result) { 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (result->GetType() == AUTOFILL_PROFILES_RESULT) { 545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const WDResult<std::vector<AutofillProfile*> >* r = 546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<const WDResult<std::vector<AutofillProfile*> >*>( 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result); 548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*> profiles = r->GetValue(); 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch STLDeleteElements(&profiles); 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (result->GetType() == AUTOFILL_CREDITCARDS_RESULT) { 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const WDResult<std::vector<CreditCard*> >* r = 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<const WDResult<std::vector<CreditCard*> >*>(result); 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<CreditCard*> credit_cards = r->GetValue(); 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch STLDeleteElements(&credit_cards); 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RegisterRequest(WebDataRequest* request) { 56272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock l(pending_lock_); 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pending_requests_[request->GetHandle()] = request; 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The following methods are executed in Chrome_WebDataThread. 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::DBInitFailed(sql::InitStatus init_status) { 573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ShowProfileErrorDialog( 574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (init_status == sql::INIT_FAILURE) ? 575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IDS_COULDNT_OPEN_PROFILE_ERROR : IDS_PROFILE_TOO_NEW_ERROR); 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::InitializeDatabaseIfNecessary() { 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ || failed_init_ || path_.empty()) 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // In the rare case where the db fails to initialize a dialog may get shown 5833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // that blocks the caller, yet allows other messages through. For this reason 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we only set db_ to the created database if creation is successful. That 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // way other methods won't do anything as db_ is still NULL. 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDatabase* db = new WebDatabase(); 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sql::InitStatus init_status = db->Init(path_); 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (init_status != sql::INIT_OK) { 5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LOG(ERROR) << "Cannot initialize the web database: " << init_status; 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch failed_init_ = true; 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete db; 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (main_loop_) { 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch main_loop_->PostTask(FROM_HERE, 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, &WebDataService::DBInitFailed, init_status)); 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::UI, FROM_HERE, 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, &WebDataService::NotifyDatabaseLoadedOnUIThread)); 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_ = db; 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_->BeginTransaction(); 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::NotifyDatabaseLoadedOnUIThread() { 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notify that the database has been initialized. 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify(NotificationType::WEB_DATABASE_LOADED, 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::NoDetails()); 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::ShutdownDatabase() { 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch should_commit_ = false; 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_) { 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_->CommitTransaction(); 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete db_; 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_ = NULL; 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::Commit() { 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (should_commit_) { 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch should_commit_ = false; 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_) { 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_->CommitTransaction(); 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_->BeginTransaction(); 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::ScheduleTask(Task* t) { 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (is_running_) 637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, t); 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Task scheduled after Shutdown()"; 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::ScheduleCommit() { 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (should_commit_ == false) { 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch should_commit_ = true; 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleTask(NewRunnableMethod(this, &WebDataService::Commit)); 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint WebDataService::GetNextRequestHandle() { 65072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::AutoLock l(pending_lock_); 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return ++next_request_handle_; 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keywords implementation. 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::AddKeywordImpl(GenericRequest<TemplateURL>* request) { 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetKeywordTable()->AddKeyword(request->GetArgument()); 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveKeywordImpl( 6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<TemplateURLID>* request) { 671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(request->GetArgument()); 674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetKeywordTable()->RemoveKeyword(request->GetArgument()); 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::UpdateKeywordImpl(GenericRequest<TemplateURL>* request) { 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetKeywordTable()->UpdateKeyword(request->GetArgument())) { 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 685513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 686513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetKeywordsImpl(WebDataRequest* request) { 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WDKeywordsResult result; 696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetKeywordTable()->GetKeywords(&result.keywords); 697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen result.default_search_provider_id = 698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetKeywordTable()->GetDefaulSearchProviderID(); 699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen result.builtin_keyword_version = 700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetKeywordTable()->GetBuitinKeywordVersion(); 701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result)); 703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetDefaultSearchProviderImpl( 7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<TemplateURLID>* request) { 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetKeywordTable()->SetDefaultSearchProviderID( 712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument())) { 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 714513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 715513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetBuiltinKeywordVersionImpl( 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<int>* request) { 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetKeywordTable()->SetBuitinKeywordVersion( 726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument())) { 727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 728513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 729513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Web Apps implementation. 738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetWebAppImageImpl( 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<GURL, SkBitmap>* request) { 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetWebAppsTable()->SetWebAppImage( 746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument1(), request->GetArgument2()); 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::SetWebAppHasAllImagesImpl( 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<GURL, bool>* request) { 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetWebAppsTable()->SetWebAppHasAllImages(request->GetArgument1(), 757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument2()); 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveWebAppImpl(GenericRequest<GURL>* request) { 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetWebAppsTable()->RemoveWebApp(request->GetArgument()); 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetWebAppImagesImpl(GenericRequest<GURL>* request) { 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WDAppImagesResult result; 776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen result.has_all_images = 777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetWebAppsTable()->GetWebAppHasAllImages(request->GetArgument()); 778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetWebAppsTable()->GetWebAppImages( 779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument(), &result.images); 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<WDAppImagesResult>(WEB_APP_IMAGES, result)); 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 7883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Token Service implementation. 7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 7903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// argument std::string is unused 7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WebDataService::RemoveAllTokensImpl( 7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<std::string>* request) { 7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitializeDatabaseIfNecessary(); 7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (db_ && !request->IsCancelled()) { 797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetTokenServiceTable()->RemoveAllTokens()) { 7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScheduleCommit(); 7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request->RequestComplete(); 8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WebDataService::SetTokenForServiceImpl( 8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest2<std::string, std::string>* request) { 8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitializeDatabaseIfNecessary(); 8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (db_ && !request->IsCancelled()) { 808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetTokenServiceTable()->SetTokenForService( 809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument1(), request->GetArgument2())) { 8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScheduleCommit(); 8113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request->RequestComplete(); 8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// argument is unused 8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid WebDataService::GetAllTokensImpl( 8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GenericRequest<std::string>* request) { 8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitializeDatabaseIfNecessary(); 8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (db_ && !request->IsCancelled()) { 8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::map<std::string, std::string> map; 822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetTokenServiceTable()->GetAllTokens(&map); 8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request->SetResult( 8243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new WDResult<std::map<std::string, std::string> >(TOKEN_RESULT, map)); 8253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick request->RequestComplete(); 8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick//////////////////////////////////////////////////////////////////////////////// 8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Password manager implementation. 832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::AddLoginImpl(GenericRequest<PasswordForm>* request) { 836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetLoginsTable()->AddLogin(request->GetArgument())) 839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::UpdateLoginImpl(GenericRequest<PasswordForm>* request) { 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetLoginsTable()->UpdateLogin(request->GetArgument())) 848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveLoginImpl(GenericRequest<PasswordForm>* request) { 854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetLoginsTable()->RemoveLogin(request->GetArgument())) 857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveLoginsCreatedBetweenImpl( 863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<Time, Time>* request) { 864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetLoginsTable()->RemoveLoginsCreatedBetween( 867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument1(), request->GetArgument2())) { 868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetLoginsImpl(GenericRequest<PasswordForm>* request) { 875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> forms; 878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetLoginsTable()->GetLogins(request->GetArgument(), &forms); 879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<std::vector<PasswordForm*> >(PASSWORD_RESULT, forms)); 881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetAutofillableLoginsImpl(WebDataRequest* request) { 886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> forms; 889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetLoginsTable()->GetAllLogins(&forms, false); 890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<std::vector<PasswordForm*> >(PASSWORD_RESULT, forms)); 892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetBlacklistLoginsImpl(WebDataRequest* request) { 897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> all_forms; 900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetLoginsTable()->GetAllLogins(&all_forms, true); 901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<PasswordForm*> blacklist_forms; 902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::vector<PasswordForm*>::iterator i = all_forms.begin(); 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != all_forms.end(); ++i) { 904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<PasswordForm> form(*i); 905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (form->blacklisted_by_user) { 906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch blacklist_forms.push_back(form.release()); 907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch all_forms.clear(); 910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<std::vector<PasswordForm*> >(PASSWORD_RESULT, 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch blacklist_forms)); 913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Autofill implementation. 920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::AddFormElementsImpl( 924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<std::vector<FormField> >* request) { 925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<FormField>& form_fields = request->GetArgument(); 927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChangeList changes; 929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->AddFormFieldValues(form_fields, &changes)) { 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 931513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 932513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<AutofillChangeList>(AUTOFILL_CHANGES, changes)); 935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Post the notifications including the list of affected keys. 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is sent here so that work resulting from this notification will be 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // done on the DB thread, and not the UI thread. 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_ENTRIES_CHANGED, 942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<AutofillChangeList>(&changes)); 944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetFormValuesForElementNameImpl(WebDataRequest* request, 950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& name, const string16& prefix, int limit) { 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<string16> values; 954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetAutofillTable()->GetFormValuesForElementName( 955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen name, prefix, &values, limit); 956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<std::vector<string16> >(AUTOFILL_VALUE_RESULT, values)); 958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveFormElementsAddedBetweenImpl( 963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<Time, Time>* request) { 964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChangeList changes; 967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetAutofillTable()->RemoveFormElementsAddedBetween( 968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument1(), request->GetArgument2(), &changes)) { 969dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!changes.empty()) { 970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<AutofillChangeList>(AUTOFILL_CHANGES, changes)); 972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Post the notifications including the list of affected keys. 974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is sent here so that work resulting from this notification 975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // will be done on the DB thread, and not the UI thread. 976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_ENTRIES_CHANGED, 978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<AutofillChangeList>(&changes)); 980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::RemoveFormValueForElementNameImpl( 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest2<string16, string16>* request) { 989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& name = request->GetArgument1(); 992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& value = request->GetArgument2(); 993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetAutofillTable()->RemoveFormElement(name, value)) { 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChangeList changes; 996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch changes.push_back(AutofillChange(AutofillChange::REMOVE, 997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillKey(name, value))); 998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<AutofillChangeList>(AUTOFILL_CHANGES, changes)); 1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Post the notifications including the list of affected keys. 1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_ENTRIES_CHANGED, 1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Details<AutofillChangeList>(&changes)); 1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::AddAutofillProfileImpl( 1013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenericRequest<AutofillProfile>* request) { 1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 1016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const AutofillProfile& profile = request->GetArgument(); 1017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->AddAutofillProfile(profile)) { 1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1023513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Send GUID-based notification. 1024dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillProfileChange change(AutofillProfileChange::ADD, 1025dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile.guid(), &profile); 1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_PROFILE_CHANGED, 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 1029dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<AutofillProfileChange>(&change)); 1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::UpdateAutofillProfileImpl( 1035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenericRequest<AutofillProfile>* request) { 1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 1038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const AutofillProfile& profile = request->GetArgument(); 1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1040513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Only perform the update if the profile exists. It is currently 1041513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // valid to try to update a missing profile. We simply drop the write and 1042513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the caller will detect this on the next refresh. 1043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* original_profile = NULL; 1044ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->GetAutofillProfile(profile.guid(), 1045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &original_profile)) { 1046513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch request->RequestComplete(); 1047513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1049ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<AutofillProfile> scoped_profile(original_profile); 1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1051ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->UpdateAutofillProfileMulti(profile)) { 1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1053513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1054513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 1055513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ScheduleCommit(); 1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Send GUID-based notification. 1058dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillProfileChange change(AutofillProfileChange::UPDATE, 1059dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile.guid(), &profile); 1060513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationService::current()->Notify( 1061513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationType::AUTOFILL_PROFILE_CHANGED, 1062513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<WebDataService>(this), 1063dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<AutofillProfileChange>(&change)); 1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::RemoveAutofillProfileImpl( 1069731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GenericRequest<std::string>* request) { 1070731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitializeDatabaseIfNecessary(); 1071731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (db_ && !request->IsCancelled()) { 1072731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string guid = request->GetArgument(); 1073513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1074ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile = NULL; 1075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->GetAutofillProfile(guid, &profile)) { 1076731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTREACHED(); 1077513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1078513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 1079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<AutofillProfile> scoped_profile(profile); 1080731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->RemoveAutofillProfile(guid)) { 1082513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NOTREACHED(); 1083513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1084731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1085513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ScheduleCommit(); 1086513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1087513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Send GUID-based notification. 1088dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillProfileChange change(AutofillProfileChange::REMOVE, guid, NULL); 1089513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationService::current()->Notify( 1090513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationType::AUTOFILL_PROFILE_CHANGED, 1091513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<WebDataService>(this), 1092dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<AutofillProfileChange>(&change)); 1093731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1094731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request->RequestComplete(); 1095731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1096731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::GetAutofillProfilesImpl(WebDataRequest* request) { 1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 1099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 1100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*> profiles; 1101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetAutofillTable()->GetAutofillProfiles(&profiles); 1102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 1103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new WDResult<std::vector<AutofillProfile*> >(AUTOFILL_PROFILES_RESULT, 1104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profiles)); 1105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::EmptyMigrationTrashImpl( 1110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GenericRequest<bool>* request) { 1111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitializeDatabaseIfNecessary(); 1112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_ && !request->IsCancelled()) { 1113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool notify_sync = request->GetArgument(); 1114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (notify_sync) { 1115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> guids; 1116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->GetAutofillProfilesInTrash(&guids)) { 1117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 1119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<std::string>::const_iterator iter = guids.begin(); 1122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != guids.end(); ++iter) { 1123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Send GUID-based notification. 1124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfileChange change(AutofillProfileChange::REMOVE, 1125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *iter, NULL); 1126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::current()->Notify( 1127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::AUTOFILL_PROFILE_CHANGED, 1128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<WebDataService>(this), 1129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Details<AutofillProfileChange>(&change)); 1130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If we trashed any profiles they may have been merged, so send out 1133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // update notifications as well. 1134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!guids.empty()) { 1135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*> profiles; 1136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetAutofillTable()->GetAutofillProfiles(&profiles); 1137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<AutofillProfile*>::const_iterator 1138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter = profiles.begin(); 1139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != profiles.end(); ++iter) { 1140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfileChange change(AutofillProfileChange::UPDATE, 1141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (*iter)->guid(), *iter); 1142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::current()->Notify( 1143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::AUTOFILL_PROFILE_CHANGED, 1144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<WebDataService>(this), 1145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Details<AutofillProfileChange>(&change)); 1146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen STLDeleteElements(&profiles); 1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->EmptyAutofillProfilesTrash()) { 1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 1154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScheduleCommit(); 1156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->RequestComplete(); 1158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WebDataService::AddCreditCardImpl( 1161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<CreditCard>* request) { 1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 1163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 1164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const CreditCard& credit_card = request->GetArgument(); 1165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->AddCreditCard(credit_card)) { 1166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 1169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 1170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Send GUID-based notification. 1172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillCreditCardChange change(AutofillCreditCardChange::ADD, 1173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen credit_card.guid(), &credit_card); 1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 1175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType::AUTOFILL_CREDIT_CARD_CHANGED, 1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 1177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<AutofillCreditCardChange>(&change)); 1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WebDataService::UpdateCreditCardImpl( 1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GenericRequest<CreditCard>* request) { 1184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 1186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const CreditCard& credit_card = request->GetArgument(); 1187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // It is currently valid to try to update a missing profile. We simply drop 1189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // the write and the caller will detect this on the next refresh. 1190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CreditCard* original_credit_card = NULL; 1191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->GetCreditCard(credit_card.guid(), 1192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &original_credit_card)) { 1193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch request->RequestComplete(); 1194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 1196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch scoped_ptr<CreditCard> scoped_credit_card(original_credit_card); 1197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->UpdateCreditCard(credit_card)) { 1199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 1202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ScheduleCommit(); 1203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Send GUID-based notification. 1205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillCreditCardChange change(AutofillCreditCardChange::UPDATE, 1206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen credit_card.guid(), &credit_card); 1207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 1208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType::AUTOFILL_CREDIT_CARD_CHANGED, 1209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(this), 1210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<AutofillCreditCardChange>(&change)); 1211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request->RequestComplete(); 1213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid WebDataService::RemoveCreditCardImpl( 1216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GenericRequest<std::string>* request) { 1217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitializeDatabaseIfNecessary(); 1218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (db_ && !request->IsCancelled()) { 1219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string guid = request->GetArgument(); 1220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->GetAutofillTable()->RemoveCreditCard(guid)) { 1221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 1222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return; 1223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ScheduleCommit(); 1225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Send GUID-based notification. 1227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillCreditCardChange change(AutofillCreditCardChange::REMOVE, 1228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen guid, NULL); 1229513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch NotificationService::current()->Notify( 1230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType::AUTOFILL_CREDIT_CARD_CHANGED, 1231513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<WebDataService>(this), 1232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<AutofillCreditCardChange>(&change)); 1233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::GetCreditCardsImpl(WebDataRequest* request) { 1238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitializeDatabaseIfNecessary(); 1239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (db_ && !request->IsCancelled()) { 1240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::vector<CreditCard*> credit_cards; 1241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetAutofillTable()->GetCreditCards(&credit_cards); 1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->SetResult( 1243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new WDResult<std::vector<CreditCard*> >(AUTOFILL_CREDITCARDS_RESULT, 1244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch credit_cards)); 1245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch request->RequestComplete(); 1247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WebDataService::RemoveAutofillProfilesAndCreditCardsModifiedBetweenImpl( 1250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GenericRequest2<Time, Time>* request) { 1251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitializeDatabaseIfNecessary(); 1252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (db_ && !request->IsCancelled()) { 1253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> profile_guids; 1254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string> credit_card_guids; 1255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->GetAutofillTable()-> 1256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RemoveAutofillProfilesAndCreditCardsModifiedBetween( 1257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request->GetArgument1(), 1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->GetArgument2(), 1259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &profile_guids, 1260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &credit_card_guids)) { 1261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<std::string>::iterator iter = profile_guids.begin(); 1262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != profile_guids.end(); ++iter) { 1263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfileChange change(AutofillProfileChange::REMOVE, *iter, 1264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NULL); 1265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::current()->Notify( 1266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::AUTOFILL_PROFILE_CHANGED, 1267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<WebDataService>(this), 1268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Details<AutofillProfileChange>(&change)); 1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<std::string>::iterator iter = credit_card_guids.begin(); 1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != credit_card_guids.end(); ++iter) { 1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillCreditCardChange change(AutofillCreditCardChange::REMOVE, 1274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *iter, NULL); 1275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationService::current()->Notify( 1276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType::AUTOFILL_CREDIT_CARD_CHANGED, 1277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<WebDataService>(this), 1278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Details<AutofillCreditCardChange>(&change)); 1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Note: It is the caller's responsibility to post notifications for any 1281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // changes, e.g. by calling the Refresh() method of PersonalDataManager. 1282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ScheduleCommit(); 1283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request->RequestComplete(); 1286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 1289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WebDataRequest implementation. 1291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 1293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1294c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::WebDataRequest::WebDataRequest(WebDataService* service, 1295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Handle handle, 1296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceConsumer* consumer) 1297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : service_(service), 1298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle_(handle), 1299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch canceled_(false), 1300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch consumer_(consumer), 1301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result_(NULL) { 1302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_ = MessageLoop::current(); 1303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1305c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::WebDataRequest::~WebDataRequest() { 1306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete result_; 1307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1309c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataService::Handle WebDataService::WebDataRequest::GetHandle() const { 1310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return handle_; 1311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1313c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWebDataServiceConsumer* WebDataService::WebDataRequest::GetConsumer() const { 1314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return consumer_; 1315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WebDataService::WebDataRequest::IsCancelled() const { 1318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return canceled_; 1319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::WebDataRequest::Cancel() { 1322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch canceled_ = true; 1323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch consumer_ = NULL; 1324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::WebDataRequest::SetResult(WDTypedResult* r) { 1327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result_ = r; 1328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst WDTypedResult* WebDataService::WebDataRequest::GetResult() const { 1331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result_; 1332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WebDataService::WebDataRequest::RequestComplete() { 1335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataService* s = service_; 1336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Task* t = NewRunnableMethod(s, 1337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &WebDataService::RequestCompleted, 1338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle_); 1339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_->PostTask(FROM_HERE, t); 1340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1341