1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/insecure_content_infobar_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/navigation_details.h" 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/navigation_entry.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(InfoBarService); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing infobars::InfoBar; 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing infobars::InfoBarDelegate; 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing infobars::InfoBarManager; 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// static 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochInfoBarDelegate::NavigationDetails 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InfoBarService::NavigationDetailsFromLoadCommittedDetails( 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const content::LoadCommittedDetails& details) { 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch InfoBarDelegate::NavigationDetails navigation_details; 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch navigation_details.entry_id = details.entry->GetUniqueID(); 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch navigation_details.is_navigation_to_different_page = 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch details.is_navigation_to_different_page(); 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch navigation_details.did_replace_entry = details.did_replace_entry; 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch navigation_details.is_main_frame = details.is_main_frame; 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const content::PageTransition transition = details.entry->GetTransitionType(); 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch navigation_details.is_reload = 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::PageTransitionStripQualifier(transition) == 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::PAGE_TRANSITION_RELOAD; 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch navigation_details.is_redirect = 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch (transition & content::PAGE_TRANSITION_IS_REDIRECT_MASK) != 0; 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return navigation_details; 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// static 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochcontent::WebContents* InfoBarService::WebContentsFromInfoBar(InfoBar* infobar) { 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!infobar || !infobar->owner()) 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return NULL; 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService* infobar_service = 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<InfoBarService*>(infobar->owner()); 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return infobar_service->web_contents(); 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InfoBarService::InfoBarService(content::WebContents* web_contents) 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : content::WebContentsObserver(web_contents) { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(web_contents); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochInfoBarService::~InfoBarService() { 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ShutDown(); 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint InfoBarService::GetActiveEntryID() { 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::NavigationEntry* active_entry = 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_contents()->GetController().GetActiveEntry(); 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return active_entry ? active_entry->GetUniqueID() : 0; 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid InfoBarService::NotifyInfoBarAdded(InfoBar* infobar) { 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarManager::NotifyInfoBarAdded(infobar); 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // TODO(droger): Remove the notifications and have listeners change to be 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // InfoBarManager::Observers instead. See http://crbug.com/354380 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::NotificationService::current()->Notify( 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::Source<InfoBarService>(this), 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::Details<InfoBar::AddedDetails>(infobar)); 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid InfoBarService::NotifyInfoBarRemoved(InfoBar* infobar, bool animate) { 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarManager::NotifyInfoBarRemoved(infobar, animate); 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // TODO(droger): Remove the notifications and have listeners change to be 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // InfoBarManager::Observers instead. See http://crbug.com/354380 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBar::RemovedDetails removed_details(infobar, animate); 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::NotificationService::current()->Notify( 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::Source<InfoBarService>(this), 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::Details<InfoBar::RemovedDetails>(&removed_details)); 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InfoBarService::RenderProcessGone(base::TerminationStatus status) { 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch RemoveAllInfoBars(true); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InfoBarService::NavigationEntryCommitted( 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const content::LoadCommittedDetails& load_details) { 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OnNavigation(NavigationDetailsFromLoadCommittedDetails(load_details)); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InfoBarService::WebContentsDestroyed() { 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The WebContents is going away; be aggressively paranoid and delete 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // ourselves lest other parts of the system attempt to add infobars or use 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // us otherwise during the destruction. 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents()->RemoveUserData(UserDataKey()); 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // That was the equivalent of "delete this". This object is now destroyed; 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // returning from this function is the only safe thing to do. 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool InfoBarService::OnMessageReceived(const IPC::Message& message) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(InfoBarService, message) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockDisplayingInsecureContent, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidBlockDisplayingInsecureContent) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockRunningInsecureContent, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidBlockRunningInsecureContent) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::OnDidBlockDisplayingInsecureContent() { 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InsecureContentInfoBarDelegate::Create( 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, InsecureContentInfoBarDelegate::DISPLAY); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::OnDidBlockRunningInsecureContent() { 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InsecureContentInfoBarDelegate::Create(this, 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InsecureContentInfoBarDelegate::RUN); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 128