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) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/infobar.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_delegate.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/insecure_content_infobar_delegate.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(InfoBarService); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InfoBarDelegate* InfoBarService::AddInfoBar( 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<InfoBarDelegate> infobar) { 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(infobar); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!infobars_enabled_) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (InfoBars::const_iterator i(infobars_.begin()); i != infobars_.end(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) { 27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if ((*i)->EqualsDelegate(infobar.get())) { 28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK_NE(*i, infobar.get()); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBarDelegate* infobar_ptr = infobar.release(); 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobars_.push_back(infobar_ptr); 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(pkasting): Remove InfoBarService arg from delegate constructors and 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // instead use a setter from here. 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add ourselves as an observer for navigations the first time a delegate is 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added. We use this notification to expire InfoBars that need to expire on 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // page transitions. We must do this before calling Notify() below; 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // otherwise, if that call causes a call to RemoveInfoBar(), we'll try to 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // unregister for the NAV_ENTRY_COMMITTED notification, which we won't have 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // yet registered here, and we'll fail the "was registered" DCHECK in 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // NotificationRegistrar::Remove(). 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (infobars_.size() == 1) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<content::NavigationController>( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents()->GetController())); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<InfoBarService>(this), 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::Details<InfoBarAddedDetails>(infobar_ptr)); 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return infobar_ptr; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid InfoBarService::RemoveInfoBar(InfoBarDelegate* infobar) { 60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RemoveInfoBarInternal(infobar, true); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InfoBarDelegate* InfoBarService::ReplaceInfoBar( 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBarDelegate* old_infobar, 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<InfoBarDelegate> new_infobar) { 66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(old_infobar); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!infobars_enabled_) 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return AddInfoBar(new_infobar.Pass()); // Deletes the delegate. 69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(new_infobar); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InfoBars::iterator i(std::find(infobars_.begin(), infobars_.end(), 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch old_infobar)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(i != infobars_.end()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBarDelegate* new_infobar_ptr = new_infobar.release(); 76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch i = infobars_.insert(i, new_infobar_ptr); 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBarReplacedDetails replaced_details(old_infobar, new_infobar_ptr); 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Remove the old infobar before notifying, so that if any observers call 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // back to AddInfoBar() or similar, we don't dupe-check against this infobar. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) infobars_.erase(++i); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch old_infobar->clear_owner(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REPLACED, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<InfoBarService>(this), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<InfoBarReplacedDetails>(&replaced_details)); 88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return new_infobar_ptr; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InfoBarService::InfoBarService(content::WebContents* web_contents) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : content::WebContentsObserver(web_contents), 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) infobars_enabled_(true) { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(web_contents); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NOTIFICATION_WEB_CONTENTS_DESTROYED, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<content::WebContents>(web_contents)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)InfoBarService::~InfoBarService() { 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Destroy all remaining InfoBars. It's important to not animate here so that 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // we guarantee that we'll delete all delegates before we do anything else. 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(pkasting): If there is no InfoBarContainer, this leaks all the 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // InfoBarDelegates. This will be fixed once we call CloseSoon() directly on 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Infobars. 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RemoveAllInfoBars(false); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid InfoBarService::RenderProcessGone(base::TerminationStatus status) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveAllInfoBars(true); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool InfoBarService::OnMessageReceived(const IPC::Message& message) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(InfoBarService, message) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockDisplayingInsecureContent, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidBlockDisplayingInsecureContent) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockRunningInsecureContent, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidBlockRunningInsecureContent) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::Observe(int type, 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationSource& source, 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const content::NotificationDetails& details) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == content::NOTIFICATION_NAV_ENTRY_COMMITTED) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(&web_contents()->GetController() == 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<content::NavigationController>(source).ptr()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::LoadCommittedDetails& committed_details = 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(content::Details<content::LoadCommittedDetails>(details).ptr()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: It is not safe to change the following code to count upwards or 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use iterators, as the RemoveInfoBar() call synchronously modifies our 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delegate list. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = infobars_.size(); i > 0; --i) { 140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBarDelegate* infobar = infobars_[i - 1]; 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (infobar->ShouldExpire(committed_details)) 142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RemoveInfoBar(infobar); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, content::NOTIFICATION_WEB_CONTENTS_DESTROYED); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The WebContents is going away; be aggressively paranoid and delete 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ourselves lest other parts of the system attempt to add infobars or use 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us otherwise during the destruction. 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(web_contents(), 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<content::WebContents>(source).ptr()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->RemoveUserData(UserDataKey()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // That was the equivalent of "delete this". This object is now destroyed; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returning from this function is the only safe thing to do. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid InfoBarService::RemoveInfoBarInternal(InfoBarDelegate* infobar, 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animate) { 162ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(infobar); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!infobars_enabled_) { 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(infobars_.empty()); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBars::iterator i(std::find(infobars_.begin(), infobars_.end(), infobar)); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(i != infobars_.end()); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch infobar->clear_owner(); 172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Remove the infobar before notifying, so that if any observers call back to 173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // AddInfoBar() or similar, we don't dupe-check against this infobar. 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) infobars_.erase(i); 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Remove ourselves as an observer if we are tracking no more InfoBars. We 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // must do this before calling Notify() below; otherwise, if that call 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // causes a call to AddInfoBar(), we'll try to register for the 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // NAV_ENTRY_COMMITTED notification, which we won't have yet unregistered 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // here, and we'll fail the "not already registered" DCHECK in 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // NotificationRegistrar::Add(). 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (infobars_.empty()) { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Remove( 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<content::NavigationController>( 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &web_contents()->GetController())); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch InfoBarRemovedDetails removed_details(infobar, animate); 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::NotificationService::current()->Notify( 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Source<InfoBarService>(this), 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::Details<InfoBarRemovedDetails>(&removed_details)); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::RemoveAllInfoBars(bool animate) { 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) while (!infobars_.empty()) 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RemoveInfoBarInternal(infobars_.back(), animate); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::OnDidBlockDisplayingInsecureContent() { 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InsecureContentInfoBarDelegate::Create( 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, InsecureContentInfoBarDelegate::DISPLAY); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InfoBarService::OnDidBlockRunningInsecureContent() { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InsecureContentInfoBarDelegate::Create(this, 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InsecureContentInfoBarDelegate::RUN); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 210