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

Side by Side Diff: headless/public/util/frame_id_browsertest.cc

Issue 2830753004: Pipe the devTools FrameId from blink into the browser for headless (Closed)
Patch Set: Add include for msvc Created 3 years, 8 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "base/run_loop.h"
7 #include "content/public/test/browser_test.h"
8 #include "headless/public/devtools/domains/page.h"
9 #include "headless/public/headless_devtools_client.h"
10 #include "headless/public/util/expedited_dispatcher.h"
11 #include "headless/public/util/generic_url_request_job.h"
12 #include "headless/public/util/url_fetcher.h"
13 #include "headless/test/headless_browser_test.h"
14 #include "net/http/http_response_headers.h"
15 #include "net/url_request/url_request_job_factory.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "url/gurl.h"
19
20 using testing::ContainerEq;
21
22 namespace headless {
23
24 namespace {
25 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
26 public:
27 explicit TestProtocolHandler(
28 scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner)
29 : test_delegate_(new TestDelegate(this)),
30 dispatcher_(new ExpeditedDispatcher(io_thread_task_runner)),
31 headless_browser_context_(nullptr) {}
32
33 ~TestProtocolHandler() override {}
34
35 void SetHeadlessBrowserContext(
36 HeadlessBrowserContext* headless_browser_context) {
37 headless_browser_context_ = headless_browser_context;
38 }
39
40 struct Response {
41 Response() {}
42 Response(const std::string& body, const std::string& mime_type)
43 : data("HTTP/1.1 200 OK\r\nContent-Type: " + mime_type + "\r\n\r\n" +
44 body) {}
45
46 std::string data;
47 };
48
49 void InsertResponse(const std::string& url, const Response& response) {
50 response_map_[url] = response;
51 }
52
53 const Response* GetResponse(const std::string& url) const {
54 std::map<std::string, Response>::const_iterator find_it =
55 response_map_.find(url);
56 if (find_it == response_map_.end())
57 return nullptr;
58 return &find_it->second;
59 }
60
61 class MockURLFetcher : public URLFetcher {
62 public:
63 explicit MockURLFetcher(const TestProtocolHandler* protocol_handler)
64 : protocol_handler_(protocol_handler) {}
65 ~MockURLFetcher() override {}
66
67 // URLFetcher implementation:
68 void StartFetch(const GURL& url,
69 const std::string& method,
70 const std::string& post_data,
71 const net::HttpRequestHeaders& request_headers,
72 ResultListener* result_listener) override {
73 EXPECT_EQ("GET", method);
74
75 const Response* response = protocol_handler_->GetResponse(url.spec());
76 if (!response)
77 result_listener->OnFetchStartError(net::ERR_FILE_NOT_FOUND);
78
79 result_listener->OnFetchCompleteExtractHeaders(
80 url, response->data.c_str(), response->data.size());
81 }
82
83 private:
84 const TestProtocolHandler* protocol_handler_;
85
86 DISALLOW_COPY_AND_ASSIGN(MockURLFetcher);
87 };
88
89 class TestDelegate : public GenericURLRequestJob::Delegate {
90 public:
91 explicit TestDelegate(TestProtocolHandler* protocol_handler)
92 : protocol_handler_(protocol_handler) {}
93
94 ~TestDelegate() override {}
95
96 // GenericURLRequestJob::Delegate implementation:
97 void OnPendingRequest(PendingRequest* pending_request) override {
98 const Request* request = pending_request->GetRequest();
99 std::string url = request->GetURLRequest()->url().spec();
100 int frame_tree_node_id = request->GetFrameTreeNodeId();
101 DCHECK_NE(frame_tree_node_id, -1);
102 protocol_handler_->url_to_frame_tree_node_id_[url] = frame_tree_node_id;
103 pending_request->AllowRequest();
104 }
105
106 void OnResourceLoadFailed(const Request* request,
107 net::Error error) override {}
108
109 void OnResourceLoadComplete(
110 const Request* request,
111 const GURL& final_url,
112 scoped_refptr<net::HttpResponseHeaders> response_headers,
113 const char* body,
114 size_t body_size) override {}
115
116 private:
117 TestProtocolHandler* protocol_handler_; // NOT OWNED
118 scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner_;
119
120 DISALLOW_COPY_AND_ASSIGN(TestDelegate);
121 };
122
123 // net::URLRequestJobFactory::ProtocolHandler implementation::
124 net::URLRequestJob* MaybeCreateJob(
125 net::URLRequest* request,
126 net::NetworkDelegate* network_delegate) const override {
127 return new GenericURLRequestJob(
128 request, network_delegate, dispatcher_.get(),
129 base::MakeUnique<MockURLFetcher>(this), test_delegate_.get(),
130 headless_browser_context_);
131 }
132
133 std::map<std::string, int> url_to_frame_tree_node_id_;
134
135 private:
136 std::unique_ptr<TestDelegate> test_delegate_;
137 std::unique_ptr<ExpeditedDispatcher> dispatcher_;
138 std::map<std::string, Response> response_map_;
139 HeadlessBrowserContext* headless_browser_context_;
140
141 DISALLOW_COPY_AND_ASSIGN(TestProtocolHandler);
142 };
143
144 const char* kIndexHtml = R"(
145 <html>
146 <body>Hello.
147 <iframe src="iframe1.html"></iframe>
148 <iframe src="iframe2.html"></iframe>
149 </body>
150 </html>)";
151
152 const char* kIFrame1 = "<html><body>IFrame 1</body></html>";
153
154 const char* kIFrame2 = "<html><body>IFrame 2</body></html>";
155
156 } // namespace
157
158 class FrameIdTest : public HeadlessAsyncDevTooledBrowserTest,
159 public page::Observer {
160 public:
161 void RunDevTooledTest() override {
162 http_handler_->SetHeadlessBrowserContext(browser_context_);
163
164 EXPECT_TRUE(embedded_test_server()->Start());
165 devtools_client_->GetPage()->AddObserver(this);
166
167 base::RunLoop run_loop;
168 devtools_client_->GetPage()->Enable(run_loop.QuitClosure());
169 base::MessageLoop::ScopedNestableTaskAllower nest_loop(
170 base::MessageLoop::current());
171 run_loop.Run();
172
173 devtools_client_->GetPage()->Navigate("http://foo.com/index.html");
174 }
175
176 ProtocolHandlerMap GetProtocolHandlers() override {
177 ProtocolHandlerMap protocol_handlers;
178 std::unique_ptr<TestProtocolHandler> http_handler(
179 new TestProtocolHandler(browser()->BrowserIOThread()));
180 http_handler_ = http_handler.get();
181 http_handler_->InsertResponse("http://foo.com/index.html",
182 {kIndexHtml, "text/html"});
183 http_handler_->InsertResponse("http://foo.com/iframe1.html",
184 {kIFrame1, "text/html"});
185 http_handler_->InsertResponse("http://foo.com/iframe2.html",
186 {kIFrame2, "text/html"});
187 protocol_handlers[url::kHttpScheme] = std::move(http_handler);
188 return protocol_handlers;
189 }
190
191 // page::Observer implementation:
192 void OnFrameNavigated(const page::FrameNavigatedParams& params) override {
193 url_to_frame_id_[params.GetFrame()->GetUrl()] = params.GetFrame()->GetId();
194 }
195
196 void OnLoadEventFired(const page::LoadEventFiredParams& params) override {
197 std::map<std::string, std::string> protocol_handler_url_to_frame_id_;
198 for (const auto& pair : http_handler_->url_to_frame_tree_node_id_) {
199 protocol_handler_url_to_frame_id_[pair.first] =
200 web_contents_->GetDevToolsFrameIdForFrameTreeNodeId(pair.second);
201 }
202
203 EXPECT_THAT(url_to_frame_id_, protocol_handler_url_to_frame_id_);
204 EXPECT_EQ(3u, url_to_frame_id_.size());
205 FinishAsynchronousTest();
206 }
207
208 private:
209 std::map<std::string, std::string> url_to_frame_id_;
210 TestProtocolHandler* http_handler_; // NOT OWNED
211 };
212
213 HEADLESS_ASYNC_DEVTOOLED_TEST_F(FrameIdTest);
214
215 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698