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

Side by Side Diff: third_party/WebKit/Source/modules/webusb/USB.cpp

Issue 2698083008: Make the navigator.usb attribute accessible only in secure contexts. (Closed)
Patch Set: Moved [NoInterfaceObject] change to a separate patch. Created 3 years, 10 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "modules/webusb/USB.h" 5 #include "modules/webusb/USB.h"
6 6
7 #include "bindings/core/v8/ScriptPromise.h" 7 #include "bindings/core/v8/ScriptPromise.h"
8 #include "bindings/core/v8/ScriptPromiseResolver.h" 8 #include "bindings/core/v8/ScriptPromiseResolver.h"
9 #include "core/dom/DOMException.h" 9 #include "core/dom/DOMException.h"
10 #include "core/dom/Document.h" 10 #include "core/dom/Document.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 // prevent messages from being dispatched before lazy sweeping. 73 // prevent messages from being dispatched before lazy sweeping.
74 m_clientBinding.Close(); 74 m_clientBinding.Close();
75 } 75 }
76 76
77 ScriptPromise USB::getDevices(ScriptState* scriptState) { 77 ScriptPromise USB::getDevices(ScriptState* scriptState) {
78 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 78 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
79 ScriptPromise promise = resolver->promise(); 79 ScriptPromise promise = resolver->promise();
80 if (!m_deviceManager) { 80 if (!m_deviceManager) {
81 resolver->reject(DOMException::create(NotSupportedError)); 81 resolver->reject(DOMException::create(NotSupportedError));
82 } else { 82 } else {
83 String errorMessage; 83 m_deviceManagerRequests.insert(resolver);
84 if (!scriptState->getExecutionContext()->isSecureContext(errorMessage)) { 84 m_deviceManager->GetDevices(
85 resolver->reject(DOMException::create(SecurityError, errorMessage)); 85 nullptr, convertToBaseCallback(WTF::bind(&USB::onGetDevices,
86 } else { 86 wrapPersistent(this),
87 m_deviceManagerRequests.insert(resolver); 87 wrapPersistent(resolver))));
88 m_deviceManager->GetDevices(
89 nullptr, convertToBaseCallback(WTF::bind(&USB::onGetDevices,
90 wrapPersistent(this),
91 wrapPersistent(resolver))));
92 }
93 } 88 }
94 return promise; 89 return promise;
95 } 90 }
96 91
97 ScriptPromise USB::requestDevice(ScriptState* scriptState, 92 ScriptPromise USB::requestDevice(ScriptState* scriptState,
98 const USBDeviceRequestOptions& options) { 93 const USBDeviceRequestOptions& options) {
99 ExecutionContext* executionContext = scriptState->getExecutionContext(); 94 ExecutionContext* executionContext = scriptState->getExecutionContext();
100 95
101 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); 96 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
102 ScriptPromise promise = resolver->promise(); 97 ScriptPromise promise = resolver->promise();
103 98
104 if (!m_chooserService) { 99 if (!m_chooserService) {
105 LocalFrame* frame = executionContext->isDocument() 100 LocalFrame* frame = executionContext->isDocument()
106 ? toDocument(executionContext)->frame() 101 ? toDocument(executionContext)->frame()
107 : nullptr; 102 : nullptr;
108 if (!frame) { 103 if (!frame) {
109 resolver->reject(DOMException::create(NotSupportedError)); 104 resolver->reject(DOMException::create(NotSupportedError));
110 return promise; 105 return promise;
111 } 106 }
112 frame->interfaceProvider()->getInterface( 107 frame->interfaceProvider()->getInterface(
113 mojo::MakeRequest(&m_chooserService)); 108 mojo::MakeRequest(&m_chooserService));
114 m_chooserService.set_connection_error_handler( 109 m_chooserService.set_connection_error_handler(
115 convertToBaseCallback(WTF::bind(&USB::onChooserServiceConnectionError, 110 convertToBaseCallback(WTF::bind(&USB::onChooserServiceConnectionError,
116 wrapWeakPersistent(this)))); 111 wrapWeakPersistent(this))));
117 } 112 }
118 113
119 String errorMessage; 114 if (!UserGestureIndicator::consumeUserGesture()) {
120 if (!executionContext->isSecureContext(errorMessage)) {
121 resolver->reject(DOMException::create(SecurityError, errorMessage));
122 } else if (!UserGestureIndicator::consumeUserGesture()) {
123 resolver->reject(DOMException::create( 115 resolver->reject(DOMException::create(
124 SecurityError, 116 SecurityError,
125 "Must be handling a user gesture to show a permission request.")); 117 "Must be handling a user gesture to show a permission request."));
126 } else { 118 } else {
127 Vector<usb::DeviceFilterPtr> filters; 119 Vector<usb::DeviceFilterPtr> filters;
128 if (options.hasFilters()) { 120 if (options.hasFilters()) {
129 filters.reserveCapacity(options.filters().size()); 121 filters.reserveCapacity(options.filters().size());
130 for (const auto& filter : options.filters()) 122 for (const auto& filter : options.filters())
131 filters.push_back(convertDeviceFilter(filter)); 123 filters.push_back(convertDeviceFilter(filter));
132 } 124 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 226
235 DEFINE_TRACE(USB) { 227 DEFINE_TRACE(USB) {
236 visitor->trace(m_deviceManagerRequests); 228 visitor->trace(m_deviceManagerRequests);
237 visitor->trace(m_chooserServiceRequests); 229 visitor->trace(m_chooserServiceRequests);
238 visitor->trace(m_deviceCache); 230 visitor->trace(m_deviceCache);
239 EventTargetWithInlineData::trace(visitor); 231 EventTargetWithInlineData::trace(visitor);
240 ContextLifecycleObserver::trace(visitor); 232 ContextLifecycleObserver::trace(visitor);
241 } 233 }
242 234
243 } // namespace blink 235 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698