1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright (c) 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/settings_api_bubble_helper_views.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/extensions/ntp_overridden_bubble_controller.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/settings_api_bubble_controller.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/settings_api_helpers.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/browser_finder.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/tabs/tab_strip_model.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/frame/browser_view.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/settings_api_bubble_helper_views.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/toolbar/home_button.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/extensions/manifest_handlers/settings_overrides_handler.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/url_constants.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/browser_url_handler.h"
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/navigation_entry.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace extensions {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ShowSettingsApiBubble(SettingsApiOverrideType type,
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           const std::string& extension_id,
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           Profile* profile,
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           views::View* anchor_view,
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           views::BubbleBorder::Arrow arrow) {
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<SettingsApiBubbleController> settings_api_bubble(
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      new SettingsApiBubbleController(profile, type));
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!settings_api_bubble->ShouldShow(extension_id))
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SettingsApiBubbleController* controller = settings_api_bubble.get();
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ExtensionMessageBubbleView* bubble_delegate =
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      new ExtensionMessageBubbleView(
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          anchor_view,
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          arrow,
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          settings_api_bubble.PassAs<
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              ExtensionMessageBubbleController>());
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  views::BubbleDelegateView::CreateBubble(bubble_delegate);
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  controller->Show(bubble_delegate);
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MaybeShowExtensionControlledHomeNotification(Browser* browser) {
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_WIN)
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return;
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const Extension* extension =
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      GetExtensionOverridingHomepage(browser->profile());
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (extension) {
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // The bubble will try to anchor itself against the home button
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    views::View* anchor_view = BrowserView::GetBrowserViewForBrowser(browser)->
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        toolbar()->home_button();
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ShowSettingsApiBubble(BUBBLE_TYPE_HOME_PAGE,
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          extension->id(),
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          browser->profile(),
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          anchor_view,
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          views::BubbleBorder::TOP_LEFT);
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MaybeShowExtensionControlledSearchNotification(
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    Profile* profile,
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    content::WebContents* web_contents,
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const AutocompleteMatch& match) {
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_WIN)
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return;
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (AutocompleteMatch::IsSearchType(match.type) &&
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      match.type != AutocompleteMatchType::SEARCH_OTHER_ENGINE) {
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const Extension* extension = GetExtensionOverridingSearchEngine(profile);
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (extension) {
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ToolbarView* toolbar =
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          BrowserView::GetBrowserViewForBrowser(
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              chrome::FindBrowserWithWebContents(web_contents))->toolbar();
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ShowSettingsApiBubble(BUBBLE_TYPE_SEARCH_ENGINE,
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            extension->id(),
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            profile,
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            toolbar->app_menu(),
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            views::BubbleBorder::TOP_RIGHT);
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid MaybeShowExtensionControlledNewTabPage(
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    Browser* browser, content::WebContents* web_contents) {
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if !defined(OS_WIN)
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return;
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::NavigationEntry* entry =
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents->GetController().GetActiveEntry();
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!entry)
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GURL active_url = entry->GetURL();
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!active_url.SchemeIs("chrome-extension"))
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;  // Not a URL that we care about.
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // See if the current active URL matches a transformed NewTab URL.
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GURL ntp_url(chrome::kChromeUINewTabURL);
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool ignored_param;
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::BrowserURLHandler::GetInstance()->RewriteURLIfNecessary(
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &ntp_url,
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      web_contents->GetBrowserContext(),
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &ignored_param);
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (ntp_url != active_url)
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;  // Not being overridden by an extension.
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<NtpOverriddenBubbleController> ntp_overridden_bubble(
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new NtpOverriddenBubbleController(browser->profile()));
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!ntp_overridden_bubble->ShouldShow(ntp_url.host()))
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NtpOverriddenBubbleController* controller = ntp_overridden_bubble.get();
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionMessageBubbleView* bubble_delegate =
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new ExtensionMessageBubbleView(
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          BrowserView::GetBrowserViewForBrowser(browser)->toolbar()->app_menu(),
1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          views::BubbleBorder::TOP_RIGHT,
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          ntp_overridden_bubble.PassAs<
1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              ExtensionMessageBubbleController>());
1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  views::BubbleDelegateView::CreateBubble(bubble_delegate);
1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  controller->Show(bubble_delegate);
1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace extensions
133