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