diff options
Diffstat (limited to 'chrome/browser/interstitial_page.h')
-rw-r--r-- | chrome/browser/interstitial_page.h | 111 |
1 files changed, 76 insertions, 35 deletions
diff --git a/chrome/browser/interstitial_page.h b/chrome/browser/interstitial_page.h index ce17818..ab8967f 100644 --- a/chrome/browser/interstitial_page.h +++ b/chrome/browser/interstitial_page.h @@ -7,16 +7,16 @@ #include <string> +#include "chrome/browser/web_contents_view_win.h" #include "chrome/common/notification_registrar.h" -#include "chrome/common/notification_service.h" #include "googleurl/src/gurl.h" class NavigationEntry; -class TabContents; +class WebContents; // This class is a base class for interstitial pages, pages that show some // informative message asking for user validation before reaching the target -// page. (Navigating to a page served over bad HTTPS or a page contining +// page. (Navigating to a page served over bad HTTPS or a page containing // malware are typical cases where an interstitial is required.) // // If specified in its constructor, this class creates a navigation entry so @@ -26,27 +26,27 @@ class TabContents; // through a navigation, the WebContents closing them or the tab containing them // being closed. -class InterstitialPage : public NotificationObserver { +class InterstitialPage : public NotificationObserver, + public RenderViewHostDelegate { public: - // Creates an interstitial page to show in |tab|. If |create_navigation_entry| - // is true, a temporary navigation entry is created with the URL |url| and + // Creates an interstitial page to show in |tab|. |new_navigation| should be + // set to true when the interstitial is caused by loading a new page, in which + // case a temporary navigation entry is created with the URL |url| and // added to the navigation controller (so the interstitial page appears as a - // new navigation entry). - InterstitialPage(TabContents* tab, - bool create_navigation_entry, - const GURL& url); + // new navigation entry). |new_navigation| should be false when the + // interstitial was triggered by a loading a sub-resource in a page. + InterstitialPage(WebContents* tab, bool new_navigation, const GURL& url); virtual ~InterstitialPage(); // Shows the interstitial page in the tab. - void Show(); + virtual void Show(); - // Invoked by the tab showing the interstitial to notify that the interstitial
- // page was closed.
- virtual void InterstitialClosed();
+ // Hides the interstitial page. Warning: this deletes the InterstitialPage. + void Hide(); // Retrieves the InterstitialPage if any associated with the specified // |tab_contents| (used by ui tests). - static InterstitialPage* GetInterstitialPage(TabContents* tab_contents); + static InterstitialPage* GetInterstitialPage(WebContents* web_contents); // Sub-classes should return the HTML that should be displayed in the page. virtual std::string GetHTMLContents() { return std::string(); } @@ -57,7 +57,34 @@ class InterstitialPage : public NotificationObserver { // Warning: 'this' has been deleted when this method returns. virtual void DontProceed(); + // Sub-classes should call this method when the user has chosen to proceed to + // the target URL. + // Warning: 'this' has been deleted when this method returns. + virtual void Proceed(); + + // Sizes the RenderViewHost showing the actual interstitial page contents. + void SetSize(const gfx::Size& size); + protected: + // NotificationObserver method: + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + // RenderViewHostDelegate implementation: + virtual Profile* GetProfile() const; + virtual WebPreferences GetWebkitPrefs() { + return WebPreferences(); + } + virtual void DidNavigate(RenderViewHost* render_view_host, + const ViewHostMsg_FrameNavigate_Params& params); + virtual void RendererGone(RenderViewHost* render_view_host); + virtual void DomOperationResponse(const std::string& json_string, + int automation_id); + virtual void UpdateTitle(RenderViewHost* render_view_host, + int32 page_id, + const std::wstring& title); + // Invoked when the page sent a command through DOMAutomation. virtual void CommandReceived(const std::string& command) { } @@ -68,47 +95,61 @@ class InterstitialPage : public NotificationObserver { // |create_navigation_entry| set to true. virtual void UpdateEntry(NavigationEntry* entry) { } - // Sub-classes should call this method when the user has chosen to proceed to - // the target URL. - // Warning: 'this' has been deleted when this method returns. - virtual void Proceed(); - - TabContents* tab() const { return tab_; } + WebContents* tab() const { return tab_; } const GURL& url() const { return url_; } + RenderViewHost* render_view_host() const { return render_view_host_; } + + // Creates and shows the RenderViewHost containing the interstitial content. + // Overriden in unit tests. + virtual RenderViewHost* CreateRenderViewHost(); private: // AutomationProvider needs access to Proceed and DontProceed to simulate // user actions. friend class AutomationProvider; - // NotificationObserver method. - virtual void Observe(NotificationType type, - const NotificationSource& source, - const NotificationDetails& details); - // Initializes tab_to_interstitial_page_ in a thread-safe manner. // Should be called before accessing tab_to_interstitial_page_. static void InitInterstitialPageMap(); - // A flag to indicate if we've notified |delegate_| of the user's decision. - bool delegate_has_been_notified_; + // Disable the interstitial: + // - if it is not yet showing, then it won't be shown. + // - any command sent by the RenderViewHost will be ignored. + void Disable(); // The tab in which we are displayed. - TabContents* tab_; + WebContents* tab_; // The URL that is shown when the interstitial is showing. GURL url_; - // Whether a transient navigation entry should be created when the page is - // shown. - bool create_navigation_entry_; + // Whether this interstitial is shown as a result of a new navigation (in + // which case a transient navigation entry is created). + bool new_navigation_; + + // Whether this interstitial is enabled. See Disable() for more info. + bool enabled_; + + // Whether the Proceed or DontProceed have been called yet. + bool action_taken_; + + // Notification magic.
+ NotificationRegistrar notification_registrar_;
+ + // The RenderViewHost displaying the interstitial contents. + RenderViewHost* render_view_host_; + + // Whether or not we should change the title of the tab when hidden (to revert + // it to its original value). + bool should_revert_tab_title_; - // Notification magic. - NotificationRegistrar notification_registrar_; + // The original title of the tab that should be reverted to when the + // interstitial is hidden. + std::wstring original_tab_title_; // We keep a map of the various blocking pages shown as the UI tests need to // be able to retrieve them. - typedef std::map<TabContents*,InterstitialPage*> InterstitialPageMap; + typedef std::map<WebContents*,InterstitialPage*> InterstitialPageMap; static InterstitialPageMap* tab_to_interstitial_page_; DISALLOW_COPY_AND_ASSIGN(InterstitialPage); |