Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / frame_host / interstitial_page_impl.h
1 // Copyright 2013 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 #ifndef CONTENT_BROWSER_FRAME_HOST_INTERSTITIAL_PAGE_IMPL_H_
6 #define CONTENT_BROWSER_FRAME_HOST_INTERSTITIAL_PAGE_IMPL_H_
7
8 #include "base/compiler_specific.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/memory/weak_ptr.h"
11 #include "content/browser/frame_host/frame_tree.h"
12 #include "content/browser/frame_host/navigator_delegate.h"
13 #include "content/browser/frame_host/render_frame_host_delegate.h"
14 #include "content/browser/renderer_host/render_view_host_delegate.h"
15 #include "content/browser/renderer_host/render_widget_host_delegate.h"
16 #include "content/public/browser/dom_operation_notification_details.h"
17 #include "content/public/browser/interstitial_page.h"
18 #include "content/public/browser/notification_observer.h"
19 #include "content/public/browser/notification_registrar.h"
20 #include "content/public/browser/web_contents_observer.h"
21 #include "content/public/common/renderer_preferences.h"
22 #include "url/gurl.h"
23
24 namespace content {
25 class NavigationEntry;
26 class NavigationControllerImpl;
27 class RenderViewHostImpl;
28 class RenderWidgetHostView;
29 class WebContentsView;
30
31 enum ResourceRequestAction {
32   BLOCK,
33   RESUME,
34   CANCEL
35 };
36
37 class CONTENT_EXPORT InterstitialPageImpl
38     : public NON_EXPORTED_BASE(InterstitialPage),
39       public NotificationObserver,
40       public NON_EXPORTED_BASE(RenderFrameHostDelegate),
41       public RenderViewHostDelegate,
42       public RenderWidgetHostDelegate,
43       public NON_EXPORTED_BASE(NavigatorDelegate) {
44  public:
45   // The different state of actions the user can take in an interstitial.
46   enum ActionState {
47     NO_ACTION,           // No action has been taken yet.
48     PROCEED_ACTION,      // "Proceed" was selected.
49     DONT_PROCEED_ACTION  // "Don't proceed" was selected.
50   };
51
52   InterstitialPageImpl(WebContents* web_contents,
53                        RenderWidgetHostDelegate* render_widget_host_delegate,
54                        bool new_navigation,
55                        const GURL& url,
56                        InterstitialPageDelegate* delegate);
57   ~InterstitialPageImpl() override;
58
59   // InterstitialPage implementation:
60   void Show() override;
61   void Hide() override;
62   void DontProceed() override;
63   void Proceed() override;
64   RenderViewHost* GetRenderViewHostForTesting() const override;
65   InterstitialPageDelegate* GetDelegateForTesting() override;
66   void DontCreateViewForTesting() override;
67   void SetSize(const gfx::Size& size) override;
68   void Focus() override;
69
70   // Allows the user to navigate away by disabling the interstitial, canceling
71   // the pending request, and unblocking the hidden renderer.  The interstitial
72   // will stay visible until the navigation completes.
73   void CancelForNavigation();
74
75   // Focus the first (last if reverse is true) element in the interstitial page.
76   // Called when tab traversing.
77   void FocusThroughTabTraversal(bool reverse);
78
79   RenderWidgetHostView* GetView();
80
81   // See description above field.
82   void set_reload_on_dont_proceed(bool value) {
83     reload_on_dont_proceed_ = value;
84   }
85   bool reload_on_dont_proceed() const { return reload_on_dont_proceed_; }
86
87 #if defined(OS_ANDROID)
88   // Android shares a single platform window for all tabs, so we need to expose
89   // the RenderViewHost to properly route gestures to the interstitial.
90   RenderViewHost* GetRenderViewHost() const;
91 #endif
92
93   // TODO(nasko): This should move to InterstitialPageNavigatorImpl, but in
94   // the meantime make it public, so it can be called directly.
95   void DidNavigate(
96       RenderViewHost* render_view_host,
97       const FrameHostMsg_DidCommitProvisionalLoad_Params& params);
98
99  protected:
100   // NotificationObserver method:
101   void Observe(int type,
102                const NotificationSource& source,
103                const NotificationDetails& details) override;
104
105   // RenderFrameHostDelegate implementation:
106   bool OnMessageReceived(RenderFrameHost* render_frame_host,
107                          const IPC::Message& message) override;
108   void RenderFrameCreated(RenderFrameHost* render_frame_host) override;
109   void UpdateTitle(RenderFrameHost* render_frame_host,
110                    int32 page_id,
111                    const base::string16& title,
112                    base::i18n::TextDirection title_direction) override;
113   AccessibilityMode GetAccessibilityMode() const override;
114
115   // RenderViewHostDelegate implementation:
116   RenderViewHostDelegateView* GetDelegateView() override;
117   bool OnMessageReceived(RenderViewHost* render_view_host,
118                          const IPC::Message& message) override;
119   const GURL& GetMainFrameLastCommittedURL() const override;
120   void RenderViewTerminated(RenderViewHost* render_view_host,
121                             base::TerminationStatus status,
122                             int error_code) override;
123   RendererPreferences GetRendererPrefs(
124       BrowserContext* browser_context) const override;
125   WebPreferences ComputeWebkitPrefs() override;
126   gfx::Rect GetRootWindowResizerRect() const override;
127   void CreateNewWindow(
128       int render_process_id,
129       int route_id,
130       int main_frame_route_id,
131       const ViewHostMsg_CreateWindow_Params& params,
132       SessionStorageNamespace* session_storage_namespace) override;
133   void CreateNewWidget(int render_process_id,
134                        int route_id,
135                        blink::WebPopupType popup_type) override;
136   void CreateNewFullscreenWidget(int render_process_id, int route_id) override;
137   void ShowCreatedWindow(int route_id,
138                          WindowOpenDisposition disposition,
139                          const gfx::Rect& initial_pos,
140                          bool user_gesture) override;
141   void ShowCreatedWidget(int route_id, const gfx::Rect& initial_pos) override;
142   void ShowCreatedFullscreenWidget(int route_id) override;
143
144   SessionStorageNamespace* GetSessionStorageNamespace(
145       SiteInstance* instance) override;
146
147   FrameTree* GetFrameTree() override;
148
149   // RenderWidgetHostDelegate implementation:
150   void RenderWidgetDeleted(RenderWidgetHostImpl* render_widget_host) override;
151   bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
152                               bool* is_keyboard_shortcut) override;
153   void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) override;
154 #if defined(OS_WIN)
155   virtual gfx::NativeViewAccessible GetParentNativeViewAccessible() override;
156 #endif
157
158   bool enabled() const { return enabled_; }
159   WebContents* web_contents() const;
160   const GURL& url() const { return url_; }
161
162   // Creates the WebContentsView that shows the interstitial RVH.
163   // Overriden in unit tests.
164   virtual WebContentsView* CreateWebContentsView();
165
166   // Notification magic.
167   NotificationRegistrar notification_registrar_;
168
169  private:
170   class InterstitialPageRVHDelegateView;
171   class UnderlyingContentObserver : public WebContentsObserver {
172    public:
173     UnderlyingContentObserver(WebContents* web_contents,
174                               InterstitialPageImpl* interstitial);
175
176     // WebContentsObserver implementation:
177     void WebContentsDestroyed() override;
178     void NavigationEntryCommitted(
179         const LoadCommittedDetails& load_details) override;
180
181     // This observer does not override OnMessageReceived or otherwise handle
182     // messages from the underlying content, because the interstitial should not
183     // care about them. Messages from the interstitial page (which has its own
184     // FrameTree) arrive through the RenderFrameHostDelegate interface, not
185     // WebContentsObserver.
186
187    private:
188     InterstitialPageImpl* const interstitial_;
189
190     DISALLOW_COPY_AND_ASSIGN(UnderlyingContentObserver);
191   };
192
193   // Disable the interstitial:
194   // - if it is not yet showing, then it won't be shown.
195   // - any command sent by the RenderViewHost will be ignored.
196   void Disable();
197
198   // Delete ourselves, causing Shutdown on the RVH to be called.
199   void Shutdown();
200
201   void OnNavigatingAwayOrTabClosing();
202
203   // Executes the passed action on the ResourceDispatcher (on the IO thread).
204   // Used to block/resume/cancel requests for the RenderViewHost hidden by this
205   // interstitial.
206   void TakeActionOnResourceDispatcher(ResourceRequestAction action);
207
208   // IPC message handlers.
209   void OnDomOperationResponse(const std::string& json_string,
210                               int automation_id);
211
212   // Creates the RenderViewHost containing the interstitial content.
213   RenderViewHostImpl* CreateRenderViewHost();
214
215   // Watches the underlying WebContents for reasons to cancel the interstitial.
216   UnderlyingContentObserver underlying_content_observer_;
217
218   // The contents in which we are displayed.  This is valid until Hide is
219   // called, at which point it will be set to NULL because the WebContents
220   // itself may be deleted.
221   WebContents* web_contents_;
222
223   // The NavigationController for the content this page is being displayed over.
224   NavigationControllerImpl* controller_;
225
226   // Delegate for dispatching keyboard events and accessing the native view.
227   RenderWidgetHostDelegate* render_widget_host_delegate_;
228
229   // The URL that is shown when the interstitial is showing.
230   GURL url_;
231
232   // Whether this interstitial is shown as a result of a new navigation (in
233   // which case a transient navigation entry is created).
234   bool new_navigation_;
235
236   // Whether we should discard the pending navigation entry when not proceeding.
237   // This is to deal with cases where |new_navigation_| is true but a new
238   // pending entry was created since this interstitial was shown and we should
239   // not discard it.
240   bool should_discard_pending_nav_entry_;
241
242   // If true and the user chooses not to proceed the target NavigationController
243   // is reloaded. This is used when two NavigationControllers are merged
244   // (CopyStateFromAndPrune).
245   // The default is false.
246   bool reload_on_dont_proceed_;
247
248   // Whether this interstitial is enabled.  See Disable() for more info.
249   bool enabled_;
250
251   // Whether the Proceed or DontProceed methods have been called yet.
252   ActionState action_taken_;
253
254   // The RenderViewHost displaying the interstitial contents.  This is valid
255   // until Hide is called, at which point it will be set to NULL, signifying
256   // that shutdown has started.
257   // TODO(creis): This is now owned by the FrameTree.  We should route things
258   // through the tree's root RenderFrameHost instead.
259   RenderViewHostImpl* render_view_host_;
260
261   // The frame tree structure of the current page.
262   FrameTree frame_tree_;
263
264   // The IDs for the Render[View|Process]Host hidden by this interstitial.
265   int original_child_id_;
266   int original_rvh_id_;
267
268   // Whether or not we should change the title of the contents when hidden (to
269   // revert it to its original value).
270   bool should_revert_web_contents_title_;
271
272   // Whether or not the contents was loading resources when the interstitial was
273   // shown.  We restore this state if the user proceeds from the interstitial.
274   bool web_contents_was_loading_;
275
276   // Whether the ResourceDispatcherHost has been notified to cancel/resume the
277   // resource requests blocked for the RenderViewHost.
278   bool resource_dispatcher_host_notified_;
279
280   // The original title of the contents that should be reverted to when the
281   // interstitial is hidden.
282   base::string16 original_web_contents_title_;
283
284   // Our RenderViewHostViewDelegate, necessary for accelerators to work.
285   scoped_ptr<InterstitialPageRVHDelegateView> rvh_delegate_view_;
286
287   // Settings passed to the renderer.
288   mutable RendererPreferences renderer_preferences_;
289
290   bool create_view_;
291
292   scoped_ptr<InterstitialPageDelegate> delegate_;
293
294   scoped_refptr<SessionStorageNamespace> session_storage_namespace_;
295
296   base::WeakPtrFactory<InterstitialPageImpl> weak_ptr_factory_;
297
298   DISALLOW_COPY_AND_ASSIGN(InterstitialPageImpl);
299 };
300
301 }  // namespace content
302
303 #endif  // CONTENT_BROWSER_FRAME_HOST_INTERSTITIAL_PAGE_IMPL_H_