Home | History | Annotate | Download | only in views
      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 =
     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 
     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 
     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 
     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