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