OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ | 5 #ifndef CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ |
6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ | 6 #define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 // Received a response from CrossSiteResourceHandler. If the navigation | 238 // Received a response from CrossSiteResourceHandler. If the navigation |
239 // specifies a transition, this is called and the navigation will not resume | 239 // specifies a transition, this is called and the navigation will not resume |
240 // until ResumeResponseDeferredAtStart. | 240 // until ResumeResponseDeferredAtStart. |
241 void OnDeferredAfterResponseStarted( | 241 void OnDeferredAfterResponseStarted( |
242 const GlobalRequestID& global_request_id, | 242 const GlobalRequestID& global_request_id, |
243 RenderFrameHostImpl* pending_render_frame_host); | 243 RenderFrameHostImpl* pending_render_frame_host); |
244 | 244 |
245 // Resume navigation paused after receiving response headers. | 245 // Resume navigation paused after receiving response headers. |
246 void ResumeResponseDeferredAtStart(); | 246 void ResumeResponseDeferredAtStart(); |
247 | 247 |
248 // The RenderFrameHost has been swapped out, so we should resume the pending | |
249 // network response and allow the pending RenderFrameHost to commit. | |
250 void SwappedOut(RenderFrameHostImpl* render_frame_host); | |
251 | |
252 // Called when a renderer's frame navigates. | 248 // Called when a renderer's frame navigates. |
253 void DidNavigateFrame(RenderFrameHostImpl* render_frame_host); | 249 void DidNavigateFrame(RenderFrameHostImpl* render_frame_host); |
254 | 250 |
255 // Called when a renderer sets its opener to null. | 251 // Called when a renderer sets its opener to null. |
256 void DidDisownOpener(RenderViewHost* render_view_host); | 252 void DidDisownOpener(RenderViewHost* render_view_host); |
257 | 253 |
258 // Helper method to create and initialize a RenderFrameHost. If |swapped_out| | 254 // Helper method to create and initialize a RenderFrameHost. If |swapped_out| |
259 // is true, it will be initially placed on the swapped out hosts list. | 255 // is true, it will be initially placed on the swapped out hosts list. |
260 // Returns the routing id of the *view* associated with the frame. | 256 // Returns the routing id of the *view* associated with the frame. |
261 int CreateRenderFrame(SiteInstance* instance, | 257 int CreateRenderFrame(SiteInstance* instance, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 bool IsRVHOnSwappedOutList(RenderViewHostImpl* rvh) const; | 293 bool IsRVHOnSwappedOutList(RenderViewHostImpl* rvh) const; |
298 bool IsOnSwappedOutList(RenderFrameHostImpl* rfh) const; | 294 bool IsOnSwappedOutList(RenderFrameHostImpl* rfh) const; |
299 | 295 |
300 // Returns the swapped out RenderViewHost or RenderFrameHost for the given | 296 // Returns the swapped out RenderViewHost or RenderFrameHost for the given |
301 // SiteInstance, if any. This method is *deprecated* and | 297 // SiteInstance, if any. This method is *deprecated* and |
302 // GetRenderFrameProxyHost should be used. | 298 // GetRenderFrameProxyHost should be used. |
303 RenderViewHostImpl* GetSwappedOutRenderViewHost(SiteInstance* instance) const; | 299 RenderViewHostImpl* GetSwappedOutRenderViewHost(SiteInstance* instance) const; |
304 RenderFrameProxyHost* GetRenderFrameProxyHost( | 300 RenderFrameProxyHost* GetRenderFrameProxyHost( |
305 SiteInstance* instance) const; | 301 SiteInstance* instance) const; |
306 | 302 |
307 // Runs the unload handler in the current page, when we know that a pending | |
308 // cross-process navigation is going to commit. We may initiate a transfer | |
309 // to a new process after this completes or times out. | |
310 void SwapOutOldPage(); | |
311 | |
312 // Deletes a RenderFrameHost that was pending shutdown. | 303 // Deletes a RenderFrameHost that was pending shutdown. |
313 void ClearPendingShutdownRFHForSiteInstance(int32 site_instance_id, | 304 void ClearPendingShutdownRFHForSiteInstance(int32 site_instance_id, |
314 RenderFrameHostImpl* rfh); | 305 RenderFrameHostImpl* rfh); |
315 | 306 |
316 // Deletes any proxy hosts associated with this node. Used during destruction | 307 // Deletes any proxy hosts associated with this node. Used during destruction |
317 // of WebContentsImpl. | 308 // of WebContentsImpl. |
318 void ResetProxyHosts(); | 309 void ResetProxyHosts(); |
319 | 310 |
320 // Returns the routing id for a RenderFrameHost or RenderFrameHostProxy | 311 // Returns the routing id for a RenderFrameHost or RenderFrameHostProxy |
321 // that has the given SiteInstance and is associated with this | 312 // that has the given SiteInstance and is associated with this |
(...skipping 17 matching lines...) Expand all Loading... |
339 // select a renderer to use for the navigation. | 330 // select a renderer to use for the navigation. |
340 void CommitNavigation(const NavigationBeforeCommitInfo& info); | 331 void CommitNavigation(const NavigationBeforeCommitInfo& info); |
341 | 332 |
342 private: | 333 private: |
343 friend class RenderFrameHostManagerTest; | 334 friend class RenderFrameHostManagerTest; |
344 friend class TestWebContents; | 335 friend class TestWebContents; |
345 | 336 |
346 FRIEND_TEST_ALL_PREFIXES(CrossProcessFrameTreeBrowserTest, | 337 FRIEND_TEST_ALL_PREFIXES(CrossProcessFrameTreeBrowserTest, |
347 CreateCrossProcessSubframeProxies); | 338 CreateCrossProcessSubframeProxies); |
348 | 339 |
349 // Tracks information about a navigation while a cross-process transition is | |
350 // in progress, in case we need to transfer it to a new RenderFrameHost. | |
351 // When a request is being transferred, deleting the PendingNavigationParams, | |
352 // and thus |cross_site_transferring_request|, will cancel the request being | |
353 // transferred, unless its ReleaseRequest method has been called. | |
354 struct PendingNavigationParams { | |
355 PendingNavigationParams( | |
356 const GlobalRequestID& global_request_id, | |
357 scoped_ptr<CrossSiteTransferringRequest> | |
358 cross_site_transferring_request, | |
359 const std::vector<GURL>& transfer_url, | |
360 Referrer referrer, | |
361 PageTransition page_transition, | |
362 int render_frame_id, | |
363 bool should_replace_current_entry); | |
364 ~PendingNavigationParams(); | |
365 | |
366 // The child ID and request ID for the pending navigation. Present whether | |
367 // |request_transfer| is NULL or not. | |
368 GlobalRequestID global_request_id; | |
369 | |
370 // If a pending request needs to be transferred to another process, this | |
371 // owns the request until it's transferred to the new process, so it will be | |
372 // cleaned up if the navigation is cancelled. Otherwise, this is NULL. | |
373 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request; | |
374 | |
375 // If |request_transfer| is non-NULL, the values below are all set. | |
376 | |
377 // The first entry is the original request URL, and the last entry is the | |
378 // destination URL to request in the new process. | |
379 std::vector<GURL> transfer_url_chain; | |
380 | |
381 // This is the referrer to use for the request in the new process. | |
382 Referrer referrer; | |
383 | |
384 // This is the transition type for the original navigation. | |
385 PageTransition page_transition; | |
386 | |
387 // This is the frame routing ID to use in RequestTransferURL. | |
388 int render_frame_id; | |
389 | |
390 // This is whether the navigation should replace the current history entry. | |
391 bool should_replace_current_entry; | |
392 }; | |
393 | |
394 // Returns the current navigation request (used in the PlzNavigate navigation | 340 // Returns the current navigation request (used in the PlzNavigate navigation |
395 // logic refactoring project). | 341 // logic refactoring project). |
396 NavigationRequest* navigation_request_for_testing() const { | 342 NavigationRequest* navigation_request_for_testing() const { |
397 return navigation_request_.get(); } | 343 return navigation_request_.get(); } |
398 | 344 |
399 // Used with FrameTree::ForEach to erase RenderFrameProxyHosts from a | 345 // Used with FrameTree::ForEach to erase RenderFrameProxyHosts from a |
400 // FrameTreeNode's RenderFrameHostManager. | 346 // FrameTreeNode's RenderFrameHostManager. |
401 static bool ClearProxiesInSiteInstance(int32 site_instance_id, | 347 static bool ClearProxiesInSiteInstance(int32 site_instance_id, |
402 FrameTreeNode* node); | 348 FrameTreeNode* node); |
403 | 349 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 | 428 |
483 // Initialization for RenderFrameHost uses the same sequence as InitRenderView | 429 // Initialization for RenderFrameHost uses the same sequence as InitRenderView |
484 // above. | 430 // above. |
485 bool InitRenderFrame(RenderFrameHost* render_frame_host); | 431 bool InitRenderFrame(RenderFrameHost* render_frame_host); |
486 | 432 |
487 // Sets the pending RenderFrameHost/WebUI to be the active one. Note that this | 433 // Sets the pending RenderFrameHost/WebUI to be the active one. Note that this |
488 // doesn't require the pending render_frame_host_ pointer to be non-NULL, | 434 // doesn't require the pending render_frame_host_ pointer to be non-NULL, |
489 // since there could be Web UI switching as well. Call this for every commit. | 435 // since there could be Web UI switching as well. Call this for every commit. |
490 void CommitPending(); | 436 void CommitPending(); |
491 | 437 |
| 438 // Runs the unload handler in the current page, after the new page has |
| 439 // committed. |
| 440 void SwapOutOldPage(RenderFrameHostImpl* old_render_frame_host); |
| 441 |
492 // Shutdown all RenderFrameProxyHosts in a SiteInstance. This is called to | 442 // Shutdown all RenderFrameProxyHosts in a SiteInstance. This is called to |
493 // shutdown frames when all the frames in a SiteInstance are confirmed to be | 443 // shutdown frames when all the frames in a SiteInstance are confirmed to be |
494 // swapped out. | 444 // swapped out. |
495 void ShutdownRenderFrameProxyHostsInSiteInstance(int32 site_instance_id); | 445 void ShutdownRenderFrameProxyHostsInSiteInstance(int32 site_instance_id); |
496 | 446 |
497 // Helper method to terminate the pending RenderViewHost. | 447 // Helper method to terminate the pending RenderViewHost. |
498 void CancelPending(); | 448 void CancelPending(); |
499 | 449 |
500 // Helper method to set the active RenderFrameHost. Returns the old | 450 // Helper method to set the active RenderFrameHost. Returns the old |
501 // RenderFrameHost and updates counts. | 451 // RenderFrameHost and updates counts. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 // have an associated Web UI, in which case the Web UI pointer will be non- | 493 // have an associated Web UI, in which case the Web UI pointer will be non- |
544 // NULL. | 494 // NULL. |
545 // | 495 // |
546 // The |pending_web_ui_| may be non-NULL even when the | 496 // The |pending_web_ui_| may be non-NULL even when the |
547 // |pending_render_frame_host_| is NULL. This will happen when we're | 497 // |pending_render_frame_host_| is NULL. This will happen when we're |
548 // transitioning between two Web UI pages: the RFH won't be swapped, so the | 498 // transitioning between two Web UI pages: the RFH won't be swapped, so the |
549 // pending pointer will be unused, but there will be a pending Web UI | 499 // pending pointer will be unused, but there will be a pending Web UI |
550 // associated with the navigation. | 500 // associated with the navigation. |
551 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host_; | 501 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host_; |
552 | 502 |
553 // Tracks information about any current pending cross-process navigation. | 503 // If a pending request needs to be transferred to another process, this |
554 scoped_ptr<PendingNavigationParams> pending_nav_params_; | 504 // owns the request until it's transferred to the new process, so it will be |
| 505 // cleaned up if the navigation is cancelled. Otherwise, this is NULL. |
| 506 scoped_ptr<CrossSiteTransferringRequest> cross_site_transferring_request_; |
555 | 507 |
556 // Tracks information about any navigation paused after receiving response | 508 // Tracks information about any navigation paused after receiving response |
557 // headers. | 509 // headers. |
558 scoped_ptr<GlobalRequestID> response_started_id_; | 510 scoped_ptr<GlobalRequestID> response_started_id_; |
559 | 511 |
560 // If either of these is non-NULL, the pending navigation is to a chrome: | 512 // If either of these is non-NULL, the pending navigation is to a chrome: |
561 // page. The scoped_ptr is used if pending_web_ui_ != web_ui_, the WeakPtr is | 513 // page. The scoped_ptr is used if pending_web_ui_ != web_ui_, the WeakPtr is |
562 // used for when they reference the same object. If either is non-NULL, the | 514 // used for when they reference the same object. If either is non-NULL, the |
563 // other should be NULL. | 515 // other should be NULL. |
564 scoped_ptr<WebUIImpl> pending_web_ui_; | 516 scoped_ptr<WebUIImpl> pending_web_ui_; |
(...skipping 19 matching lines...) Expand all Loading... |
584 scoped_ptr<NavigationRequest> navigation_request_; | 536 scoped_ptr<NavigationRequest> navigation_request_; |
585 | 537 |
586 base::WeakPtrFactory<RenderFrameHostManager> weak_factory_; | 538 base::WeakPtrFactory<RenderFrameHostManager> weak_factory_; |
587 | 539 |
588 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager); | 540 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager); |
589 }; | 541 }; |
590 | 542 |
591 } // namespace content | 543 } // namespace content |
592 | 544 |
593 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ | 545 #endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_MANAGER_H_ |
OLD | NEW |