OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include <memory> | |
6 #include <string> | |
7 | |
8 #include "base/command_line.h" | |
9 #include "base/memory/ref_counted.h" | |
10 #include "chrome/browser/ui/browser.h" | |
11 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
12 #include "chrome/browser/usb/usb_chooser_controller.h" | |
13 #include "chrome/test/base/in_process_browser_test.h" | |
14 #include "chrome/test/base/ui_test_utils.h" | |
15 #include "content/public/browser/render_frame_host.h" | |
16 #include "content/public/common/content_switches.h" | |
17 #include "content/public/test/browser_test_utils.h" | |
18 #include "device/base/mock_device_client.h" | |
19 #include "device/usb/mock_usb_device.h" | |
20 #include "device/usb/mock_usb_service.h" | |
21 #include "device/usb/public/interfaces/chooser_service.mojom.h" | |
22 #include "device/usb/webusb_descriptors.h" | |
23 #include "mojo/public/cpp/bindings/strong_binding.h" | |
24 #include "services/service_manager/public/cpp/interface_registry.h" | |
25 | |
26 using content::RenderFrameHost; | |
27 using device::MockDeviceClient; | |
28 using device::MockUsbDevice; | |
29 | |
30 namespace { | |
31 | |
32 class FakeChooserView : public ChooserController::View { | |
33 public: | |
34 explicit FakeChooserView(std::unique_ptr<ChooserController> controller) | |
35 : controller_(std::move(controller)) { | |
36 controller_->set_view(this); | |
37 } | |
38 | |
39 ~FakeChooserView() override { controller_->set_view(nullptr); } | |
40 | |
41 void OnOptionsInitialized() override { | |
42 if (controller_->NumOptions()) | |
43 controller_->Select({0}); | |
44 else | |
45 controller_->Cancel(); | |
46 delete this; | |
47 } | |
48 | |
49 void OnOptionAdded(size_t index) override { NOTREACHED(); } | |
50 void OnOptionRemoved(size_t index) override { NOTREACHED(); } | |
51 void OnOptionUpdated(size_t index) override { NOTREACHED(); } | |
52 void OnAdapterEnabledChanged(bool enabled) override { NOTREACHED(); } | |
53 void OnRefreshStateChanged(bool refreshing) override { NOTREACHED(); } | |
54 | |
55 private: | |
56 std::unique_ptr<ChooserController> controller_; | |
57 | |
58 DISALLOW_COPY_AND_ASSIGN(FakeChooserView); | |
59 }; | |
60 | |
61 class FakeChooserService : public device::usb::ChooserService { | |
62 public: | |
63 static void Create(RenderFrameHost* render_frame_host, | |
64 device::usb::ChooserServiceRequest request) { | |
65 mojo::MakeStrongBinding( | |
66 base::MakeUnique<FakeChooserService>(render_frame_host), | |
67 std::move(request)); | |
68 } | |
69 | |
70 explicit FakeChooserService(RenderFrameHost* render_frame_host) | |
71 : render_frame_host_(render_frame_host) {} | |
72 | |
73 ~FakeChooserService() override {} | |
74 | |
75 // device::usb::ChooserService: | |
76 void GetPermission(std::vector<device::usb::DeviceFilterPtr> device_filters, | |
77 const GetPermissionCallback& callback) override { | |
78 auto chooser_controller = base::MakeUnique<UsbChooserController>( | |
79 render_frame_host_, std::move(device_filters), callback); | |
80 new FakeChooserView(std::move(chooser_controller)); | |
81 } | |
82 | |
83 private: | |
84 RenderFrameHost* const render_frame_host_; | |
85 | |
86 DISALLOW_COPY_AND_ASSIGN(FakeChooserService); | |
87 }; | |
88 | |
89 class WebUsbTest : public InProcessBrowserTest { | |
90 public: | |
91 void SetUpCommandLine(base::CommandLine* command_line) override { | |
92 command_line->AppendSwitch( | |
93 switches::kEnableExperimentalWebPlatformFeatures); | |
94 InProcessBrowserTest::SetUpCommandLine(command_line); | |
95 } | |
96 | |
97 void SetUpOnMainThread() override { | |
98 embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data"); | |
99 ASSERT_TRUE(embedded_test_server()->Start()); | |
100 | |
101 device_client_.reset(new MockDeviceClient()); | |
scheib
2017/01/04 19:06:02
Add some comments here, and in the last test, high
| |
102 scoped_refptr<MockUsbDevice> mock_device( | |
103 new MockUsbDevice(0, 0, "Test Manufacturer", "Test Device", "123456")); | |
104 device_client_->usb_service()->AddDevice(mock_device); | |
105 | |
106 mock_device = | |
107 new MockUsbDevice(1, 0, "Test Manufacturer", "Test Device", "ABCDEF"); | |
108 auto allowed_origins = base::MakeUnique<device::WebUsbAllowedOrigins>(); | |
109 allowed_origins->origins.push_back( | |
110 embedded_test_server()->GetURL("localhost", "/").GetOrigin()); | |
111 mock_device->set_webusb_allowed_origins(std::move(allowed_origins)); | |
112 device_client_->usb_service()->AddDevice(mock_device); | |
113 } | |
114 | |
115 private: | |
116 std::unique_ptr<MockDeviceClient> device_client_; | |
117 }; | |
118 | |
119 IN_PROC_BROWSER_TEST_F(WebUsbTest, RequestAndGetDevices) { | |
120 ui_test_utils::NavigateToURL( | |
121 browser(), | |
122 embedded_test_server()->GetURL("localhost", "/simple_page.html")); | |
123 content::WebContents* web_contents = | |
124 browser()->tab_strip_model()->GetActiveWebContents(); | |
125 RenderFrameHost* render_frame_host = web_contents->GetMainFrame(); | |
126 EXPECT_THAT(render_frame_host->GetLastCommittedOrigin().Serialize(), | |
127 testing::StartsWith("http://localhost:")); | |
128 | |
129 render_frame_host->GetInterfaceRegistry()->AddInterface( | |
130 base::Bind(&FakeChooserService::Create, render_frame_host)); | |
131 | |
132 std::string result; | |
133 EXPECT_TRUE(content::ExecuteScriptAndExtractString( | |
134 web_contents, | |
135 "navigator.usb.requestDevice({ filters: [ { vendorId: 0 } ] })" | |
136 " .then(device => {" | |
137 " domAutomationController.send(device.serialNumber);" | |
138 " });", | |
139 &result)); | |
140 EXPECT_EQ("123456", result); | |
141 | |
142 EXPECT_TRUE(content::ExecuteScriptAndExtractString( | |
143 web_contents, | |
144 "navigator.usb.getDevices()" | |
145 " .then(devices => {" | |
146 " domAutomationController.send(devices.length.toString());" | |
147 " });", | |
148 &result)); | |
149 EXPECT_EQ("1", result); | |
150 } | |
151 | |
152 IN_PROC_BROWSER_TEST_F(WebUsbTest, RequestAndGetDevicesInIframe) { | |
153 ui_test_utils::NavigateToURL( | |
154 browser(), | |
155 embedded_test_server()->GetURL("localhost", "/page_with_iframe.html")); | |
156 content::WebContents* web_contents = | |
157 browser()->tab_strip_model()->GetActiveWebContents(); | |
158 RenderFrameHost* main_frame = web_contents->GetMainFrame(); | |
159 EXPECT_THAT(main_frame->GetLastCommittedOrigin().Serialize(), | |
160 testing::StartsWith("http://localhost:")); | |
161 RenderFrameHost* embedded_frame = ChildFrameAt(main_frame, 0); | |
162 EXPECT_THAT(embedded_frame->GetLastCommittedOrigin().Serialize(), | |
163 testing::StartsWith("http://localhost:")); | |
164 | |
165 embedded_frame->GetInterfaceRegistry()->AddInterface( | |
166 base::Bind(&FakeChooserService::Create, embedded_frame)); | |
167 | |
168 std::string result; | |
169 EXPECT_TRUE(content::ExecuteScriptAndExtractString( | |
170 embedded_frame, | |
171 "navigator.usb.requestDevice({ filters: [ { vendorId: 0 } ] })" | |
172 " .catch(e => { domAutomationController.send(e.toString()); });", | |
173 &result)); | |
174 EXPECT_EQ("NotFoundError: No device selected.", result); | |
175 | |
176 EXPECT_TRUE(content::ExecuteScriptAndExtractString( | |
177 embedded_frame, | |
178 "navigator.usb.requestDevice({ filters: [ { vendorId: 1 } ] })" | |
179 " .then(device => {" | |
180 " domAutomationController.send(device.serialNumber);" | |
181 " });", | |
182 &result)); | |
183 EXPECT_EQ("ABCDEF", result); | |
184 | |
185 EXPECT_TRUE(content::ExecuteScriptAndExtractString( | |
186 embedded_frame, | |
187 "navigator.usb.getDevices()" | |
188 " .then(devices => {" | |
189 " domAutomationController.send(devices.length.toString());" | |
190 " });", | |
191 &result)); | |
192 EXPECT_EQ("1", result); | |
193 } | |
194 | |
195 } // namespace | |
OLD | NEW |