| // Copyright 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_CHROME_BROWSER_WEB_BLOCKED_POPUP_TAB_HELPER_H_ |
| #define IOS_CHROME_BROWSER_WEB_BLOCKED_POPUP_TAB_HELPER_H_ |
| |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/scoped_observer.h" |
| #include "components/infobars/core/infobar_manager.h" |
| #include "ios/web/public/referrer.h" |
| #import "ios/web/public/web_state/web_state_user_data.h" |
| #include "url/gurl.h" |
| |
| namespace infobars { |
| class InfoBar; |
| } // namespace infobars |
| |
| namespace ios { |
| class ChromeBrowserState; |
| } // namespace ios |
| |
| namespace web { |
| class WebState; |
| } // namespace web |
| |
| // Handles blocked popups. Will display an infobar informing the user and |
| // allowing the user to add an exception and navigate to the site. |
| class BlockedPopupTabHelper |
| : public infobars::InfoBarManager::Observer, |
| public web::WebStateUserData<BlockedPopupTabHelper> { |
| public: |
| explicit BlockedPopupTabHelper(web::WebState* web_state); |
| ~BlockedPopupTabHelper() override; |
| |
| // Returns true if popup requested by the page with the given |source_url| |
| // should be blocked. |
| bool ShouldBlockPopup(const GURL& source_url); |
| |
| // Shows the popup blocker infobar for the popup with given popup_url. |
| // |referrer| represents the frame which requested this popup. |
| void HandlePopup(const GURL& popup_url, const web::Referrer& referrer); |
| |
| // infobars::InfoBarManager::Observer implementation. |
| void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override; |
| void OnManagerShuttingDown( |
| infobars::InfoBarManager* infobar_manager) override; |
| |
| // Encapsulates information about popup. |
| struct Popup { |
| Popup(const GURL& popup_url, const web::Referrer& referrer) |
| : popup_url(popup_url), referrer(referrer) {} |
| // URL of the popup window. |
| const GURL popup_url; |
| // Referrer which requested this popup. |
| const web::Referrer referrer; |
| }; |
| |
| private: |
| friend class BlockedPopupTabHelperTest; |
| |
| // Shows the infobar for the current popups. Will also handle replacing an |
| // existing infobar with the updated count. |
| void ShowInfoBar(); |
| |
| // Returns BrowserState for the WebState that this object is attached to. |
| ios::ChromeBrowserState* GetBrowserState() const; |
| |
| // Registers this object as an observer for the InfoBarManager associated with |
| // |web_state_|. Does nothing if already registered. |
| void RegisterAsInfoBarManagerObserverIfNeeded( |
| infobars::InfoBarManager* infobar_manager); |
| |
| // The WebState that this object is attached to. |
| web::WebState* web_state_; |
| // The currently displayed infobar. |
| infobars::InfoBar* infobar_; |
| // The popups to open. |
| std::vector<Popup> popups_; |
| // For management of infobars::InfoBarManager::Observer registration. This |
| // object will not start observing the InfoBarManager until ShowInfoBars() is |
| // called. |
| ScopedObserver<infobars::InfoBarManager, infobars::InfoBarManager::Observer> |
| scoped_observer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BlockedPopupTabHelper); |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_WEB_BLOCKED_POPUP_TAB_HELPER_H_ |