settings_api_bubble_helper_views.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1// Copyright (c) 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/views/settings_api_bubble_helper_views.h"
6
7#include "chrome/browser/extensions/settings_api_bubble_controller.h"
8#include "chrome/browser/profiles/profile.h"
9#include "chrome/browser/ui/browser.h"
10#include "chrome/browser/ui/browser_finder.h"
11#include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h"
12#include "chrome/browser/ui/views/frame/browser_view.h"
13#include "chrome/browser/ui/views/settings_api_bubble_helper_views.h"
14#include "chrome/browser/ui/views/toolbar/home_button.h"
15#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
16#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
17#include "content/public/browser/browser_context.h"
18#include "extensions/browser/extension_registry.h"
19
20namespace {
21
22void ShowSettingsApiBubble(extensions::SettingsApiOverrideType type,
23                           const std::string& extension_id,
24                           Profile* profile,
25                           views::View* anchor_view,
26                           views::BubbleBorder::Arrow arrow) {
27  scoped_ptr<extensions::SettingsApiBubbleController> settings_api_bubble(
28      new extensions::SettingsApiBubbleController(profile, type));
29  if (!settings_api_bubble->ShouldShow(extension_id))
30    return;
31
32  extensions::SettingsApiBubbleController* controller =
33      settings_api_bubble.get();
34  extensions::ExtensionMessageBubbleView* bubble_delegate =
35      new extensions::ExtensionMessageBubbleView(
36          anchor_view,
37          arrow,
38          settings_api_bubble.PassAs<
39              extensions::ExtensionMessageBubbleController>());
40  views::BubbleDelegateView::CreateBubble(bubble_delegate);
41  controller->Show(bubble_delegate);
42}
43
44}  // namespace
45
46namespace extensions {
47
48void MaybeShowExtensionControlledHomeNotification(Browser* browser) {
49#if !defined(OS_WIN)
50  return;
51#endif
52
53  const Extension* extension = OverridesHomepage(browser->profile(), NULL);
54  if (extension) {
55    // The bubble will try to anchor itself against the home button
56    views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser)->
57        toolbar()->home_button();
58    ShowSettingsApiBubble(BUBBLE_TYPE_HOME_PAGE,
59                          extension->id(),
60                          browser->profile(),
61                          anchor_view,
62                          views::BubbleBorder::TOP_LEFT);
63  }
64}
65
66void MaybeShowExtensionControlledSearchNotification(
67    Profile* profile,
68    content::WebContents* web_contents,
69    const AutocompleteMatch& match) {
70#if !defined(OS_WIN)
71  return;
72#endif
73
74  if (match.provider &&
75      match.provider->type() == AutocompleteProvider::TYPE_SEARCH) {
76    const extensions::Extension* extension =
77        OverridesSearchEngine(profile, NULL);
78    if (extension) {
79      ToolbarView* toolbar =
80          BrowserView::GetBrowserViewForBrowser(
81              chrome::FindBrowserWithWebContents(web_contents))->toolbar();
82      ShowSettingsApiBubble(BUBBLE_TYPE_SEARCH_ENGINE,
83                            extension->id(),
84                            profile,
85                            toolbar->app_menu(),
86                            views::BubbleBorder::TOP_RIGHT);
87    }
88  }
89}
90
91const extensions::SettingsOverrides* FindOverridingExtension(
92    content::BrowserContext* browser_context,
93    SettingsApiOverrideType type,
94    const Extension** extension) {
95  const extensions::ExtensionSet& extensions =
96      extensions::ExtensionRegistry::Get(browser_context)->enabled_extensions();
97
98  for (extensions::ExtensionSet::const_iterator it = extensions.begin();
99       it != extensions.end();
100       ++it) {
101    const extensions::SettingsOverrides* settings =
102        extensions::SettingsOverrides::Get(*it);
103    if (settings) {
104      if ((type == BUBBLE_TYPE_HOME_PAGE && settings->homepage) ||
105          (type == BUBBLE_TYPE_STARTUP_PAGES &&
106              !settings->startup_pages.empty()) ||
107          (type == BUBBLE_TYPE_SEARCH_ENGINE && settings->search_engine)) {
108        *extension = *it;
109        return settings;
110      }
111    }
112  }
113
114  return NULL;
115}
116
117const Extension* OverridesHomepage(content::BrowserContext* browser_context,
118                                   GURL* home_page_url) {
119  const extensions::Extension* extension = NULL;
120  const extensions::SettingsOverrides* settings =
121      FindOverridingExtension(
122          browser_context, BUBBLE_TYPE_HOME_PAGE, &extension);
123  if (settings && home_page_url)
124    *home_page_url = *settings->homepage;
125  return extension;
126}
127
128const Extension* OverridesStartupPages(content::BrowserContext* browser_context,
129                                       std::vector<GURL>* startup_pages) {
130  const extensions::Extension* extension = NULL;
131  const extensions::SettingsOverrides* settings =
132      FindOverridingExtension(
133          browser_context, BUBBLE_TYPE_STARTUP_PAGES, &extension);
134  if (settings && startup_pages) {
135    startup_pages->clear();
136    for (std::vector<GURL>::const_iterator it = settings->startup_pages.begin();
137         it != settings->startup_pages.end();
138         ++it)
139      startup_pages->push_back(GURL(*it));
140  }
141  return extension;
142}
143
144const Extension* OverridesSearchEngine(
145    content::BrowserContext* browser_context,
146    api::manifest_types::ChromeSettingsOverrides::Search_provider*
147        search_provider) {
148  const extensions::Extension* extension = NULL;
149  const extensions::SettingsOverrides* settings =
150      FindOverridingExtension(
151          browser_context, BUBBLE_TYPE_SEARCH_ENGINE, &extension);
152  if (settings && search_provider)
153    search_provider = settings->search_engine.get();
154  return extension;
155}
156
157}  // namespace extensions
158