Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / settings_api_bubble_helper_views.cc
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
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 = new ExtensionMessageBubbleView(
38       anchor_view, arrow, settings_api_bubble.Pass());
39   views::BubbleDelegateView::CreateBubble(bubble_delegate);
40   controller->Show(bubble_delegate);
41 }
42
43 }  // namespace
44
45 void MaybeShowExtensionControlledHomeNotification(Browser* browser) {
46 #if !defined(OS_WIN)
47   return;
48 #endif
49
50   const Extension* extension =
51       GetExtensionOverridingHomepage(browser->profile());
52   if (extension) {
53     // The bubble will try to anchor itself against the home button
54     views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser)->
55         toolbar()->home_button();
56     ShowSettingsApiBubble(BUBBLE_TYPE_HOME_PAGE,
57                           extension->id(),
58                           browser->profile(),
59                           anchor_view,
60                           views::BubbleBorder::TOP_LEFT);
61   }
62 }
63
64 void MaybeShowExtensionControlledSearchNotification(
65     Profile* profile,
66     content::WebContents* web_contents,
67     const AutocompleteMatch& match) {
68 #if !defined(OS_WIN)
69   return;
70 #endif
71
72   if (AutocompleteMatch::IsSearchType(match.type) &&
73       match.type != AutocompleteMatchType::SEARCH_OTHER_ENGINE) {
74     const Extension* extension = GetExtensionOverridingSearchEngine(profile);
75     if (extension) {
76       ToolbarView* toolbar =
77           BrowserView::GetBrowserViewForBrowser(
78               chrome::FindBrowserWithWebContents(web_contents))->toolbar();
79       ShowSettingsApiBubble(BUBBLE_TYPE_SEARCH_ENGINE,
80                             extension->id(),
81                             profile,
82                             toolbar->app_menu(),
83                             views::BubbleBorder::TOP_RIGHT);
84     }
85   }
86 }
87
88 void MaybeShowExtensionControlledNewTabPage(
89     Browser* browser, content::WebContents* web_contents) {
90 #if !defined(OS_WIN)
91   return;
92 #endif
93
94   content::NavigationEntry* entry =
95       web_contents->GetController().GetActiveEntry();
96   if (!entry)
97     return;
98   GURL active_url = entry->GetURL();
99   if (!active_url.SchemeIs("chrome-extension"))
100     return;  // Not a URL that we care about.
101
102   // See if the current active URL matches a transformed NewTab URL.
103   GURL ntp_url(chrome::kChromeUINewTabURL);
104   bool ignored_param;
105   content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(
106       &ntp_url,
107       web_contents->GetBrowserContext(),
108       &ignored_param);
109   if (ntp_url != active_url)
110     return;  // Not being overridden by an extension.
111
112   scoped_ptr<NtpOverriddenBubbleController> ntp_overridden_bubble(
113       new NtpOverriddenBubbleController(browser->profile()));
114   if (!ntp_overridden_bubble->ShouldShow(ntp_url.host()))
115     return;
116
117   NtpOverriddenBubbleController* controller = ntp_overridden_bubble.get();
118   ExtensionMessageBubbleView* bubble_delegate = new ExtensionMessageBubbleView(
119       BrowserView::GetBrowserViewForBrowser(browser)->toolbar()->app_menu(),
120       views::BubbleBorder::TOP_RIGHT,
121       ntp_overridden_bubble.Pass());
122   views::BubbleDelegateView::CreateBubble(bubble_delegate);
123   controller->Show(bubble_delegate);
124 }
125
126 }  // namespace extensions