15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/keyword_table.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/logins_table.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_apps_table.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_intents_table.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/webdata/token_service_table.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_service.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDataService implementation.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Bind;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WDAppImagesResult::WDAppImagesResult() : has_all_images(false) {}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WDAppImagesResult::~WDAppImagesResult() {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WDKeywordsResult::WDKeywordsResult()
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : default_search_provider_id(0),
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    builtin_keyword_version(0) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WDKeywordsResult::~WDKeywordsResult() {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochWebDataService::KeywordBatchModeScoper::KeywordBatchModeScoper(
45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    WebDataService* service)
46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : service_(service) {
47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (service_)
48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    service_->AdjustKeywordBatchModeLevel(true);
49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochWebDataService::KeywordBatchModeScoper::~KeywordBatchModeScoper() {
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (service_)
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    service_->AdjustKeywordBatchModeLevel(false);
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataService::WebDataService(scoped_refptr<WebDatabaseService> wdbs,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const ProfileErrorCallback& callback)
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : WebDataServiceBase(
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          wdbs, callback,
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keyword_batch_mode_level_(0) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keywords.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::AddKeyword(const TemplateURLData& data) {
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (keyword_batch_mode_level_) {
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    queued_keyword_operations_.push_back(
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        KeywordTable::Operation(KeywordTable::ADD, data));
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else {
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AdjustKeywordBatchModeLevel(true);
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AddKeyword(data);
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AdjustKeywordBatchModeLevel(false);
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::RemoveKeyword(TemplateURLID id) {
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (keyword_batch_mode_level_) {
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    TemplateURLData data;
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    data.id = id;
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    queued_keyword_operations_.push_back(
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        KeywordTable::Operation(KeywordTable::REMOVE, data));
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else {
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AdjustKeywordBatchModeLevel(true);
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    RemoveKeyword(id);
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AdjustKeywordBatchModeLevel(false);
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::UpdateKeyword(const TemplateURLData& data) {
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (keyword_batch_mode_level_) {
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    queued_keyword_operations_.push_back(
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        KeywordTable::Operation(KeywordTable::UPDATE, data));
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else {
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AdjustKeywordBatchModeLevel(true);
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    UpdateKeyword(data);
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    AdjustKeywordBatchModeLevel(false);
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceBase::Handle WebDataService::GetKeywords(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebDataServiceConsumer* consumer) {
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return wdbs_->ScheduleDBTaskWithResult(
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FROM_HERE, Bind(&WebDataService::GetKeywordsImpl, this), consumer);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebDataService::SetDefaultSearchProviderID(TemplateURLID id) {
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  wdbs_->ScheduleDBTask(
113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FROM_HERE,
114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      Bind(&WebDataService::SetDefaultSearchProviderIDImpl, this, id));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::SetBuiltinKeywordVersion(int version) {
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  wdbs_->ScheduleDBTask(
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FROM_HERE,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Bind(&WebDataService::SetBuiltinKeywordVersionImpl, this, version));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Web Apps
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::SetWebAppImage(const GURL& app_url,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const SkBitmap& image) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Bind(&WebDataService::SetWebAppImageImpl, this, app_url, image));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::SetWebAppHasAllImages(const GURL& app_url,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           bool has_all_images) {
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Bind(&WebDataService::SetWebAppHasAllImagesImpl, this, app_url,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           has_all_images));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebDataService::RemoveWebApp(const GURL& app_url) {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  wdbs_->ScheduleDBTask(FROM_HERE,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Bind(&WebDataService::RemoveWebAppImpl, this, app_url));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataServiceBase::Handle WebDataService::GetWebAppImages(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& app_url, WebDataServiceConsumer* consumer) {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return wdbs_->ScheduleDBTaskWithResult(FROM_HERE,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Bind(&WebDataService::GetWebAppImagesImpl, this, app_url), consumer);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataService::WebDataService()
156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : WebDataServiceBase(
157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          NULL, ProfileErrorCallback(),
158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      keyword_batch_mode_level_(0) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDataService::~WebDataService() {
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(!keyword_batch_mode_level_);
164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid WebDataService::AdjustKeywordBatchModeLevel(bool entering_batch_mode) {
167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (entering_batch_mode) {
168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ++keyword_batch_mode_level_;
169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  } else {
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    DCHECK(keyword_batch_mode_level_);
171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    --keyword_batch_mode_level_;
172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (!keyword_batch_mode_level_ && !queued_keyword_operations_.empty()) {
173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      wdbs_->ScheduleDBTask(
174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          FROM_HERE,
175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          Bind(&WebDataService::PerformKeywordOperationsImpl, this,
176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch               queued_keyword_operations_));
177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      queued_keyword_operations_.clear();
178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
179e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keywords implementation.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochWebDatabase::State WebDataService::PerformKeywordOperationsImpl(
189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const KeywordTable::Operations& operations,
190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    WebDatabase* db) {
191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return KeywordTable::FromWebDatabase(db)->PerformOperations(operations) ?
192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<WDTypedResult> WebDataService::GetKeywordsImpl(WebDatabase* db) {
196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<WDTypedResult> result_ptr;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WDKeywordsResult result;
198e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (KeywordTable::FromWebDatabase(db)->GetKeywords(&result.keywords)) {
199e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    result.default_search_provider_id =
200e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        KeywordTable::FromWebDatabase(db)->GetDefaultSearchProviderID();
201e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    result.builtin_keyword_version =
202e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        KeywordTable::FromWebDatabase(db)->GetBuiltinKeywordVersion();
203e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    result_ptr.reset(new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
205e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return result_ptr.Pass();
206e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
207e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
208e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochWebDatabase::State WebDataService::SetDefaultSearchProviderIDImpl(
209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    TemplateURLID id,
210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    WebDatabase* db) {
211e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return KeywordTable::FromWebDatabase(db)->SetDefaultSearchProviderID(id) ?
212e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDatabase::State WebDataService::SetBuiltinKeywordVersionImpl(
216e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    int version,
217e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    WebDatabase* db) {
218e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  return KeywordTable::FromWebDatabase(db)->SetBuiltinKeywordVersion(version) ?
219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Web Apps implementation.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDatabase::State WebDataService::SetWebAppImageImpl(
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& app_url, const SkBitmap& image, WebDatabase* db) {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebAppsTable::FromWebDatabase(db)->SetWebAppImage(app_url, image);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebDatabase::COMMIT_NEEDED;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDatabase::State WebDataService::SetWebAppHasAllImagesImpl(
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& app_url, bool has_all_images, WebDatabase* db) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebAppsTable::FromWebDatabase(db)->SetWebAppHasAllImages(app_url,
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                           has_all_images);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebDatabase::COMMIT_NEEDED;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebDatabase::State WebDataService::RemoveWebAppImpl(
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& app_url, WebDatabase* db) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebAppsTable::FromWebDatabase(db)->RemoveWebApp(app_url);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebDatabase::COMMIT_NEEDED;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<WDTypedResult> WebDataService::GetWebAppImagesImpl(
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& app_url, WebDatabase* db) {
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WDAppImagesResult result;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result.has_all_images =
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebAppsTable::FromWebDatabase(db)->GetWebAppHasAllImages(app_url);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebAppsTable::FromWebDatabase(db)->GetWebAppImages(app_url, &result.images);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scoped_ptr<WDTypedResult>(
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new WDResult<WDAppImagesResult>(WEB_APP_IMAGES, result));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
256