19ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
29ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
39ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// found in the LICENSE file.
49ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#ifndef CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_TAB_HELPER_H_
69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#define CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_TAB_HELPER_H_
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include <map>
958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/id_map.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/blocked_content/blocked_window_params.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/public/browser/web_contents_observer.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "content/public/browser/web_contents_user_data.h"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
159ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochnamespace chrome {
169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochstruct NavigateParams;
1758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}
1858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
2058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochstruct WebWindowFeatures;
2158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}
2258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
2358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochclass GURL;
249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// Per-tab class to manage blocked popups.
269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdochclass PopupBlockerTabHelper
279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    : public content::WebContentsObserver,
289ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      public content::WebContentsUserData<PopupBlockerTabHelper> {
299ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch public:
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Mapping from popup IDs to blocked popup requests.
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::map<int32, GURL> PopupIdMap;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
339ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  virtual ~PopupBlockerTabHelper();
349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
359ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // Returns true if the popup request defined by |params| should be blocked.
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // In that case, it is also added to the |blocked_popups_| container.
3758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  bool MaybeBlockPopup(const chrome::NavigateParams& params,
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       const blink::WebWindowFeatures& window_features);
399ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Adds a popup request to the |blocked_popups_| container.
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void AddBlockedPopup(const BlockedWindowParams& params);
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
439ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // Creates the blocked popup with |popup_id|.
449ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  void ShowBlockedPopup(int32 popup_id);
459ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // Returns the number of blocked popups.
479ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  size_t GetBlockedPopupsCount() const;
489ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PopupIdMap GetBlockedPopupRequests();
509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // content::WebContentsObserver overrides:
529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  virtual void DidNavigateMainFrame(
539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      const content::LoadCommittedDetails& details,
549ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      const content::FrameNavigateParams& params) OVERRIDE;
559ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
569ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch private:
5758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  struct BlockedRequest;
589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  friend class content::WebContentsUserData<PopupBlockerTabHelper>;
599ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  explicit PopupBlockerTabHelper(content::WebContents* web_contents);
6158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  // Called when the blocked popup notification is shown or hidden.
639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  void PopupNotificationVisibilityChanged(bool visible);
649ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
6558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  IDMap<BlockedRequest, IDMapOwnPointer> blocked_popups_;
669ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
679ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(PopupBlockerTabHelper);
689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch};
699ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
709ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#endif  // CHROME_BROWSER_UI_BLOCKED_CONTENT_POPUP_BLOCKER_TAB_HELPER_H_
71