1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/search_engines/chrome_template_url_service_client.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/history/history_notifications.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/history/history_service.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/history/history_service_factory.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/notification_details.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/notification_source.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/common/constants.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeTemplateURLServiceClient::ChromeTemplateURLServiceClient(Profile* profile)
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : profile_(profile),
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      owner_(NULL) {
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(profile);
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Register for notifications.
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(sky): bug 1166191. The keywords should be moved into the history
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // db, which will mean we no longer need this notification and the history
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // backend can handle automatically adding the search terms as the user
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // navigates.
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::Source<Profile> profile_source(profile->GetOriginalProfile());
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  notification_registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URL_VISITED,
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              profile_source);
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeTemplateURLServiceClient::~ChromeTemplateURLServiceClient() {
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeTemplateURLServiceClient::SetOwner(TemplateURLService* owner) {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!owner_);
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  owner_ = owner;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeTemplateURLServiceClient::DeleteAllSearchTermsForKeyword(
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TemplateURLID id) {
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HistoryService* history_service =
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (history_service)
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    history_service->DeleteAllSearchTermsForKeyword(id);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeTemplateURLServiceClient::SetKeywordSearchTermsForURL(
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& url,
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TemplateURLID id,
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::string16& term) {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HistoryService* history_service =
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (history_service)
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    history_service->SetKeywordSearchTermsForURL(url, id, term);
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeTemplateURLServiceClient::AddKeywordGeneratedVisit(const GURL& url) {
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  HistoryService* history_service =
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      HistoryServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (history_service)
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    history_service->AddPage(url, base::Time::Now(), NULL, 0, GURL(),
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             history::RedirectList(),
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             ui::PAGE_TRANSITION_KEYWORD_GENERATED,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             history::SOURCE_BROWSED, false);
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ChromeTemplateURLServiceClient::RestoreExtensionInfoIfNecessary(
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TemplateURL* template_url) {
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const TemplateURLData& data = template_url->data();
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GURL url(data.url());
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (url.SchemeIs(extensions::kExtensionScheme)) {
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const std::string& extension_id = url.host();
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    template_url->set_extension_info(make_scoped_ptr(
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        new TemplateURL::AssociatedExtensionInfo(
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            TemplateURL::OMNIBOX_API_EXTENSION, extension_id)));
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ChromeTemplateURLServiceClient::Observe(
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int type,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::NotificationSource& source,
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::NotificationDetails& details) {
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_EQ(type, chrome::NOTIFICATION_HISTORY_URL_VISITED);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!owner_)
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::Details<history::URLVisitedDetails> history_details(details);
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TemplateURLService::URLVisitedDetails visited_details;
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  visited_details.url = history_details->row.url();
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  visited_details.is_keyword_transition =
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PageTransitionStripQualifier(history_details->transition) ==
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PAGE_TRANSITION_KEYWORD;
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  owner_->OnHistoryURLVisited(visited_details);
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
97