• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/ntp_overridden_bubble_controller.h"
8 #include "chrome/browser/extensions/settings_api_bubble_controller.h"
9 #include "chrome/browser/extensions/settings_api_helpers.h"
10 #include "chrome/browser/ui/browser_finder.h"
11 #include "chrome/browser/ui/tabs/tab_strip_model.h"
12 #include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h"
13 #include "chrome/browser/ui/views/frame/browser_view.h"
14 #include "chrome/browser/ui/views/settings_api_bubble_helper_views.h"
15 #include "chrome/browser/ui/views/toolbar/home_button.h"
16 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
17 #include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
18 #include "chrome/common/url_constants.h"
19 #include "content/public/browser/browser_url_handler.h"
20 #include "content/public/browser/navigation_entry.h"
21 
22 namespace extensions {
23 
24 namespace {
25 
ShowSettingsApiBubble(SettingsApiOverrideType type,const std::string & extension_id,Profile * profile,views::View * anchor_view,views::BubbleBorder::Arrow arrow)26 void ShowSettingsApiBubble(SettingsApiOverrideType type,
27                            const std::string& extension_id,
28                            Profile* profile,
29                            views::View* anchor_view,
30                            views::BubbleBorder::Arrow arrow) {
31   scoped_ptr<SettingsApiBubbleController> settings_api_bubble(
32       new SettingsApiBubbleController(profile, type));
33   if (!settings_api_bubble->ShouldShow(extension_id))
34     return;
35 
36   SettingsApiBubbleController* controller = settings_api_bubble.get();
37   ExtensionMessageBubbleView* bubble_delegate =
38       new ExtensionMessageBubbleView(
39           anchor_view,
40           arrow,
41           settings_api_bubble.PassAs<
42               ExtensionMessageBubbleController>());
43   views::BubbleDelegateView::CreateBubble(bubble_delegate);
44   controller->Show(bubble_delegate);
45 }
46 
47 }  // namespace
48 
MaybeShowExtensionControlledHomeNotification(Browser * browser)49 void MaybeShowExtensionControlledHomeNotification(Browser* browser) {
50 #if !defined(OS_WIN)
51   return;
52 #endif
53 
54   const Extension* extension =
55       GetExtensionOverridingHomepage(browser->profile());
56   if (extension) {
57     // The bubble will try to anchor itself against the home button
58     views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser)->
59         toolbar()->home_button();
60     ShowSettingsApiBubble(BUBBLE_TYPE_HOME_PAGE,
61                           extension->id(),
62                           browser->profile(),
63                           anchor_view,
64                           views::BubbleBorder::TOP_LEFT);
65   }
66 }
67 
MaybeShowExtensionControlledSearchNotification(Profile * profile,content::WebContents * web_contents,const AutocompleteMatch & match)68 void MaybeShowExtensionControlledSearchNotification(
69     Profile* profile,
70     content::WebContents* web_contents,
71     const AutocompleteMatch& match) {
72 #if !defined(OS_WIN)
73   return;
74 #endif
75 
76   if (AutocompleteMatch::IsSearchType(match.type) &&
77       match.type != AutocompleteMatchType::SEARCH_OTHER_ENGINE) {
78     const Extension* extension = GetExtensionOverridingSearchEngine(profile);
79     if (extension) {
80       ToolbarView* toolbar =
81           BrowserView::GetBrowserViewForBrowser(
82               chrome::FindBrowserWithWebContents(web_contents))->toolbar();
83       ShowSettingsApiBubble(BUBBLE_TYPE_SEARCH_ENGINE,
84                             extension->id(),
85                             profile,
86                             toolbar->app_menu(),
87                             views::BubbleBorder::TOP_RIGHT);
88     }
89   }
90 }
91 
MaybeShowExtensionControlledNewTabPage(Browser * browser,content::WebContents * web_contents)92 void MaybeShowExtensionControlledNewTabPage(
93     Browser* browser, content::WebContents* web_contents) {
94 #if !defined(OS_WIN)
95   return;
96 #endif
97 
98   content::NavigationEntry* entry =
99       web_contents->GetController().GetActiveEntry();
100   if (!entry)
101     return;
102   GURL active_url = entry->GetURL();
103   if (!active_url.SchemeIs("chrome-extension"))
104     return;  // Not a URL that we care about.
105 
106   // See if the current active URL matches a transformed NewTab URL.
107   GURL ntp_url(chrome::kChromeUINewTabURL);
108   bool ignored_param;
109   content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(
110       &ntp_url,
111       web_contents->GetBrowserContext(),
112       &ignored_param);
113   if (ntp_url != active_url)
114     return;  // Not being overridden by an extension.
115 
116   scoped_ptr<NtpOverriddenBubbleController> ntp_overridden_bubble(
117       new NtpOverriddenBubbleController(browser->profile()));
118   if (!ntp_overridden_bubble->ShouldShow(ntp_url.host()))
119     return;
120 
121   NtpOverriddenBubbleController* controller = ntp_overridden_bubble.get();
122   ExtensionMessageBubbleView* bubble_delegate =
123       new ExtensionMessageBubbleView(
124           BrowserView::GetBrowserViewForBrowser(browser)->toolbar()->app_menu(),
125           views::BubbleBorder::TOP_RIGHT,
126           ntp_overridden_bubble.PassAs<
127               ExtensionMessageBubbleController>());
128   views::BubbleDelegateView::CreateBubble(bubble_delegate);
129   controller->Show(bubble_delegate);
130 }
131 
132 }  // namespace extensions
133