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

Side by Side Diff: headless/test/headless_js_bindings_browsertest.cc

Issue 2902583002: Add some closureised JS bindings for DevTools for use by headless embedder (Closed)
Patch Set: Don't run the test on windows because js_binary doesn't work Created 3 years, 6 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 2016 The Chromium Authors. All rights reserved.
Sami 2017/05/24 09:16:22 ++year
alex clarke (OOO till 29th) 2017/05/24 11:38:17 Done.
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 <memory>
6 #include <string>
7 #include <vector>
8
9 #include "base/base64.h"
10 #include "base/json/json_reader.h"
11 #include "base/path_service.h"
12 #include "base/threading/thread_restrictions.h"
13 #include "content/public/test/browser_test.h"
14 #include "headless/grit/headless_browsertest_resources.h"
15 #include "headless/public/devtools/domains/runtime.h"
16 #include "headless/public/headless_browser.h"
17 #include "headless/public/headless_devtools_client.h"
18 #include "headless/public/headless_tab_socket.h"
19 #include "headless/public/headless_web_contents.h"
20 #include "headless/test/headless_browser_test.h"
21 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "ui/base/resource/resource_bundle.h"
24
25 namespace headless {
26
27 class HeadlessJsBindingsTest
28 : public HeadlessAsyncDevTooledBrowserTest,
29 public HeadlessTabSocket::Listener,
30 public HeadlessDevToolsClient::RawProtocolListener {
31 public:
32 void SetUp() override {
33 options()->mojo_service_names.insert("headless::TabSocket");
34 HeadlessAsyncDevTooledBrowserTest::SetUp();
35 }
36
37 void SetUpOnMainThread() override {
38 base::ThreadRestrictions::SetIOAllowed(true);
39 base::FilePath pak_path;
40 ASSERT_TRUE(PathService::Get(base::DIR_MODULE, &pak_path));
41 pak_path = pak_path.AppendASCII("headless_browser_tests.pak");
42 ResourceBundle::GetSharedInstance().AddDataPackFromPath(
43 pak_path, ui::SCALE_FACTOR_NONE);
44 }
45
46 void RunDevTooledTest() override {
47 headless_tab_socket_ = web_contents_->GetHeadlessTabSocket();
48 DCHECK(headless_tab_socket_);
49 headless_tab_socket_->SetListener(this);
50 devtools_client_->SetRawProtocolListener(this);
51 devtools_client_->GetRuntime()->Evaluate(
52 "var goog = {};" + ResourceBundle::GetSharedInstance()
53 .GetRawDataResource(DEVTOOLS_BINDINGS_TEST)
54 .as_string(),
55 base::Bind(&HeadlessJsBindingsTest::OnEvaluateResult,
56 base::Unretained(this)));
57 }
58
59 void OnEvaluateResult(std::unique_ptr<runtime::EvaluateResult> result) {
60 if (!result->HasExceptionDetails())
61 return;
62
63 FinishAsynchronousTest();
64 FAIL() << result->GetExceptionDetails()->GetText();
65 }
66
67 void OnMessageFromTab(const std::string& json_message) override {
68 std::unique_ptr<base::Value> message =
69 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
70 const base::DictionaryValue* message_dict;
71 const base::DictionaryValue* params_dict;
72 std::string method;
73 int id;
74 if (!message || !message->GetAsDictionary(&message_dict) ||
75 !message_dict->GetString("method", &method) ||
76 !message_dict->GetDictionary("params", &params_dict) ||
77 !message_dict->GetInteger("id", &id)) {
78 FinishAsynchronousTest();
79 FAIL() << "Badly formed message " << json_message;
80 return;
81 }
82
83 if (method == "__QuitTest") {
84 FinishAsynchronousTest();
85 return;
86 }
87
88 if (method == "__Log") {
89 std::string message;
90 params_dict->GetString("message", &message);
91 fprintf(stdout, "%s\n", message.c_str());
92 return;
93 }
94
95 if (method == "__FailTest") {
96 std::string error;
97 params_dict->GetString("error", &error);
98 FinishAsynchronousTest();
99 FAIL() << error;
100 return;
101 }
102
103 devtools_client_->SendRawDevToolsMessage(json_message);
104 }
105
106 bool GetCreateTabSocket() override { return true; }
107
108 bool OnProtocolMessage(const std::string& devtools_agent_host_id,
109 const std::string& json_message,
110 const base::DictionaryValue& parsed_message) override {
111 int id;
112 // If |parsed_message| contains an id we know this is a message reply.
113 if (parsed_message.GetInteger("id", &id)) {
114 // We are only interested in message replies (ones with an id) where the
115 // id is odd. The reason is HeadlessDevToolsClientImpl uses even/oddness
116 // to distinguish between commands send from the C++ bindings and those
117 // via HeadlessDevToolsClientImpl::SendRawDevToolsMessage.
118 if ((id % 2) == 0)
119 return false;
120 }
121
122 headless_tab_socket_->SendMessageToTab(json_message);
123 return true;
124 }
125
126 private:
127 HeadlessTabSocket* headless_tab_socket_;
128 };
129
130 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessJsBindingsTest);
131
132 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698