| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/infobars/infobar_tab_helper.h" | 5 #include "chrome/browser/infobars/infobar_tab_helper.h" |
| 6 | 6 |
| 7 #include "chrome/browser/api/infobars/infobar_delegate.h" | 7 #include "chrome/browser/api/infobars/infobar_delegate.h" |
| 8 #include "chrome/browser/infobars/infobar.h" | 8 #include "chrome/browser/infobars/infobar.h" |
| 9 #include "chrome/browser/infobars/insecure_content_infobar_delegate.h" | 9 #include "chrome/browser/infobars/insecure_content_infobar_delegate.h" |
| 10 #include "chrome/common/chrome_notification_types.h" | 10 #include "chrome/common/chrome_notification_types.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 // TODO(pkasting): If there is no InfoBarContainer, this leaks all the | 53 // TODO(pkasting): If there is no InfoBarContainer, this leaks all the |
| 54 // InfoBarDelegates. This will be fixed once we call CloseSoon() directly on | 54 // InfoBarDelegates. This will be fixed once we call CloseSoon() directly on |
| 55 // Infobars. | 55 // Infobars. |
| 56 RemoveAllInfoBars(false); | 56 RemoveAllInfoBars(false); |
| 57 } | 57 } |
| 58 | 58 |
| 59 void InfoBarTabHelper::SetInfoBarsEnabled(bool enabled) { | 59 void InfoBarTabHelper::SetInfoBarsEnabled(bool enabled) { |
| 60 infobars_enabled_ = enabled; | 60 infobars_enabled_ = enabled; |
| 61 } | 61 } |
| 62 | 62 |
| 63 bool InfoBarTabHelper::AddInfoBar(InfoBarDelegate* delegate) { | 63 InfoBarDelegate* InfoBarTabHelper::AddInfoBar( |
| 64 if (!infobars_enabled_) { | 64 scoped_ptr<InfoBarDelegate> delegate) { |
| 65 delegate->InfoBarClosed(); | 65 if (!infobars_enabled_) |
| 66 return false; | 66 return NULL; |
| 67 } | |
| 68 | 67 |
| 69 for (InfoBars::const_iterator i(infobars_.begin()); i != infobars_.end(); | 68 for (InfoBars::const_iterator i(infobars_.begin()); i != infobars_.end(); |
| 70 ++i) { | 69 ++i) { |
| 71 if ((*i)->EqualsDelegate(delegate)) { | 70 if ((*i)->EqualsDelegate(delegate.get())) { |
| 72 DCHECK_NE(*i, delegate); | 71 DCHECK_NE(*i, delegate.get()); |
| 73 delegate->InfoBarClosed(); | 72 return NULL; |
| 74 return false; | |
| 75 } | 73 } |
| 76 } | 74 } |
| 77 | 75 |
| 78 // TODO(pkasting): Consider removing InfoBarTabHelper arg from delegate | 76 // TODO(pkasting): Consider removing InfoBarTabHelper arg from delegate |
| 79 // constructors and instead using a setter from here. | 77 // constructors and instead using a setter from here. |
| 80 infobars_.push_back(delegate); | 78 InfoBarDelegate* delegate_ptr = delegate.release(); |
| 79 infobars_.push_back(delegate_ptr); |
| 81 // Add ourselves as an observer for navigations the first time a delegate is | 80 // Add ourselves as an observer for navigations the first time a delegate is |
| 82 // added. We use this notification to expire InfoBars that need to expire on | 81 // added. We use this notification to expire InfoBars that need to expire on |
| 83 // page transitions. | 82 // page transitions. |
| 84 if (infobars_.size() == 1) { | 83 if (infobars_.size() == 1) { |
| 85 registrar_.Add( | 84 registrar_.Add( |
| 86 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 85 this, content::NOTIFICATION_NAV_ENTRY_COMMITTED, |
| 87 content::Source<NavigationController>( | 86 content::Source<NavigationController>( |
| 88 &web_contents()->GetController())); | 87 &web_contents()->GetController())); |
| 89 } | 88 } |
| 90 | 89 |
| 91 content::NotificationService::current()->Notify( | 90 content::NotificationService::current()->Notify( |
| 92 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, | 91 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, |
| 93 content::Source<InfoBarService>(this), | 92 content::Source<InfoBarService>(this), |
| 94 content::Details<InfoBarAddedDetails>(delegate)); | 93 content::Details<InfoBarAddedDetails>(delegate_ptr)); |
| 95 return true; | 94 return delegate_ptr; |
| 96 } | 95 } |
| 97 | 96 |
| 98 void InfoBarTabHelper::RemoveInfoBar(InfoBarDelegate* delegate) { | 97 void InfoBarTabHelper::RemoveInfoBar(InfoBarDelegate* delegate) { |
| 99 RemoveInfoBarInternal(delegate, true); | 98 RemoveInfoBarInternal(delegate, true); |
| 100 } | 99 } |
| 101 | 100 |
| 102 bool InfoBarTabHelper::ReplaceInfoBar(InfoBarDelegate* old_delegate, | 101 InfoBarDelegate* InfoBarTabHelper::ReplaceInfoBar( |
| 103 InfoBarDelegate* new_delegate) { | 102 InfoBarDelegate* old_delegate, |
| 103 scoped_ptr<InfoBarDelegate> new_delegate) { |
| 104 if (!infobars_enabled_) | 104 if (!infobars_enabled_) |
| 105 return AddInfoBar(new_delegate); // Deletes the delegate. | 105 return AddInfoBar(new_delegate.Pass()); // Deletes the delegate. |
| 106 | 106 |
| 107 InfoBars::iterator i(std::find(infobars_.begin(), infobars_.end(), | 107 InfoBars::iterator i(std::find(infobars_.begin(), infobars_.end(), |
| 108 old_delegate)); | 108 old_delegate)); |
| 109 DCHECK(i != infobars_.end()); | 109 DCHECK(i != infobars_.end()); |
| 110 | 110 |
| 111 i = infobars_.insert(i, new_delegate) + 1; | 111 InfoBarDelegate* new_delegate_ptr = new_delegate.release(); |
| 112 i = infobars_.insert(i, new_delegate_ptr); |
| 113 InfoBarReplacedDetails replaced_details(old_delegate, new_delegate_ptr); |
| 112 // Remove the old delegate before notifying, so that if any observers call | 114 // Remove the old delegate before notifying, so that if any observers call |
| 113 // back to AddInfoBar() or similar, we don't dupe-check against this delegate. | 115 // back to AddInfoBar() or similar, we don't dupe-check against this delegate. |
| 114 infobars_.erase(i); | 116 infobars_.erase(++i); |
| 115 | 117 |
| 116 old_delegate->clear_owner(); | 118 old_delegate->clear_owner(); |
| 117 InfoBarReplacedDetails replaced_details(old_delegate, new_delegate); | |
| 118 content::NotificationService::current()->Notify( | 119 content::NotificationService::current()->Notify( |
| 119 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REPLACED, | 120 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REPLACED, |
| 120 content::Source<InfoBarService>(this), | 121 content::Source<InfoBarService>(this), |
| 121 content::Details<InfoBarReplacedDetails>(&replaced_details)); | 122 content::Details<InfoBarReplacedDetails>(&replaced_details)); |
| 122 return true; | 123 return new_delegate_ptr; |
| 123 } | 124 } |
| 124 | 125 |
| 125 size_t InfoBarTabHelper::GetInfoBarCount() const { | 126 size_t InfoBarTabHelper::GetInfoBarCount() const { |
| 126 return infobars_.size(); | 127 return infobars_.size(); |
| 127 } | 128 } |
| 128 | 129 |
| 129 InfoBarDelegate* InfoBarTabHelper::GetInfoBarDelegateAt(size_t index) { | 130 InfoBarDelegate* InfoBarTabHelper::GetInfoBarDelegateAt(size_t index) { |
| 130 return infobars_[index]; | 131 return infobars_[index]; |
| 131 } | 132 } |
| 132 | 133 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 162 content::Source<InfoBarService>(this), | 163 content::Source<InfoBarService>(this), |
| 163 content::Details<InfoBarRemovedDetails>(&removed_details)); | 164 content::Details<InfoBarRemovedDetails>(&removed_details)); |
| 164 } | 165 } |
| 165 | 166 |
| 166 void InfoBarTabHelper::RemoveAllInfoBars(bool animate) { | 167 void InfoBarTabHelper::RemoveAllInfoBars(bool animate) { |
| 167 while (!infobars_.empty()) | 168 while (!infobars_.empty()) |
| 168 RemoveInfoBarInternal(GetInfoBarDelegateAt(GetInfoBarCount() - 1), animate); | 169 RemoveInfoBarInternal(GetInfoBarDelegateAt(GetInfoBarCount() - 1), animate); |
| 169 } | 170 } |
| 170 | 171 |
| 171 void InfoBarTabHelper::OnDidBlockDisplayingInsecureContent() { | 172 void InfoBarTabHelper::OnDidBlockDisplayingInsecureContent() { |
| 172 // At most one infobar and do not supersede the stronger running content bar. | 173 InsecureContentInfoBarDelegate::Create( |
| 173 for (size_t i = 0; i < infobars_.size(); ++i) { | 174 this, InsecureContentInfoBarDelegate::DISPLAY); |
| 174 if (GetInfoBarDelegateAt(i)->AsInsecureContentInfoBarDelegate()) | |
| 175 return; | |
| 176 } | |
| 177 AddInfoBar(new InsecureContentInfoBarDelegate(this, | |
| 178 InsecureContentInfoBarDelegate::DISPLAY)); | |
| 179 } | 175 } |
| 180 | 176 |
| 181 void InfoBarTabHelper::OnDidBlockRunningInsecureContent() { | 177 void InfoBarTabHelper::OnDidBlockRunningInsecureContent() { |
| 182 // At most one infobar superseding any weaker displaying content bar. | 178 InsecureContentInfoBarDelegate::Create(this, |
| 183 for (size_t i = 0; i < infobars_.size(); ++i) { | 179 InsecureContentInfoBarDelegate::RUN); |
| 184 InsecureContentInfoBarDelegate* delegate = | |
| 185 GetInfoBarDelegateAt(i)->AsInsecureContentInfoBarDelegate(); | |
| 186 if (delegate) { | |
| 187 if (delegate->type() != InsecureContentInfoBarDelegate::RUN) { | |
| 188 ReplaceInfoBar(delegate, new InsecureContentInfoBarDelegate( | |
| 189 this, InsecureContentInfoBarDelegate::RUN)); | |
| 190 } | |
| 191 return; | |
| 192 } | |
| 193 } | |
| 194 AddInfoBar(new InsecureContentInfoBarDelegate(this, | |
| 195 InsecureContentInfoBarDelegate::RUN)); | |
| 196 } | 180 } |
| 197 | 181 |
| 198 void InfoBarTabHelper::RenderViewGone(base::TerminationStatus status) { | 182 void InfoBarTabHelper::RenderViewGone(base::TerminationStatus status) { |
| 199 RemoveAllInfoBars(true); | 183 RemoveAllInfoBars(true); |
| 200 } | 184 } |
| 201 | 185 |
| 202 bool InfoBarTabHelper::OnMessageReceived(const IPC::Message& message) { | 186 bool InfoBarTabHelper::OnMessageReceived(const IPC::Message& message) { |
| 203 bool handled = true; | 187 bool handled = true; |
| 204 IPC_BEGIN_MESSAGE_MAP(InfoBarTabHelper, message) | 188 IPC_BEGIN_MESSAGE_MAP(InfoBarTabHelper, message) |
| 205 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockDisplayingInsecureContent, | 189 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidBlockDisplayingInsecureContent, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 236 DCHECK_EQ(type, content::NOTIFICATION_WEB_CONTENTS_DESTROYED); | 220 DCHECK_EQ(type, content::NOTIFICATION_WEB_CONTENTS_DESTROYED); |
| 237 // The WebContents is going away; be aggressively paranoid and delete | 221 // The WebContents is going away; be aggressively paranoid and delete |
| 238 // ourselves lest other parts of the system attempt to add infobars or use | 222 // ourselves lest other parts of the system attempt to add infobars or use |
| 239 // us otherwise during the destruction. | 223 // us otherwise during the destruction. |
| 240 DCHECK_EQ(web_contents(), content::Source<WebContents>(source).ptr()); | 224 DCHECK_EQ(web_contents(), content::Source<WebContents>(source).ptr()); |
| 241 web_contents()->RemoveUserData(UserDataKey()); | 225 web_contents()->RemoveUserData(UserDataKey()); |
| 242 // That was the equivalent of "delete this". This object is now destroyed; | 226 // That was the equivalent of "delete this". This object is now destroyed; |
| 243 // returning from this function is the only safe thing to do. | 227 // returning from this function is the only safe thing to do. |
| 244 return; | 228 return; |
| 245 } | 229 } |
| OLD | NEW |