Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "base/memory/weak_ptr.h" | 5 #include "base/memory/weak_ptr.h" |
| 6 #include "content/browser/frame_host/navigation_handle_impl.h" | 6 #include "content/browser/frame_host/navigation_handle_impl.h" |
| 7 #include "content/browser/web_contents/web_contents_impl.h" | 7 #include "content/browser/web_contents/web_contents_impl.h" |
| 8 #include "content/public/browser/web_contents.h" | 8 #include "content/public/browser/web_contents.h" |
| 9 #include "content/public/browser/web_contents_observer.h" | 9 #include "content/public/browser/web_contents_observer.h" |
| 10 #include "content/public/common/browser_side_navigation_policy.h" | 10 #include "content/public/common/browser_side_navigation_policy.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 : NavigationThrottle(handle), | 133 : NavigationThrottle(handle), |
| 134 will_start_result_(will_start_result), | 134 will_start_result_(will_start_result), |
| 135 will_redirect_result_(will_redirect_result), | 135 will_redirect_result_(will_redirect_result), |
| 136 will_process_result_(will_process_result), | 136 will_process_result_(will_process_result), |
| 137 did_call_will_start_(did_call_will_start), | 137 did_call_will_start_(did_call_will_start), |
| 138 did_call_will_redirect_(did_call_will_redirect), | 138 did_call_will_redirect_(did_call_will_redirect), |
| 139 did_call_will_process_(did_call_will_process) {} | 139 did_call_will_process_(did_call_will_process) {} |
| 140 ~TestNavigationThrottle() override {} | 140 ~TestNavigationThrottle() override {} |
| 141 | 141 |
| 142 void Resume() { navigation_handle()->Resume(); } | 142 void Resume() { navigation_handle()->Resume(); } |
| 143 void Cancel(NavigationThrottle::ThrottleCheckResult result) { | |
| 144 navigation_handle()->CancelDeferredNavigation(result); | |
| 145 } | |
| 143 | 146 |
| 144 RequestContextType request_context_type() { return request_context_type_; } | 147 RequestContextType request_context_type() { return request_context_type_; } |
| 145 | 148 |
| 146 private: | 149 private: |
| 147 // NavigationThrottle implementation. | 150 // NavigationThrottle implementation. |
| 148 NavigationThrottle::ThrottleCheckResult WillStartRequest() override { | 151 NavigationThrottle::ThrottleCheckResult WillStartRequest() override { |
| 149 NavigationHandleImpl* navigation_handle_impl = | 152 NavigationHandleImpl* navigation_handle_impl = |
| 150 static_cast<NavigationHandleImpl*>(navigation_handle()); | 153 static_cast<NavigationHandleImpl*>(navigation_handle()); |
| 151 CHECK_NE(REQUEST_CONTEXT_TYPE_UNSPECIFIED, | 154 CHECK_NE(REQUEST_CONTEXT_TYPE_UNSPECIFIED, |
| 152 navigation_handle_impl->request_context_type()); | 155 navigation_handle_impl->request_context_type()); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 180 | 183 |
| 181 NavigationThrottle::ThrottleCheckResult will_start_result_; | 184 NavigationThrottle::ThrottleCheckResult will_start_result_; |
| 182 NavigationThrottle::ThrottleCheckResult will_redirect_result_; | 185 NavigationThrottle::ThrottleCheckResult will_redirect_result_; |
| 183 NavigationThrottle::ThrottleCheckResult will_process_result_; | 186 NavigationThrottle::ThrottleCheckResult will_process_result_; |
| 184 base::Closure did_call_will_start_; | 187 base::Closure did_call_will_start_; |
| 185 base::Closure did_call_will_redirect_; | 188 base::Closure did_call_will_redirect_; |
| 186 base::Closure did_call_will_process_; | 189 base::Closure did_call_will_process_; |
| 187 RequestContextType request_context_type_ = REQUEST_CONTEXT_TYPE_UNSPECIFIED; | 190 RequestContextType request_context_type_ = REQUEST_CONTEXT_TYPE_UNSPECIFIED; |
| 188 }; | 191 }; |
| 189 | 192 |
| 190 // Install a TestNavigationThrottle on all following requests and allows waiting | 193 // Installs a TestNavigationThrottle either on all following requests or on |
| 191 // for various NavigationThrottle related events. Waiting works only for the | 194 // requests with an expected starting URL, and allows waiting for various |
| 192 // immediately next navigation. New instances are needed to wait for further | 195 // NavigationThrottle related events. Waiting works only for the immediately |
| 193 // navigations. | 196 // next navigation. New instances are needed to wait for further navigations. |
| 194 class TestNavigationThrottleInstaller : public WebContentsObserver { | 197 class TestNavigationThrottleInstaller : public WebContentsObserver { |
| 195 public: | 198 public: |
| 196 TestNavigationThrottleInstaller( | 199 TestNavigationThrottleInstaller( |
| 197 WebContents* web_contents, | 200 WebContents* web_contents, |
| 198 NavigationThrottle::ThrottleCheckResult will_start_result, | 201 NavigationThrottle::ThrottleCheckResult will_start_result, |
| 199 NavigationThrottle::ThrottleCheckResult will_redirect_result, | 202 NavigationThrottle::ThrottleCheckResult will_redirect_result, |
| 200 NavigationThrottle::ThrottleCheckResult will_process_result) | 203 NavigationThrottle::ThrottleCheckResult will_process_result, |
| 204 const GURL& expected_start_url = GURL()) | |
| 201 : WebContentsObserver(web_contents), | 205 : WebContentsObserver(web_contents), |
| 202 will_start_result_(will_start_result), | 206 will_start_result_(will_start_result), |
| 203 will_redirect_result_(will_redirect_result), | 207 will_redirect_result_(will_redirect_result), |
| 204 will_process_result_(will_process_result), | 208 will_process_result_(will_process_result), |
| 209 expected_start_url_(expected_start_url), | |
| 205 weak_factory_(this) {} | 210 weak_factory_(this) {} |
| 206 ~TestNavigationThrottleInstaller() override {} | 211 ~TestNavigationThrottleInstaller() override {} |
| 207 | 212 |
| 208 TestNavigationThrottle* navigation_throttle() { return navigation_throttle_; } | 213 TestNavigationThrottle* navigation_throttle() { return navigation_throttle_; } |
| 209 | 214 |
| 210 void WaitForThrottleWillStart() { | 215 void WaitForThrottleWillStart() { |
| 211 if (will_start_called_) | 216 if (will_start_called_) |
| 212 return; | 217 return; |
| 213 will_start_loop_runner_ = new MessageLoopRunner(); | 218 will_start_loop_runner_ = new MessageLoopRunner(); |
| 214 will_start_loop_runner_->Run(); | 219 will_start_loop_runner_->Run(); |
| 215 will_start_loop_runner_ = nullptr; | 220 will_start_loop_runner_ = nullptr; |
| 216 } | 221 } |
| 217 | 222 |
| 218 void WaitForThrottleWillRedirect() { | 223 void WaitForThrottleWillRedirect() { |
| 219 if (will_redirect_called_) | 224 if (will_redirect_called_) |
| 220 return; | 225 return; |
| 221 will_redirect_loop_runner_ = new MessageLoopRunner(); | 226 will_redirect_loop_runner_ = new MessageLoopRunner(); |
| 222 will_redirect_loop_runner_->Run(); | 227 will_redirect_loop_runner_->Run(); |
| 223 will_redirect_loop_runner_ = nullptr; | 228 will_redirect_loop_runner_ = nullptr; |
| 224 } | 229 } |
| 225 | 230 |
| 226 void WaitForThrottleWillProcess() { | 231 void WaitForThrottleWillProcess() { |
| 227 if (will_process_called_) | 232 if (will_process_called_) |
| 228 return; | 233 return; |
| 229 will_process_loop_runner_ = new MessageLoopRunner(); | 234 will_process_loop_runner_ = new MessageLoopRunner(); |
| 230 will_process_loop_runner_->Run(); | 235 will_process_loop_runner_->Run(); |
| 231 will_process_loop_runner_ = nullptr; | 236 will_process_loop_runner_ = nullptr; |
| 232 } | 237 } |
| 233 | 238 |
| 239 void Continue(NavigationThrottle::ThrottleCheckResult result) { | |
| 240 ASSERT_NE(NavigationThrottle::DEFER, result); | |
| 241 if (result == NavigationThrottle::PROCEED) | |
| 242 navigation_throttle()->Resume(); | |
| 243 else | |
| 244 navigation_throttle()->Cancel(result); | |
| 245 } | |
| 246 | |
| 234 int will_start_called() { return will_start_called_; } | 247 int will_start_called() { return will_start_called_; } |
| 235 int will_redirect_called() { return will_redirect_called_; } | 248 int will_redirect_called() { return will_redirect_called_; } |
| 236 int will_process_called() { return will_process_called_; } | 249 int will_process_called() { return will_process_called_; } |
| 237 | 250 |
| 238 int install_count() { return install_count_; } | 251 int install_count() { return install_count_; } |
| 239 | 252 |
| 253 protected: | |
| 254 virtual void DidCallWillStartRequest() { | |
| 255 will_start_called_++; | |
| 256 if (will_start_loop_runner_) | |
| 257 will_start_loop_runner_->Quit(); | |
| 258 } | |
| 259 | |
| 260 virtual void DidCallWillRedirectRequest() { | |
| 261 will_redirect_called_++; | |
| 262 if (will_redirect_loop_runner_) | |
| 263 will_redirect_loop_runner_->Quit(); | |
| 264 } | |
| 265 | |
| 266 virtual void DidCallWillProcessResponse() { | |
| 267 will_process_called_++; | |
| 268 if (will_process_loop_runner_) | |
| 269 will_process_loop_runner_->Quit(); | |
| 270 } | |
| 271 | |
| 240 private: | 272 private: |
| 241 void DidStartNavigation(NavigationHandle* handle) override { | 273 void DidStartNavigation(NavigationHandle* handle) override { |
| 274 if (!expected_start_url_.is_empty() && | |
| 275 handle->GetURL() != expected_start_url_) | |
| 276 return; | |
| 277 | |
| 242 std::unique_ptr<NavigationThrottle> throttle(new TestNavigationThrottle( | 278 std::unique_ptr<NavigationThrottle> throttle(new TestNavigationThrottle( |
| 243 handle, will_start_result_, will_redirect_result_, will_process_result_, | 279 handle, will_start_result_, will_redirect_result_, will_process_result_, |
| 244 base::Bind(&TestNavigationThrottleInstaller::DidCallWillStartRequest, | 280 base::Bind(&TestNavigationThrottleInstaller::DidCallWillStartRequest, |
| 245 weak_factory_.GetWeakPtr()), | 281 weak_factory_.GetWeakPtr()), |
| 246 base::Bind(&TestNavigationThrottleInstaller::DidCallWillRedirectRequest, | 282 base::Bind(&TestNavigationThrottleInstaller::DidCallWillRedirectRequest, |
| 247 weak_factory_.GetWeakPtr()), | 283 weak_factory_.GetWeakPtr()), |
| 248 base::Bind(&TestNavigationThrottleInstaller::DidCallWillProcessResponse, | 284 base::Bind(&TestNavigationThrottleInstaller::DidCallWillProcessResponse, |
| 249 weak_factory_.GetWeakPtr()))); | 285 weak_factory_.GetWeakPtr()))); |
| 250 navigation_throttle_ = static_cast<TestNavigationThrottle*>(throttle.get()); | 286 navigation_throttle_ = static_cast<TestNavigationThrottle*>(throttle.get()); |
| 251 handle->RegisterThrottleForTesting(std::move(throttle)); | 287 handle->RegisterThrottleForTesting(std::move(throttle)); |
| 252 ++install_count_; | 288 ++install_count_; |
| 253 } | 289 } |
| 254 | 290 |
| 255 void DidFinishNavigation(NavigationHandle* handle) override { | 291 void DidFinishNavigation(NavigationHandle* handle) override { |
| 256 if (!navigation_throttle_) | 292 if (!navigation_throttle_) |
| 257 return; | 293 return; |
| 258 | 294 |
| 259 if (handle == navigation_throttle_->navigation_handle()) | 295 if (handle == navigation_throttle_->navigation_handle()) |
| 260 navigation_throttle_ = nullptr; | 296 navigation_throttle_ = nullptr; |
| 261 } | 297 } |
| 262 | 298 |
| 263 void DidCallWillStartRequest() { | |
| 264 will_start_called_++; | |
| 265 if (will_start_loop_runner_) | |
| 266 will_start_loop_runner_->Quit(); | |
| 267 } | |
| 268 | |
| 269 void DidCallWillRedirectRequest() { | |
| 270 will_redirect_called_++; | |
| 271 if (will_redirect_loop_runner_) | |
| 272 will_redirect_loop_runner_->Quit(); | |
| 273 } | |
| 274 | |
| 275 void DidCallWillProcessResponse() { | |
| 276 will_process_called_++; | |
| 277 if (will_process_loop_runner_) | |
| 278 will_process_loop_runner_->Quit(); | |
| 279 } | |
| 280 | |
| 281 NavigationThrottle::ThrottleCheckResult will_start_result_; | 299 NavigationThrottle::ThrottleCheckResult will_start_result_; |
| 282 NavigationThrottle::ThrottleCheckResult will_redirect_result_; | 300 NavigationThrottle::ThrottleCheckResult will_redirect_result_; |
| 283 NavigationThrottle::ThrottleCheckResult will_process_result_; | 301 NavigationThrottle::ThrottleCheckResult will_process_result_; |
| 284 int will_start_called_ = 0; | 302 int will_start_called_ = 0; |
| 285 int will_redirect_called_ = 0; | 303 int will_redirect_called_ = 0; |
| 286 int will_process_called_ = 0; | 304 int will_process_called_ = 0; |
| 287 TestNavigationThrottle* navigation_throttle_ = nullptr; | 305 TestNavigationThrottle* navigation_throttle_ = nullptr; |
| 288 int install_count_ = 0; | 306 int install_count_ = 0; |
| 289 scoped_refptr<MessageLoopRunner> will_start_loop_runner_; | 307 scoped_refptr<MessageLoopRunner> will_start_loop_runner_; |
| 290 scoped_refptr<MessageLoopRunner> will_redirect_loop_runner_; | 308 scoped_refptr<MessageLoopRunner> will_redirect_loop_runner_; |
| 291 scoped_refptr<MessageLoopRunner> will_process_loop_runner_; | 309 scoped_refptr<MessageLoopRunner> will_process_loop_runner_; |
| 310 GURL expected_start_url_; | |
| 292 | 311 |
| 293 // The throttle installer can be deleted before all tasks posted by its | 312 // The throttle installer can be deleted before all tasks posted by its |
| 294 // throttles are run, so it must be referenced via weak pointers. | 313 // throttles are run, so it must be referenced via weak pointers. |
| 295 base::WeakPtrFactory<TestNavigationThrottleInstaller> weak_factory_; | 314 base::WeakPtrFactory<TestNavigationThrottleInstaller> weak_factory_; |
| 296 }; | 315 }; |
| 297 | 316 |
| 317 // Same as above, but installs NavigationThrottles that do not directly return | |
| 318 // the pre-programmed check results, but first DEFER the navigation at each | |
| 319 // stage and then resume/cancel asynchronously. | |
| 320 class TestDeferringNavigationThrottleInstaller | |
| 321 : public TestNavigationThrottleInstaller { | |
| 322 public: | |
| 323 TestDeferringNavigationThrottleInstaller( | |
| 324 WebContents* web_contents, | |
| 325 NavigationThrottle::ThrottleCheckResult will_start_result, | |
| 326 NavigationThrottle::ThrottleCheckResult will_redirect_result, | |
| 327 NavigationThrottle::ThrottleCheckResult will_process_result, | |
| 328 GURL expected_start_url = GURL()) | |
| 329 : TestNavigationThrottleInstaller(web_contents, | |
| 330 NavigationThrottle::DEFER, | |
| 331 NavigationThrottle::DEFER, | |
| 332 NavigationThrottle::DEFER, | |
| 333 expected_start_url), | |
| 334 will_start_deferred_result_(will_start_result), | |
| 335 will_redirect_deferred_result_(will_redirect_result), | |
| 336 will_process_deferred_result_(will_process_result) {} | |
| 337 | |
| 338 protected: | |
| 339 void DidCallWillStartRequest() override { | |
| 340 TestNavigationThrottleInstaller::DidCallWillStartRequest(); | |
| 341 Continue(will_start_deferred_result_); | |
| 342 } | |
| 343 | |
| 344 void DidCallWillRedirectRequest() override { | |
| 345 TestNavigationThrottleInstaller::DidCallWillStartRequest(); | |
| 346 Continue(will_redirect_deferred_result_); | |
| 347 } | |
| 348 | |
| 349 void DidCallWillProcessResponse() override { | |
| 350 TestNavigationThrottleInstaller::DidCallWillStartRequest(); | |
| 351 Continue(will_process_deferred_result_); | |
| 352 } | |
| 353 | |
| 354 private: | |
| 355 NavigationThrottle::ThrottleCheckResult will_start_deferred_result_; | |
| 356 NavigationThrottle::ThrottleCheckResult will_redirect_deferred_result_; | |
| 357 NavigationThrottle::ThrottleCheckResult will_process_deferred_result_; | |
| 358 }; | |
| 359 | |
| 298 // Records all navigation start URLs from the WebContents. | 360 // Records all navigation start URLs from the WebContents. |
| 299 class NavigationStartUrlRecorder : public WebContentsObserver { | 361 class NavigationStartUrlRecorder : public WebContentsObserver { |
| 300 public: | 362 public: |
| 301 NavigationStartUrlRecorder(WebContents* web_contents) | 363 NavigationStartUrlRecorder(WebContents* web_contents) |
| 302 : WebContentsObserver(web_contents) {} | 364 : WebContentsObserver(web_contents) {} |
| 303 | 365 |
| 304 void DidStartNavigation(NavigationHandle* navigation_handle) override { | 366 void DidStartNavigation(NavigationHandle* navigation_handle) override { |
| 305 urls_.push_back(navigation_handle->GetURL()); | 367 urls_.push_back(navigation_handle->GetURL()); |
| 306 } | 368 } |
| 307 | 369 |
| 308 const std::vector<GURL>& urls() const { return urls_; } | 370 const std::vector<GURL>& urls() const { return urls_; } |
| 309 | 371 |
| 310 private: | 372 private: |
| 311 std::vector<GURL> urls_; | 373 std::vector<GURL> urls_; |
| 312 }; | 374 }; |
| 313 | 375 |
| 376 bool IsChildFrameCollapsed(Shell* shell, const std::string& element_id) { | |
| 377 const char kScript[] = | |
| 378 "window.domAutomationController.send(" | |
| 379 " document.getElementById(\"%s\").clientWidth" | |
| 380 ");"; | |
| 381 int client_width = 0; | |
| 382 EXPECT_TRUE(ExecuteScriptAndExtractInt( | |
| 383 shell, base::StringPrintf(kScript, element_id.c_str()), &client_width)); | |
| 384 return !client_width; | |
| 385 } | |
| 386 | |
| 314 } // namespace | 387 } // namespace |
| 315 | 388 |
| 316 class NavigationHandleImplBrowserTest : public ContentBrowserTest { | 389 class NavigationHandleImplBrowserTest : public ContentBrowserTest { |
| 317 protected: | 390 protected: |
| 318 void SetUpOnMainThread() override { | 391 void SetUpOnMainThread() override { |
| 319 host_resolver()->AddRule("*", "127.0.0.1"); | 392 host_resolver()->AddRule("*", "127.0.0.1"); |
| 320 SetupCrossSiteRedirector(embedded_test_server()); | 393 SetupCrossSiteRedirector(embedded_test_server()); |
| 321 ASSERT_TRUE(embedded_test_server()->Start()); | 394 ASSERT_TRUE(embedded_test_server()->Start()); |
| 322 } | 395 } |
| 323 }; | 396 }; |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 712 // Wait for the end of the navigation. | 785 // Wait for the end of the navigation. |
| 713 navigation_observer.Wait(); | 786 navigation_observer.Wait(); |
| 714 | 787 |
| 715 EXPECT_TRUE(observer.has_committed()); | 788 EXPECT_TRUE(observer.has_committed()); |
| 716 EXPECT_TRUE(observer.was_redirected()); | 789 EXPECT_TRUE(observer.was_redirected()); |
| 717 EXPECT_FALSE(observer.is_error()); | 790 EXPECT_FALSE(observer.is_error()); |
| 718 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), | 791 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), |
| 719 GURL(embedded_test_server()->GetURL("bar.com", "/title2.html"))); | 792 GURL(embedded_test_server()->GetURL("bar.com", "/title2.html"))); |
| 720 } | 793 } |
| 721 | 794 |
| 795 // Ensure that a NavigationThrottle can block the navigation and collapse the | |
| 796 // frame owner both on request start as well as after a redirect. Plus, ensure | |
| 797 // that the frame is restored on the subsequent non-error-page navigation. | |
| 798 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest, | |
| 799 ThrottleBlockAndCollapse) { | |
| 800 const char kChildFrameId[] = "child0"; | |
| 801 GURL main_url(embedded_test_server()->GetURL( | |
| 802 "a.com", "/frame_tree/page_with_one_frame.html")); | |
| 803 GURL blocked_subframe_url(embedded_test_server()->GetURL( | |
| 804 "a.com", "/cross-site/baz.com/title1.html")); | |
| 805 GURL allowed_subframe_url(embedded_test_server()->GetURL( | |
| 806 "a.com", "/cross-site/baz.com/title2.html")); | |
| 807 GURL allowed_subframe_final_url( | |
| 808 embedded_test_server()->GetURL("baz.com", "/title2.html")); | |
| 809 | |
| 810 // Exercise both synchronous and deferred throttle check results, and both on | |
| 811 // WillStartRequest and on WillRedirectRequest. | |
| 812 const struct { | |
| 813 NavigationThrottle::ThrottleCheckResult will_start_result; | |
| 814 NavigationThrottle::ThrottleCheckResult will_redirect_result; | |
| 815 bool deferred_block; | |
| 816 } kTestCases[] = { | |
| 817 {NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, | |
| 818 NavigationThrottle::PROCEED, false}, | |
| 819 {NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, | |
| 820 NavigationThrottle::PROCEED, true}, | |
| 821 {NavigationThrottle::PROCEED, | |
| 822 NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, false}, | |
| 823 {NavigationThrottle::PROCEED, | |
| 824 NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, true}, | |
| 825 }; | |
| 826 | |
| 827 for (const auto& test_case : kTestCases) { | |
| 828 SCOPED_TRACE(::testing::Message() << test_case.will_start_result << ", " | |
| 829 << test_case.will_redirect_result << ", " | |
| 830 << test_case.deferred_block); | |
| 831 | |
| 832 if (!IsBrowserSideNavigationEnabled() && | |
| 833 test_case.will_redirect_result == | |
| 834 NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) { | |
| 835 continue; | |
| 836 } | |
| 837 | |
| 838 std::unique_ptr<TestNavigationThrottleInstaller> | |
| 839 subframe_throttle_installer; | |
| 840 if (test_case.deferred_block) { | |
| 841 subframe_throttle_installer.reset( | |
| 842 new TestDeferringNavigationThrottleInstaller( | |
| 843 shell()->web_contents(), test_case.will_start_result, | |
| 844 test_case.will_redirect_result, NavigationThrottle::PROCEED, | |
| 845 blocked_subframe_url)); | |
| 846 } else { | |
| 847 subframe_throttle_installer.reset(new TestNavigationThrottleInstaller( | |
| 848 shell()->web_contents(), test_case.will_start_result, | |
| 849 test_case.will_redirect_result, NavigationThrottle::PROCEED, | |
| 850 blocked_subframe_url)); | |
| 851 } | |
| 852 | |
| 853 { | |
| 854 SCOPED_TRACE("Initial navigation blocked on main frame load."); | |
| 855 NavigationHandleObserver subframe_observer(shell()->web_contents(), | |
| 856 blocked_subframe_url); | |
| 857 | |
| 858 ASSERT_TRUE(NavigateToURL(shell(), main_url)); | |
| 859 EXPECT_TRUE(subframe_observer.is_error()); | |
| 860 EXPECT_TRUE(subframe_observer.has_committed()); | |
| 861 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, subframe_observer.net_error_code()); | |
| 862 EXPECT_TRUE(IsChildFrameCollapsed(shell(), kChildFrameId)); | |
|
alexmos
2017/04/11 06:00:29
Could we also check that the corresponding FrameTr
engedy
2017/04/11 08:06:17
Sure. Done.
| |
| 863 } | |
| 864 | |
| 865 { | |
| 866 SCOPED_TRACE("Subsequent subframe navigation is allowed."); | |
| 867 NavigationHandleObserver subframe_observer(shell()->web_contents(), | |
| 868 allowed_subframe_url); | |
| 869 | |
| 870 ASSERT_TRUE(NavigateIframeToURL(shell()->web_contents(), kChildFrameId, | |
| 871 allowed_subframe_url)); | |
| 872 EXPECT_TRUE(subframe_observer.has_committed()); | |
| 873 EXPECT_FALSE(subframe_observer.is_error()); | |
| 874 EXPECT_EQ(allowed_subframe_final_url, | |
| 875 subframe_observer.last_committed_url()); | |
| 876 EXPECT_FALSE(IsChildFrameCollapsed(shell(), kChildFrameId)); | |
| 877 } | |
| 878 | |
| 879 { | |
| 880 SCOPED_TRACE("Subsequent subframe navigation is blocked."); | |
| 881 NavigationHandleObserver subframe_observer(shell()->web_contents(), | |
| 882 blocked_subframe_url); | |
| 883 | |
| 884 ASSERT_TRUE(NavigateIframeToURL(shell()->web_contents(), kChildFrameId, | |
| 885 blocked_subframe_url)); | |
| 886 | |
| 887 EXPECT_TRUE(subframe_observer.has_committed()); | |
| 888 EXPECT_TRUE(subframe_observer.is_error()); | |
| 889 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, subframe_observer.net_error_code()); | |
| 890 EXPECT_TRUE(IsChildFrameCollapsed(shell(), kChildFrameId)); | |
| 891 } | |
| 892 } | |
| 893 } | |
| 894 | |
| 722 // Checks that the RequestContextType value is properly set. | 895 // Checks that the RequestContextType value is properly set. |
| 723 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest, | 896 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest, |
| 724 VerifyRequestContextTypeForFrameTree) { | 897 VerifyRequestContextTypeForFrameTree) { |
| 725 GURL main_url(embedded_test_server()->GetURL( | 898 GURL main_url(embedded_test_server()->GetURL( |
| 726 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); | 899 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); |
| 727 GURL b_url(embedded_test_server()->GetURL( | 900 GURL b_url(embedded_test_server()->GetURL( |
| 728 "b.com", "/cross_site_iframe_factory.html?b(c())")); | 901 "b.com", "/cross_site_iframe_factory.html?b(c())")); |
| 729 GURL c_url(embedded_test_server()->GetURL( | 902 GURL c_url(embedded_test_server()->GetURL( |
| 730 "c.com", "/cross_site_iframe_factory.html?c()")); | 903 "c.com", "/cross_site_iframe_factory.html?c()")); |
| 731 | 904 |
| 732 TestNavigationThrottleInstaller installer( | 905 TestNavigationThrottleInstaller installer( |
| 733 shell()->web_contents(), NavigationThrottle::PROCEED, | 906 shell()->web_contents(), NavigationThrottle::PROCEED, |
| 734 NavigationThrottle::PROCEED, NavigationThrottle::PROCEED); | 907 NavigationThrottle::PROCEED, NavigationThrottle::PROCEED); |
| 735 TestNavigationManager main_manager(shell()->web_contents(), main_url); | 908 TestNavigationManager main_manager(shell()->web_contents(), main_url); |
| 736 TestNavigationManager b_manager(shell()->web_contents(), b_url); | 909 TestNavigationManager b_manager(shell()->web_contents(), b_url); |
| 737 TestNavigationManager c_manager(shell()->web_contents(), c_url); | 910 TestNavigationManager c_manager(shell()->web_contents(), c_url); |
| 738 NavigationStartUrlRecorder url_recorder(shell()->web_contents()); | 911 NavigationStartUrlRecorder url_recorder(shell()->web_contents()); |
| 739 | 912 |
| 740 // Starts and verifies the main frame navigation. | 913 // Starts and verifies the main frame navigation. |
| 741 shell()->LoadURL(main_url); | 914 shell()->LoadURL(main_url); |
| 742 EXPECT_TRUE(main_manager.WaitForRequestStart()); | 915 EXPECT_TRUE(main_manager.WaitForRequestStart()); |
| 743 // For each navigation a new throttle should have been installed. | 916 // For each navigation a new throttle should have been installed. |
| 744 EXPECT_EQ(1, installer.install_count()); | 917 EXPECT_EQ(1, installer.install_count()); |
| 745 // Checks the only URL recorded so far is the one expected for the main frame. | 918 // Checks the only URL recorded so far is the one expected for the main |
| 919 // frame. | |
|
alexmos
2017/04/11 06:00:29
nit: unnecessary churn?
engedy
2017/04/11 08:06:17
Looks like it, undone.
| |
| 746 EXPECT_EQ(main_url, url_recorder.urls().back()); | 920 EXPECT_EQ(main_url, url_recorder.urls().back()); |
| 747 EXPECT_EQ(1ul, url_recorder.urls().size()); | 921 EXPECT_EQ(1ul, url_recorder.urls().size()); |
| 748 // Checks the main frame RequestContextType. | 922 // Checks the main frame RequestContextType. |
| 749 EXPECT_EQ(REQUEST_CONTEXT_TYPE_LOCATION, | 923 EXPECT_EQ(REQUEST_CONTEXT_TYPE_LOCATION, |
| 750 installer.navigation_throttle()->request_context_type()); | 924 installer.navigation_throttle()->request_context_type()); |
| 751 | 925 |
| 752 // Ditto for frame b navigation. | 926 // Ditto for frame b navigation. |
| 753 main_manager.WaitForNavigationFinished(); | 927 main_manager.WaitForNavigationFinished(); |
| 754 EXPECT_TRUE(b_manager.WaitForRequestStart()); | 928 EXPECT_TRUE(b_manager.WaitForRequestStart()); |
| 755 EXPECT_EQ(2, installer.install_count()); | 929 EXPECT_EQ(2, installer.install_count()); |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1212 NavigationHandleObserver observer(shell()->web_contents(), error_url); | 1386 NavigationHandleObserver observer(shell()->web_contents(), error_url); |
| 1213 EXPECT_FALSE(NavigateToURL(shell(), error_url)); | 1387 EXPECT_FALSE(NavigateToURL(shell(), error_url)); |
| 1214 EXPECT_TRUE(observer.has_committed()); | 1388 EXPECT_TRUE(observer.has_committed()); |
| 1215 EXPECT_TRUE(observer.is_error()); | 1389 EXPECT_TRUE(observer.is_error()); |
| 1216 EXPECT_NE(site_instance, | 1390 EXPECT_NE(site_instance, |
| 1217 shell()->web_contents()->GetMainFrame()->GetSiteInstance()); | 1391 shell()->web_contents()->GetMainFrame()->GetSiteInstance()); |
| 1218 } | 1392 } |
| 1219 } | 1393 } |
| 1220 | 1394 |
| 1221 } // namespace content | 1395 } // namespace content |
| OLD | NEW |