Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(773)

Side by Side Diff: content/browser/frame_host/navigation_handle_impl_browsertest.cc

Issue 2632633006: Implement NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE. (Closed)
Patch Set: Fix navigation transition type. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/memory/weak_ptr.h" 6 #include "base/memory/weak_ptr.h"
7 #include "content/browser/frame_host/navigation_handle_impl.h" 7 #include "content/browser/frame_host/navigation_handle_impl.h"
8 #include "content/browser/web_contents/web_contents_impl.h" 8 #include "content/browser/web_contents/web_contents_impl.h"
9 #include "content/public/browser/web_contents.h" 9 #include "content/public/browser/web_contents.h"
10 #include "content/public/browser/web_contents_observer.h" 10 #include "content/public/browser/web_contents_observer.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 will_redirect_result_(will_redirect_result), 47 will_redirect_result_(will_redirect_result),
48 will_process_result_(will_process_result), 48 will_process_result_(will_process_result),
49 did_call_will_start_(did_call_will_start), 49 did_call_will_start_(did_call_will_start),
50 did_call_will_redirect_(did_call_will_redirect), 50 did_call_will_redirect_(did_call_will_redirect),
51 did_call_will_process_(did_call_will_process) {} 51 did_call_will_process_(did_call_will_process) {}
52 ~TestNavigationThrottle() override {} 52 ~TestNavigationThrottle() override {}
53 53
54 const char* GetNameForLogging() override { return "TestNavigationThrottle"; } 54 const char* GetNameForLogging() override { return "TestNavigationThrottle"; }
55 55
56 void Resume() { navigation_handle()->Resume(); } 56 void Resume() { navigation_handle()->Resume(); }
57 void Cancel(NavigationThrottle::ThrottleCheckResult result) {
58 navigation_handle()->CancelDeferredNavigation(result);
59 }
57 60
58 RequestContextType request_context_type() { return request_context_type_; } 61 RequestContextType request_context_type() { return request_context_type_; }
59 62
60 private: 63 private:
61 // NavigationThrottle implementation. 64 // NavigationThrottle implementation.
62 NavigationThrottle::ThrottleCheckResult WillStartRequest() override { 65 NavigationThrottle::ThrottleCheckResult WillStartRequest() override {
63 NavigationHandleImpl* navigation_handle_impl = 66 NavigationHandleImpl* navigation_handle_impl =
64 static_cast<NavigationHandleImpl*>(navigation_handle()); 67 static_cast<NavigationHandleImpl*>(navigation_handle());
65 CHECK_NE(REQUEST_CONTEXT_TYPE_UNSPECIFIED, 68 CHECK_NE(REQUEST_CONTEXT_TYPE_UNSPECIFIED,
66 navigation_handle_impl->request_context_type()); 69 navigation_handle_impl->request_context_type());
(...skipping 27 matching lines...) Expand all
94 97
95 NavigationThrottle::ThrottleCheckResult will_start_result_; 98 NavigationThrottle::ThrottleCheckResult will_start_result_;
96 NavigationThrottle::ThrottleCheckResult will_redirect_result_; 99 NavigationThrottle::ThrottleCheckResult will_redirect_result_;
97 NavigationThrottle::ThrottleCheckResult will_process_result_; 100 NavigationThrottle::ThrottleCheckResult will_process_result_;
98 base::Closure did_call_will_start_; 101 base::Closure did_call_will_start_;
99 base::Closure did_call_will_redirect_; 102 base::Closure did_call_will_redirect_;
100 base::Closure did_call_will_process_; 103 base::Closure did_call_will_process_;
101 RequestContextType request_context_type_ = REQUEST_CONTEXT_TYPE_UNSPECIFIED; 104 RequestContextType request_context_type_ = REQUEST_CONTEXT_TYPE_UNSPECIFIED;
102 }; 105 };
103 106
104 // Install a TestNavigationThrottle on all following requests and allows waiting 107 // Installs a TestNavigationThrottle either on all following requests or on
105 // for various NavigationThrottle related events. Waiting works only for the 108 // requests with an expected starting URL, and allows waiting for various
106 // immediately next navigation. New instances are needed to wait for further 109 // NavigationThrottle related events. Waiting works only for the immediately
107 // navigations. 110 // next navigation. New instances are needed to wait for further navigations.
108 class TestNavigationThrottleInstaller : public WebContentsObserver { 111 class TestNavigationThrottleInstaller : public WebContentsObserver {
109 public: 112 public:
110 TestNavigationThrottleInstaller( 113 TestNavigationThrottleInstaller(
111 WebContents* web_contents, 114 WebContents* web_contents,
112 NavigationThrottle::ThrottleCheckResult will_start_result, 115 NavigationThrottle::ThrottleCheckResult will_start_result,
113 NavigationThrottle::ThrottleCheckResult will_redirect_result, 116 NavigationThrottle::ThrottleCheckResult will_redirect_result,
114 NavigationThrottle::ThrottleCheckResult will_process_result) 117 NavigationThrottle::ThrottleCheckResult will_process_result,
118 const GURL& expected_start_url = GURL())
115 : WebContentsObserver(web_contents), 119 : WebContentsObserver(web_contents),
116 will_start_result_(will_start_result), 120 will_start_result_(will_start_result),
117 will_redirect_result_(will_redirect_result), 121 will_redirect_result_(will_redirect_result),
118 will_process_result_(will_process_result), 122 will_process_result_(will_process_result),
123 expected_start_url_(expected_start_url),
119 weak_factory_(this) {} 124 weak_factory_(this) {}
120 ~TestNavigationThrottleInstaller() override {} 125 ~TestNavigationThrottleInstaller() override {}
121 126
122 TestNavigationThrottle* navigation_throttle() { return navigation_throttle_; } 127 TestNavigationThrottle* navigation_throttle() { return navigation_throttle_; }
123 128
124 void WaitForThrottleWillStart() { 129 void WaitForThrottleWillStart() {
125 if (will_start_called_) 130 if (will_start_called_)
126 return; 131 return;
127 will_start_loop_runner_ = new MessageLoopRunner(); 132 will_start_loop_runner_ = new MessageLoopRunner();
128 will_start_loop_runner_->Run(); 133 will_start_loop_runner_->Run();
129 will_start_loop_runner_ = nullptr; 134 will_start_loop_runner_ = nullptr;
130 } 135 }
131 136
132 void WaitForThrottleWillRedirect() { 137 void WaitForThrottleWillRedirect() {
133 if (will_redirect_called_) 138 if (will_redirect_called_)
134 return; 139 return;
135 will_redirect_loop_runner_ = new MessageLoopRunner(); 140 will_redirect_loop_runner_ = new MessageLoopRunner();
136 will_redirect_loop_runner_->Run(); 141 will_redirect_loop_runner_->Run();
137 will_redirect_loop_runner_ = nullptr; 142 will_redirect_loop_runner_ = nullptr;
138 } 143 }
139 144
140 void WaitForThrottleWillProcess() { 145 void WaitForThrottleWillProcess() {
141 if (will_process_called_) 146 if (will_process_called_)
142 return; 147 return;
143 will_process_loop_runner_ = new MessageLoopRunner(); 148 will_process_loop_runner_ = new MessageLoopRunner();
144 will_process_loop_runner_->Run(); 149 will_process_loop_runner_->Run();
145 will_process_loop_runner_ = nullptr; 150 will_process_loop_runner_ = nullptr;
146 } 151 }
147 152
153 void Continue(NavigationThrottle::ThrottleCheckResult result) {
154 ASSERT_NE(NavigationThrottle::DEFER, result);
155 if (result == NavigationThrottle::PROCEED)
156 navigation_throttle()->Resume();
157 else
158 navigation_throttle()->Cancel(result);
159 }
160
148 int will_start_called() { return will_start_called_; } 161 int will_start_called() { return will_start_called_; }
149 int will_redirect_called() { return will_redirect_called_; } 162 int will_redirect_called() { return will_redirect_called_; }
150 int will_process_called() { return will_process_called_; } 163 int will_process_called() { return will_process_called_; }
151 164
152 int install_count() { return install_count_; } 165 int install_count() { return install_count_; }
153 166
167 protected:
168 virtual void DidCallWillStartRequest() {
169 will_start_called_++;
170 if (will_start_loop_runner_)
171 will_start_loop_runner_->Quit();
172 }
173
174 virtual void DidCallWillRedirectRequest() {
175 will_redirect_called_++;
176 if (will_redirect_loop_runner_)
177 will_redirect_loop_runner_->Quit();
178 }
179
180 virtual void DidCallWillProcessResponse() {
181 will_process_called_++;
182 if (will_process_loop_runner_)
183 will_process_loop_runner_->Quit();
184 }
185
154 private: 186 private:
155 void DidStartNavigation(NavigationHandle* handle) override { 187 void DidStartNavigation(NavigationHandle* handle) override {
188 if (!expected_start_url_.is_empty() &&
189 handle->GetURL() != expected_start_url_)
190 return;
191
156 std::unique_ptr<NavigationThrottle> throttle(new TestNavigationThrottle( 192 std::unique_ptr<NavigationThrottle> throttle(new TestNavigationThrottle(
157 handle, will_start_result_, will_redirect_result_, will_process_result_, 193 handle, will_start_result_, will_redirect_result_, will_process_result_,
158 base::Bind(&TestNavigationThrottleInstaller::DidCallWillStartRequest, 194 base::Bind(&TestNavigationThrottleInstaller::DidCallWillStartRequest,
159 weak_factory_.GetWeakPtr()), 195 weak_factory_.GetWeakPtr()),
160 base::Bind(&TestNavigationThrottleInstaller::DidCallWillRedirectRequest, 196 base::Bind(&TestNavigationThrottleInstaller::DidCallWillRedirectRequest,
161 weak_factory_.GetWeakPtr()), 197 weak_factory_.GetWeakPtr()),
162 base::Bind(&TestNavigationThrottleInstaller::DidCallWillProcessResponse, 198 base::Bind(&TestNavigationThrottleInstaller::DidCallWillProcessResponse,
163 weak_factory_.GetWeakPtr()))); 199 weak_factory_.GetWeakPtr())));
164 navigation_throttle_ = static_cast<TestNavigationThrottle*>(throttle.get()); 200 navigation_throttle_ = static_cast<TestNavigationThrottle*>(throttle.get());
165 handle->RegisterThrottleForTesting(std::move(throttle)); 201 handle->RegisterThrottleForTesting(std::move(throttle));
166 ++install_count_; 202 ++install_count_;
167 } 203 }
168 204
169 void DidFinishNavigation(NavigationHandle* handle) override { 205 void DidFinishNavigation(NavigationHandle* handle) override {
170 if (!navigation_throttle_) 206 if (!navigation_throttle_)
171 return; 207 return;
172 208
173 if (handle == navigation_throttle_->navigation_handle()) 209 if (handle == navigation_throttle_->navigation_handle())
174 navigation_throttle_ = nullptr; 210 navigation_throttle_ = nullptr;
175 } 211 }
176 212
177 void DidCallWillStartRequest() {
178 will_start_called_++;
179 if (will_start_loop_runner_)
180 will_start_loop_runner_->Quit();
181 }
182
183 void DidCallWillRedirectRequest() {
184 will_redirect_called_++;
185 if (will_redirect_loop_runner_)
186 will_redirect_loop_runner_->Quit();
187 }
188
189 void DidCallWillProcessResponse() {
190 will_process_called_++;
191 if (will_process_loop_runner_)
192 will_process_loop_runner_->Quit();
193 }
194
195 NavigationThrottle::ThrottleCheckResult will_start_result_; 213 NavigationThrottle::ThrottleCheckResult will_start_result_;
196 NavigationThrottle::ThrottleCheckResult will_redirect_result_; 214 NavigationThrottle::ThrottleCheckResult will_redirect_result_;
197 NavigationThrottle::ThrottleCheckResult will_process_result_; 215 NavigationThrottle::ThrottleCheckResult will_process_result_;
198 int will_start_called_ = 0; 216 int will_start_called_ = 0;
199 int will_redirect_called_ = 0; 217 int will_redirect_called_ = 0;
200 int will_process_called_ = 0; 218 int will_process_called_ = 0;
201 TestNavigationThrottle* navigation_throttle_ = nullptr; 219 TestNavigationThrottle* navigation_throttle_ = nullptr;
202 int install_count_ = 0; 220 int install_count_ = 0;
203 scoped_refptr<MessageLoopRunner> will_start_loop_runner_; 221 scoped_refptr<MessageLoopRunner> will_start_loop_runner_;
204 scoped_refptr<MessageLoopRunner> will_redirect_loop_runner_; 222 scoped_refptr<MessageLoopRunner> will_redirect_loop_runner_;
205 scoped_refptr<MessageLoopRunner> will_process_loop_runner_; 223 scoped_refptr<MessageLoopRunner> will_process_loop_runner_;
224 GURL expected_start_url_;
206 225
207 // The throttle installer can be deleted before all tasks posted by its 226 // The throttle installer can be deleted before all tasks posted by its
208 // throttles are run, so it must be referenced via weak pointers. 227 // throttles are run, so it must be referenced via weak pointers.
209 base::WeakPtrFactory<TestNavigationThrottleInstaller> weak_factory_; 228 base::WeakPtrFactory<TestNavigationThrottleInstaller> weak_factory_;
210 }; 229 };
211 230
231 // Same as above, but installs NavigationThrottles that do not directly return
232 // the pre-programmed check results, but first DEFER the navigation at each
233 // stage and then resume/cancel asynchronously.
234 class TestDeferringNavigationThrottleInstaller
235 : public TestNavigationThrottleInstaller {
236 public:
237 TestDeferringNavigationThrottleInstaller(
238 WebContents* web_contents,
239 NavigationThrottle::ThrottleCheckResult will_start_result,
240 NavigationThrottle::ThrottleCheckResult will_redirect_result,
241 NavigationThrottle::ThrottleCheckResult will_process_result,
242 GURL expected_start_url = GURL())
243 : TestNavigationThrottleInstaller(web_contents,
244 NavigationThrottle::DEFER,
245 NavigationThrottle::DEFER,
246 NavigationThrottle::DEFER,
247 expected_start_url),
248 will_start_deferred_result_(will_start_result),
249 will_redirect_deferred_result_(will_redirect_result),
250 will_process_deferred_result_(will_process_result) {}
251
252 protected:
253 void DidCallWillStartRequest() override {
254 TestNavigationThrottleInstaller::DidCallWillStartRequest();
255 Continue(will_start_deferred_result_);
256 }
257
258 void DidCallWillRedirectRequest() override {
259 TestNavigationThrottleInstaller::DidCallWillStartRequest();
260 Continue(will_redirect_deferred_result_);
261 }
262
263 void DidCallWillProcessResponse() override {
264 TestNavigationThrottleInstaller::DidCallWillStartRequest();
265 Continue(will_process_deferred_result_);
266 }
267
268 private:
269 NavigationThrottle::ThrottleCheckResult will_start_deferred_result_;
270 NavigationThrottle::ThrottleCheckResult will_redirect_deferred_result_;
271 NavigationThrottle::ThrottleCheckResult will_process_deferred_result_;
272 };
273
212 // Records all navigation start URLs from the WebContents. 274 // Records all navigation start URLs from the WebContents.
213 class NavigationStartUrlRecorder : public WebContentsObserver { 275 class NavigationStartUrlRecorder : public WebContentsObserver {
214 public: 276 public:
215 NavigationStartUrlRecorder(WebContents* web_contents) 277 NavigationStartUrlRecorder(WebContents* web_contents)
216 : WebContentsObserver(web_contents) {} 278 : WebContentsObserver(web_contents) {}
217 279
218 void DidStartNavigation(NavigationHandle* navigation_handle) override { 280 void DidStartNavigation(NavigationHandle* navigation_handle) override {
219 urls_.push_back(navigation_handle->GetURL()); 281 urls_.push_back(navigation_handle->GetURL());
220 } 282 }
221 283
222 const std::vector<GURL>& urls() const { return urls_; } 284 const std::vector<GURL>& urls() const { return urls_; }
223 285
224 private: 286 private:
225 std::vector<GURL> urls_; 287 std::vector<GURL> urls_;
226 }; 288 };
227 289
290 void ExpectChildFrameSetAsCollapsedInFTN(Shell* shell, bool expect_collapsed) {
291 // Check if the frame should be collapsed in theory as per FTN.
292 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell->web_contents())
293 ->GetFrameTree()
294 ->root();
295 ASSERT_EQ(1u, root->child_count());
296 FrameTreeNode* child = root->child_at(0u);
297 EXPECT_EQ(expect_collapsed, child->is_collapsed());
298 }
299
300 void ExpectChildFrameCollapsedInLayout(Shell* shell,
301 const std::string& frame_id,
302 bool expect_collapsed) {
303 // Check if the frame is collapsed in practice.
304 const char kScript[] =
305 "window.domAutomationController.send("
306 " document.getElementById(\"%s\").clientWidth"
307 ");";
308 int client_width = 0;
309 EXPECT_TRUE(ExecuteScriptAndExtractInt(
310 shell, base::StringPrintf(kScript, frame_id.c_str()), &client_width));
311 EXPECT_EQ(expect_collapsed, !client_width) << client_width;
312 }
313
314 void ExpectChildFrameCollapsed(Shell* shell,
315 const std::string& frame_id,
316 bool expect_collapsed) {
317 ExpectChildFrameSetAsCollapsedInFTN(shell, expect_collapsed);
318 ExpectChildFrameCollapsedInLayout(shell, frame_id, expect_collapsed);
319 }
320
228 } // namespace 321 } // namespace
229 322
230 class NavigationHandleImplBrowserTest : public ContentBrowserTest { 323 class NavigationHandleImplBrowserTest : public ContentBrowserTest {
231 protected: 324 protected:
232 void SetUpOnMainThread() override { 325 void SetUpOnMainThread() override {
233 host_resolver()->AddRule("*", "127.0.0.1"); 326 host_resolver()->AddRule("*", "127.0.0.1");
234 SetupCrossSiteRedirector(embedded_test_server()); 327 SetupCrossSiteRedirector(embedded_test_server());
235 ASSERT_TRUE(embedded_test_server()->Start()); 328 ASSERT_TRUE(embedded_test_server()->Start());
236 } 329 }
237 }; 330 };
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 // Wait for the end of the navigation. 719 // Wait for the end of the navigation.
627 navigation_observer.Wait(); 720 navigation_observer.Wait();
628 721
629 EXPECT_TRUE(observer.has_committed()); 722 EXPECT_TRUE(observer.has_committed());
630 EXPECT_TRUE(observer.was_redirected()); 723 EXPECT_TRUE(observer.was_redirected());
631 EXPECT_FALSE(observer.is_error()); 724 EXPECT_FALSE(observer.is_error());
632 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), 725 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(),
633 GURL(embedded_test_server()->GetURL("bar.com", "/title2.html"))); 726 GURL(embedded_test_server()->GetURL("bar.com", "/title2.html")));
634 } 727 }
635 728
729 // Ensure that a NavigationThrottle can block the navigation and collapse the
730 // frame owner both on request start as well as after a redirect. Plus, ensure
731 // that the frame is restored on the subsequent non-error-page navigation.
732 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest,
733 ThrottleBlockAndCollapse) {
734 const char kChildFrameId[] = "child0";
735 GURL main_url(embedded_test_server()->GetURL(
736 "a.com", "/frame_tree/page_with_one_frame.html"));
737 GURL blocked_subframe_url(embedded_test_server()->GetURL(
738 "a.com", "/cross-site/baz.com/title1.html"));
739 GURL allowed_subframe_url(embedded_test_server()->GetURL(
740 "a.com", "/cross-site/baz.com/title2.html"));
741 GURL allowed_subframe_final_url(
742 embedded_test_server()->GetURL("baz.com", "/title2.html"));
743
744 // Exercise both synchronous and deferred throttle check results, and both on
745 // WillStartRequest and on WillRedirectRequest.
746 const struct {
747 NavigationThrottle::ThrottleCheckResult will_start_result;
748 NavigationThrottle::ThrottleCheckResult will_redirect_result;
749 bool deferred_block;
750 } kTestCases[] = {
751 {NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE,
752 NavigationThrottle::PROCEED, false},
753 {NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE,
754 NavigationThrottle::PROCEED, true},
755 {NavigationThrottle::PROCEED,
756 NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, false},
757 {NavigationThrottle::PROCEED,
758 NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, true},
759 };
760
761 for (const auto& test_case : kTestCases) {
762 SCOPED_TRACE(::testing::Message() << test_case.will_start_result << ", "
763 << test_case.will_redirect_result << ", "
764 << test_case.deferred_block);
765
766 if (!IsBrowserSideNavigationEnabled() &&
767 test_case.will_redirect_result ==
768 NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE) {
769 continue;
770 }
771
772 std::unique_ptr<TestNavigationThrottleInstaller>
773 subframe_throttle_installer;
774 if (test_case.deferred_block) {
775 subframe_throttle_installer.reset(
776 new TestDeferringNavigationThrottleInstaller(
777 shell()->web_contents(), test_case.will_start_result,
778 test_case.will_redirect_result, NavigationThrottle::PROCEED,
779 blocked_subframe_url));
780 } else {
781 subframe_throttle_installer.reset(new TestNavigationThrottleInstaller(
782 shell()->web_contents(), test_case.will_start_result,
783 test_case.will_redirect_result, NavigationThrottle::PROCEED,
784 blocked_subframe_url));
785 }
786
787 {
788 SCOPED_TRACE("Initial navigation blocked on main frame load.");
789 NavigationHandleObserver subframe_observer(shell()->web_contents(),
790 blocked_subframe_url);
791
792 ASSERT_TRUE(NavigateToURL(shell(), main_url));
793 EXPECT_TRUE(subframe_observer.is_error());
794 EXPECT_TRUE(subframe_observer.has_committed());
795 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, subframe_observer.net_error_code());
796 ExpectChildFrameCollapsed(shell(), kChildFrameId,
797 true /* expect_collapsed */);
798 }
799
800 {
801 SCOPED_TRACE("Subsequent subframe navigation is allowed.");
802 NavigationHandleObserver subframe_observer(shell()->web_contents(),
803 allowed_subframe_url);
804
805 ASSERT_TRUE(NavigateIframeToURL(shell()->web_contents(), kChildFrameId,
806 allowed_subframe_url));
807 EXPECT_TRUE(subframe_observer.has_committed());
808 EXPECT_FALSE(subframe_observer.is_error());
809 EXPECT_EQ(allowed_subframe_final_url,
810 subframe_observer.last_committed_url());
811 ExpectChildFrameCollapsed(shell(), kChildFrameId,
812 false /* expect_collapsed */);
813 }
814
815 {
816 SCOPED_TRACE("Subsequent subframe navigation is blocked.");
817 NavigationHandleObserver subframe_observer(shell()->web_contents(),
818 blocked_subframe_url);
819
820 ASSERT_TRUE(NavigateIframeToURL(shell()->web_contents(), kChildFrameId,
821 blocked_subframe_url));
822
823 EXPECT_TRUE(subframe_observer.has_committed());
824 EXPECT_TRUE(subframe_observer.is_error());
825 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, subframe_observer.net_error_code());
826 ExpectChildFrameCollapsed(shell(), kChildFrameId,
827 true /* expect_collapsed */);
828 }
829 }
830 }
831
832 // BLOCK_REQUEST_AND_COLLAPSE should block the navigation in legacy <frame>'s,
833 // but should not collapse the <frame> element itself for legacy reasons.
834 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest,
835 ThrottleBlockAndCollapse_LegacyFrameNotCollapsed) {
836 const char kChildFrameId[] = "child0";
837 GURL main_url(embedded_test_server()->GetURL(
838 "a.com", "/frame_tree/legacy_frameset.html"));
839 GURL blocked_subframe_url(
840 embedded_test_server()->GetURL("a.com", "/title1.html"));
841 GURL allowed_subframe_url(
842 embedded_test_server()->GetURL("a.com", "/title2.html"));
843
844 TestNavigationThrottleInstaller subframe_throttle_installer(
845 shell()->web_contents(), NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE,
846 NavigationThrottle::PROCEED, NavigationThrottle::PROCEED,
847 blocked_subframe_url);
848
849 {
850 SCOPED_TRACE("Initial navigation blocked on main frame load.");
851 NavigationHandleObserver subframe_observer(shell()->web_contents(),
852 blocked_subframe_url);
853
854 ASSERT_TRUE(NavigateToURL(shell(), main_url));
855 EXPECT_TRUE(subframe_observer.is_error());
856 EXPECT_TRUE(subframe_observer.has_committed());
857 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, subframe_observer.net_error_code());
858 ExpectChildFrameSetAsCollapsedInFTN(shell(), true /* expect_collapsed */);
859 ExpectChildFrameCollapsedInLayout(shell(), kChildFrameId,
860 false /* expect_collapsed */);
861 }
862
863 {
864 SCOPED_TRACE("Subsequent subframe navigation is allowed.");
865 NavigationHandleObserver subframe_observer(shell()->web_contents(),
866 allowed_subframe_url);
867
868 ASSERT_TRUE(NavigateIframeToURL(shell()->web_contents(), kChildFrameId,
869 allowed_subframe_url));
870 EXPECT_TRUE(subframe_observer.has_committed());
871 EXPECT_FALSE(subframe_observer.is_error());
872 EXPECT_EQ(allowed_subframe_url, subframe_observer.last_committed_url());
873 ExpectChildFrameCollapsed(shell(), kChildFrameId,
874 false /* expect_collapsed */);
875 }
876 }
877
636 // Checks that the RequestContextType value is properly set. 878 // Checks that the RequestContextType value is properly set.
637 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest, 879 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest,
638 VerifyRequestContextTypeForFrameTree) { 880 VerifyRequestContextTypeForFrameTree) {
639 GURL main_url(embedded_test_server()->GetURL( 881 GURL main_url(embedded_test_server()->GetURL(
640 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); 882 "a.com", "/cross_site_iframe_factory.html?a(b(c))"));
641 GURL b_url(embedded_test_server()->GetURL( 883 GURL b_url(embedded_test_server()->GetURL(
642 "b.com", "/cross_site_iframe_factory.html?b(c())")); 884 "b.com", "/cross_site_iframe_factory.html?b(c())"));
643 GURL c_url(embedded_test_server()->GetURL( 885 GURL c_url(embedded_test_server()->GetURL(
644 "c.com", "/cross_site_iframe_factory.html?c()")); 886 "c.com", "/cross_site_iframe_factory.html?c()"));
645 887
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 NavigationHandleObserver observer(shell()->web_contents(), error_url); 1467 NavigationHandleObserver observer(shell()->web_contents(), error_url);
1226 EXPECT_FALSE(NavigateToURL(shell(), error_url)); 1468 EXPECT_FALSE(NavigateToURL(shell(), error_url));
1227 EXPECT_TRUE(observer.has_committed()); 1469 EXPECT_TRUE(observer.has_committed());
1228 EXPECT_TRUE(observer.is_error()); 1470 EXPECT_TRUE(observer.is_error());
1229 EXPECT_NE(site_instance, 1471 EXPECT_NE(site_instance,
1230 shell()->web_contents()->GetMainFrame()->GetSiteInstance()); 1472 shell()->web_contents()->GetMainFrame()->GetSiteInstance());
1231 } 1473 }
1232 } 1474 }
1233 1475
1234 } // namespace content 1476 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigation_handle_impl.cc ('k') | content/browser/frame_host/navigation_request.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698