Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011 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/blocked_content/blocked_content_tab_helper.h" | |
| 6 | |
| 7 #include "base/auto_reset.h" | |
| 8 #include "chrome/browser/content_settings/host_content_settings_map.h" | |
| 9 #include "chrome/browser/profiles/profile.h" | |
| 10 #include "chrome/browser/ui/blocked_content/blocked_content_container.h" | |
| 11 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | |
| 12 #include "content/browser/renderer_host/render_view_host.h" | |
| 13 #include "content/browser/tab_contents/tab_contents.h" | |
| 14 #include "content/common/notification_service.h" | |
| 15 | |
| 16 BlockedContentTabHelper::BlockedContentTabHelper( | |
| 17 TabContentsWrapper* tab_contents) | |
| 18 : TabContentsObserver(tab_contents->tab_contents()), | |
| 19 blocked_contents_(new BlockedContentContainer(tab_contents)), | |
| 20 all_contents_blocked_(false), | |
| 21 tab_contents_wrapper_(tab_contents) { | |
| 22 } | |
| 23 | |
| 24 BlockedContentTabHelper::~BlockedContentTabHelper() { | |
| 25 } | |
| 26 | |
| 27 void BlockedContentTabHelper::DidNavigateMainFramePostCommit( | |
| 28 const NavigationController::LoadCommittedDetails& details, | |
| 29 const ViewHostMsg_FrameNavigate_Params& params) { | |
| 30 // Clear all page actions, blocked content notifications and browser actions | |
| 31 // for this tab, unless this is an in-page navigation. | |
| 32 if (!details.is_in_page) { | |
| 33 // Close blocked popups. | |
| 34 if (blocked_contents_->GetBlockedContentsCount()) { | |
| 35 blocked_contents_->Clear(); | |
| 36 PopupNotificationVisibilityChanged(false); | |
| 37 } | |
| 38 } | |
| 39 } | |
| 40 | |
| 41 void BlockedContentTabHelper::PopupNotificationVisibilityChanged( | |
| 42 bool visible) { | |
| 43 if (tab_contents()->is_being_destroyed()) | |
| 44 return; | |
| 45 tab_contents()->GetTabSpecificContentSettings()->SetPopupsBlocked(visible); | |
| 46 } | |
| 47 | |
| 48 void BlockedContentTabHelper::SetAllContentsBlocked(bool value) { | |
| 49 if (all_contents_blocked_ == value) | |
| 50 return; | |
| 51 | |
| 52 all_contents_blocked_ = value; | |
| 53 if (!all_contents_blocked_ && blocked_contents_->GetBlockedContentsCount()) { | |
| 54 std::vector<TabContentsWrapper*> blocked; | |
| 55 blocked_contents_->GetBlockedContents(&blocked); | |
| 56 for (size_t i = 0; i < blocked.size(); ++i) | |
| 57 blocked_contents_->LaunchForContents(blocked[i]); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 void BlockedContentTabHelper::AddTabContents(TabContentsWrapper* new_contents, | |
| 62 WindowOpenDisposition disposition, | |
| 63 const gfx::Rect& initial_pos, | |
| 64 bool user_gesture) { | |
| 65 if (!blocked_contents_->GetBlockedContentsCount()) | |
| 66 PopupNotificationVisibilityChanged(true); | |
| 67 blocked_contents_->AddTabContents( | |
| 68 new_contents, disposition, initial_pos, user_gesture); | |
| 69 } | |
| 70 | |
| 71 void BlockedContentTabHelper::AddPopup(TabContentsWrapper* new_contents, | |
| 72 const gfx::Rect& initial_pos, | |
| 73 bool user_gesture) { | |
|
stevenjb
2011/04/21 22:38:07
This doesn't actually need user_gesture since it d
Avi (use Gerrit)
2011/04/22 03:22:28
True. Next CL; I just want to commit this :)
| |
| 74 // A page can't spawn popups (or do anything else, either) until its load | |
| 75 // commits, so when we reach here, the popup was spawned by the | |
| 76 // NavigationController's last committed entry, not the active entry. For | |
| 77 // example, if a page opens a popup in an onunload() handler, then the active | |
| 78 // entry is the page to be loaded as we navigate away from the unloading | |
| 79 // page. For this reason, we can't use GetURL() to get the opener URL, | |
| 80 // because it returns the active entry. | |
| 81 NavigationEntry* entry = tab_contents()->controller().GetLastCommittedEntry(); | |
| 82 GURL creator = entry ? entry->virtual_url() : GURL::EmptyGURL(); | |
| 83 | |
| 84 if (creator.is_valid() && | |
| 85 tab_contents()->profile()->GetHostContentSettingsMap()->GetContentSetting( | |
| 86 creator, CONTENT_SETTINGS_TYPE_POPUPS, "") == CONTENT_SETTING_ALLOW) { | |
| 87 tab_contents()->AddNewContents(new_contents->tab_contents(), | |
| 88 NEW_POPUP, | |
| 89 initial_pos, | |
| 90 true); // user_gesture | |
| 91 } else { | |
| 92 // Call blocked_contents_->AddTabContents with user_gesture == true | |
| 93 // so that the contents will not get blocked again. | |
| 94 blocked_contents_->AddTabContents(new_contents, | |
| 95 NEW_POPUP, | |
| 96 initial_pos, | |
| 97 true); // user_gesture | |
| 98 tab_contents()->GetContentSettingsDelegate()->OnContentBlocked( | |
| 99 CONTENT_SETTINGS_TYPE_POPUPS, std::string()); | |
| 100 } | |
| 101 } | |
| 102 | |
| 103 void BlockedContentTabHelper::LaunchForContents( | |
| 104 TabContentsWrapper* tab_contents) { | |
| 105 blocked_contents_->LaunchForContents(tab_contents); | |
| 106 if (!blocked_contents_->GetBlockedContentsCount()) | |
| 107 PopupNotificationVisibilityChanged(false); | |
| 108 } | |
| 109 | |
| 110 size_t BlockedContentTabHelper::GetBlockedContentsCount() const { | |
| 111 return blocked_contents_->GetBlockedContentsCount(); | |
| 112 } | |
| 113 | |
| 114 void BlockedContentTabHelper::GetBlockedContents( | |
| 115 std::vector<TabContentsWrapper*>* blocked_contents) const { | |
| 116 blocked_contents_->GetBlockedContents(blocked_contents); | |
| 117 } | |
| OLD | NEW |