OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/frame_host/navigation_controller_impl.h" | 5 #include "content/browser/frame_host/navigation_controller_impl.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
43 #include "content/public/test/browser_test_utils.h" | 43 #include "content/public/test/browser_test_utils.h" |
44 #include "content/public/test/content_browser_test.h" | 44 #include "content/public/test/content_browser_test.h" |
45 #include "content/public/test/content_browser_test_utils.h" | 45 #include "content/public/test/content_browser_test_utils.h" |
46 #include "content/public/test/test_navigation_observer.h" | 46 #include "content/public/test/test_navigation_observer.h" |
47 #include "content/public/test/test_utils.h" | 47 #include "content/public/test/test_utils.h" |
48 #include "content/shell/browser/shell.h" | 48 #include "content/shell/browser/shell.h" |
49 #include "content/shell/common/shell_switches.h" | 49 #include "content/shell/common/shell_switches.h" |
50 #include "content/test/content_browser_test_utils_internal.h" | 50 #include "content/test/content_browser_test_utils_internal.h" |
51 #include "net/dns/mock_host_resolver.h" | 51 #include "net/dns/mock_host_resolver.h" |
52 #include "net/test/embedded_test_server/embedded_test_server.h" | 52 #include "net/test/embedded_test_server/embedded_test_server.h" |
53 #include "net/test/embedded_test_server/embedded_test_server_connection_listener .h" | |
53 #include "net/test/embedded_test_server/http_request.h" | 54 #include "net/test/embedded_test_server/http_request.h" |
54 #include "net/test/url_request/url_request_failed_job.h" | 55 #include "net/test/url_request/url_request_failed_job.h" |
55 #include "testing/gmock/include/gmock/gmock-matchers.h" | 56 #include "testing/gmock/include/gmock/gmock-matchers.h" |
56 | 57 |
57 namespace { | 58 namespace { |
58 | 59 |
59 static std::string kAddNamedFrameScript = | 60 static std::string kAddNamedFrameScript = |
60 "var f = document.createElement('iframe');" | 61 "var f = document.createElement('iframe');" |
61 "f.name = 'foo-frame-name';" | 62 "f.name = 'foo-frame-name';" |
62 "document.body.appendChild(f);"; | 63 "document.body.appendChild(f);"; |
63 static std::string kAddFrameScript = | 64 static std::string kAddFrameScript = |
64 "var f = document.createElement('iframe');" | 65 "var f = document.createElement('iframe');" |
65 "document.body.appendChild(f);"; | 66 "document.body.appendChild(f);"; |
66 static std::string kRemoveFrameScript = | 67 static std::string kRemoveFrameScript = |
67 "var f = document.querySelector('iframe');" | 68 "var f = document.querySelector('iframe');" |
68 "f.parentNode.removeChild(f);"; | 69 "f.parentNode.removeChild(f);"; |
69 | 70 |
70 } // namespace | 71 } // namespace |
71 | 72 |
72 namespace content { | 73 namespace content { |
73 | 74 |
75 // Gets notified by the EmbeddedTestServer on incoming requests. | |
76 class ConnectionListener | |
clamy
2016/12/22 17:30:25
Did you find this class in use somewhere in Chrome
arthursonzogni
2017/01/05 17:04:22
Yes I found it there:
https://cs.chromium.org/chro
| |
77 : public net::test_server::EmbeddedTestServerConnectionListener { | |
78 public: | |
79 | |
80 ConnectionListener() | |
81 : bytes_read(0) {} | |
82 ~ConnectionListener() override {} | |
83 | |
84 // Get called from the EmbeddedTestServer thread to be notified that | |
85 // a connection was accepted. | |
86 void AcceptedSocket(const net::StreamSocket& connection) override {} | |
87 | |
88 // Get called from the EmbeddedTestServer thread to be notified that | |
89 // a connection was read from. | |
90 void ReadFromSocket(const net::StreamSocket& connection, int bytes) override { | |
91 base::AutoLock lock(lock_); | |
92 bytes_read += bytes; | |
93 } | |
94 | |
95 int BytesRead() { | |
96 base::AutoLock lock(lock_); | |
97 return bytes_read; | |
98 } | |
99 | |
100 void ResetBytesRead() { | |
101 base::AutoLock lock(lock_); | |
102 bytes_read = 0; | |
103 } | |
104 | |
105 private: | |
106 // This lock protects all the members below, which each are used on both the | |
107 // IO and UI thread. Members declared after the lock are protected by it. | |
108 mutable base::Lock lock_; | |
109 int bytes_read; | |
110 }; | |
111 | |
74 class NavigationControllerBrowserTest : public ContentBrowserTest { | 112 class NavigationControllerBrowserTest : public ContentBrowserTest { |
75 protected: | 113 protected: |
76 void SetUpOnMainThread() override { | 114 void SetUpOnMainThread() override { |
77 host_resolver()->AddRule("*", "127.0.0.1"); | 115 host_resolver()->AddRule("*", "127.0.0.1"); |
78 content::SetupCrossSiteRedirector(embedded_test_server()); | 116 content::SetupCrossSiteRedirector(embedded_test_server()); |
117 connection_listener.reset(new ConnectionListener()); | |
118 embedded_test_server()->SetConnectionListener(connection_listener.get()); | |
79 ASSERT_TRUE(embedded_test_server()->Start()); | 119 ASSERT_TRUE(embedded_test_server()->Start()); |
80 } | 120 } |
121 | |
122 std::unique_ptr<ConnectionListener> connection_listener; | |
81 }; | 123 }; |
82 | 124 |
83 // Ensure that tests can navigate subframes cross-site in both default mode and | 125 // Ensure that tests can navigate subframes cross-site in both default mode and |
84 // --site-per-process, but that they only go cross-process in the latter. | 126 // --site-per-process, but that they only go cross-process in the latter. |
85 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, LoadCrossSiteSubframe) { | 127 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, LoadCrossSiteSubframe) { |
86 // Load a main frame with a subframe. | 128 // Load a main frame with a subframe. |
87 GURL main_url(embedded_test_server()->GetURL( | 129 GURL main_url(embedded_test_server()->GetURL( |
88 "/navigation_controller/page_with_iframe.html")); | 130 "/navigation_controller/page_with_iframe.html")); |
89 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 131 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
90 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) | 132 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
(...skipping 6938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7029 // Do a browser-initiated fragment navigation. | 7071 // Do a browser-initiated fragment navigation. |
7030 NavigationHandleCommitObserver handle_observer(shell()->web_contents(), | 7072 NavigationHandleCommitObserver handle_observer(shell()->web_contents(), |
7031 kFragmentURL); | 7073 kFragmentURL); |
7032 EXPECT_TRUE(NavigateToURL(shell(), kFragmentURL)); | 7074 EXPECT_TRUE(NavigateToURL(shell(), kFragmentURL)); |
7033 | 7075 |
7034 EXPECT_TRUE(handle_observer.has_committed()); | 7076 EXPECT_TRUE(handle_observer.has_committed()); |
7035 EXPECT_TRUE(handle_observer.was_same_page()); | 7077 EXPECT_TRUE(handle_observer.was_same_page()); |
7036 EXPECT_FALSE(handle_observer.was_renderer_initiated()); | 7078 EXPECT_FALSE(handle_observer.was_renderer_initiated()); |
7037 } | 7079 } |
7038 | 7080 |
7081 // Ensure that browser-initiated same-document navigations are detected and | |
clamy
2016/12/22 17:30:25
Could you also add a test for the fallback/drop ca
arthursonzogni
2017/01/05 17:04:22
I don't have any idea how to test it.
clamy
2017/01/09 16:58:48
I'd suggest adding a RenderViewImplTest. See Rende
| |
7082 // don't issue network requests. | |
7083 // see crbug.com/663777 | |
clamy
2016/12/22 17:30:25
nit: comments start with a capital letter and end
arthursonzogni
2017/01/05 17:04:22
Done.
| |
7084 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, | |
7085 SamePageBrowserInitiatedNoReload) { | |
7086 GURL url(embedded_test_server()->GetURL("/title1.html")); | |
7087 GURL url_fragment_1(embedded_test_server()->GetURL("/title1.html#id_1")); | |
7088 GURL url_fragment_2(embedded_test_server()->GetURL("/title1.html#id_2")); | |
7089 | |
7090 // 1) Perform a new-document navigation. | |
7091 connection_listener->ResetBytesRead(); | |
7092 EXPECT_TRUE(NavigateToURL(shell(), url)); | |
7093 EXPECT_TRUE(connection_listener->BytesRead() > 0); | |
7094 | |
7095 // 2) Perform a same-document navigation by adding a fragment. | |
7096 connection_listener->ResetBytesRead(); | |
7097 EXPECT_TRUE(NavigateToURL(shell(), url_fragment_1)); | |
7098 EXPECT_TRUE(connection_listener->BytesRead() == 0); | |
7099 | |
7100 // 3) Perform a same-document navigation by modifying the fragment. | |
7101 connection_listener->ResetBytesRead(); | |
7102 EXPECT_TRUE(NavigateToURL(shell(), url_fragment_2)); | |
7103 EXPECT_TRUE(connection_listener->BytesRead() == 0); | |
7104 | |
7105 // 4) Redo the last navigation, but this time it should trigger a reload. | |
7106 connection_listener->ResetBytesRead(); | |
7107 EXPECT_TRUE(NavigateToURL(shell(), url_fragment_2)); | |
7108 EXPECT_TRUE(connection_listener->BytesRead() > 0); | |
7109 | |
7110 // 5) Perform a new-document navigation by removing the fragment. | |
7111 connection_listener->ResetBytesRead(); | |
7112 EXPECT_TRUE(NavigateToURL(shell(), url)); | |
7113 EXPECT_TRUE(connection_listener->BytesRead() > 0); | |
7114 } | |
7115 | |
7039 } // namespace content | 7116 } // namespace content |
OLD | NEW |