| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "content/browser/web_contents/web_contents_impl.h" | 5 #include "content/browser/web_contents/web_contents_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 #include "content/browser/android/date_time_chooser_android.h" | 108 #include "content/browser/android/date_time_chooser_android.h" |
| 109 #include "content/browser/media/android/browser_media_player_manager.h" | 109 #include "content/browser/media/android/browser_media_player_manager.h" |
| 110 #include "content/browser/web_contents/web_contents_android.h" | 110 #include "content/browser/web_contents/web_contents_android.h" |
| 111 #include "content/public/browser/android/content_view_core.h" | 111 #include "content/public/browser/android/content_view_core.h" |
| 112 #endif | 112 #endif |
| 113 | 113 |
| 114 #if defined(OS_MACOSX) | 114 #if defined(OS_MACOSX) |
| 115 #include "base/mac/foundation_util.h" | 115 #include "base/mac/foundation_util.h" |
| 116 #endif | 116 #endif |
| 117 | 117 |
| 118 // Cross-Site Navigations | |
| 119 // | |
| 120 // If a WebContentsImpl is told to navigate to a different web site (as | |
| 121 // determined by SiteInstance), it will replace its current RenderViewHost with | |
| 122 // a new RenderViewHost dedicated to the new SiteInstance. This works as | |
| 123 // follows: | |
| 124 // | |
| 125 // - RVHM::Navigate determines whether the destination is cross-site, and if so, | |
| 126 // it creates a pending_render_view_host_. | |
| 127 // - The pending RVH is "suspended," so that no navigation messages are sent to | |
| 128 // its renderer until the beforeunload JavaScript handler has a chance to | |
| 129 // run in the current RVH. | |
| 130 // - The pending RVH tells CrossSiteRequestManager (a thread-safe singleton) | |
| 131 // that it has a pending cross-site request. We will check this on the IO | |
| 132 // thread when deciding how to handle the response. | |
| 133 // - The current RVH runs its beforeunload handler. If it returns false, we | |
| 134 // cancel all the pending logic. Otherwise we allow the pending RVH to send | |
| 135 // the navigation request to its renderer. | |
| 136 // - ResourceDispatcherHost receives a ResourceRequest on the IO thread for the | |
| 137 // main resource load on the pending RVH. It creates a | |
| 138 // CrossSiteResourceHandler to check whether a process swap is needed when | |
| 139 // the request is ready to commit. | |
| 140 // - When RDH receives a response, the BufferedResourceHandler determines | |
| 141 // whether it is a download. If so, it sends a message to the new renderer | |
| 142 // causing it to cancel the request, and the download proceeds. For now, the | |
| 143 // pending RVH remains until the next DidNavigate event for this | |
| 144 // WebContentsImpl. This isn't ideal, but it doesn't affect any functionality. | |
| 145 // - After RDH receives a response and determines that it is safe and not a | |
| 146 // download, the CrossSiteResourceHandler checks whether a process swap is | |
| 147 // needed (either because CrossSiteRequestManager has state for it or because | |
| 148 // a transfer was needed for a redirect). | |
| 149 // - If so, CrossSiteResourceHandler pauses the response to first run the old | |
| 150 // page's unload handler. It does this by asynchronously calling the | |
| 151 // OnCrossSiteResponse method of RenderFrameHostManager on the UI thread, | |
| 152 // which sends a SwapOut message to the current RVH. | |
| 153 // - Once the unload handler is finished, RVHM::SwappedOut checks if a transfer | |
| 154 // to a new process is needed, based on the stored pending_nav_params_. (This | |
| 155 // is independent of whether we started out with a cross-process navigation.) | |
| 156 // - If not, it just tells the ResourceDispatcherHost to resume the response | |
| 157 // to its current RenderViewHost. | |
| 158 // - If so, it cancels the current pending RenderViewHost and sets up a new | |
| 159 // navigation using RequestTransferURL. When the transferred request | |
| 160 // arrives in the ResourceDispatcherHost, we transfer the response and | |
| 161 // resume it. | |
| 162 // - The pending renderer sends a FrameNavigate message that invokes the | |
| 163 // DidNavigate method. This replaces the current RVH with the | |
| 164 // pending RVH. | |
| 165 // - The previous renderer is kept swapped out in RenderFrameHostManager in case | |
| 166 // the user goes back. The process only stays live if another tab is using | |
| 167 // it, but if so, the existing frame relationships will be maintained. | |
| 168 | |
| 169 namespace content { | 118 namespace content { |
| 170 namespace { | 119 namespace { |
| 171 | 120 |
| 172 const int kMinimumDelayBetweenLoadingUpdatesMS = 100; | 121 const int kMinimumDelayBetweenLoadingUpdatesMS = 100; |
| 173 | 122 |
| 174 // This matches what Blink's ProgressTracker has traditionally used for a | 123 // This matches what Blink's ProgressTracker has traditionally used for a |
| 175 // minimum progress value. | 124 // minimum progress value. |
| 176 const double kMinimumLoadingProgress = 0.1; | 125 const double kMinimumLoadingProgress = 0.1; |
| 177 | 126 |
| 178 const char kDotGoogleDotCom[] = ".google.com"; | 127 const char kDotGoogleDotCom[] = ".google.com"; |
| (...skipping 4194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4373 node->render_manager()->ResumeResponseDeferredAtStart(); | 4322 node->render_manager()->ResumeResponseDeferredAtStart(); |
| 4374 } | 4323 } |
| 4375 | 4324 |
| 4376 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { | 4325 void WebContentsImpl::SetForceDisableOverscrollContent(bool force_disable) { |
| 4377 force_disable_overscroll_content_ = force_disable; | 4326 force_disable_overscroll_content_ = force_disable; |
| 4378 if (view_) | 4327 if (view_) |
| 4379 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); | 4328 view_->SetOverscrollControllerEnabled(CanOverscrollContent()); |
| 4380 } | 4329 } |
| 4381 | 4330 |
| 4382 } // namespace content | 4331 } // namespace content |
| OLD | NEW |