diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/serial/serial.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/modules/serial/serial.cc | 85 |
1 files changed, 76 insertions, 9 deletions
diff --git a/chromium/third_party/blink/renderer/modules/serial/serial.cc b/chromium/third_party/blink/renderer/modules/serial/serial.cc index b9654d2cdae..4051e1d1859 100644 --- a/chromium/third_party/blink/renderer/modules/serial/serial.cc +++ b/chromium/third_party/blink/renderer/modules/serial/serial.cc @@ -12,11 +12,14 @@ #include "third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_serial_port_filter.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_serial_port_request_options.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/modules/event_target_modules_names.h" +#include "third_party/blink/renderer/modules/serial/serial_connection_event.h" #include "third_party/blink/renderer/modules/serial/serial_port.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -39,21 +42,31 @@ String TokenToString(const base::UnguessableToken& token) { } // namespace Serial::Serial(ExecutionContext& execution_context) - : ContextLifecycleObserver(&execution_context) {} + : ExecutionContextLifecycleObserver(&execution_context) {} ExecutionContext* Serial::GetExecutionContext() const { - return ContextLifecycleObserver::GetExecutionContext(); + return ExecutionContextLifecycleObserver::GetExecutionContext(); } const AtomicString& Serial::InterfaceName() const { return event_target_names::kSerial; } -void Serial::ContextDestroyed(ExecutionContext*) { +void Serial::ContextDestroyed() { for (auto& entry : port_cache_) entry.value->ContextDestroyed(); } +void Serial::OnPortAdded(mojom::blink::SerialPortInfoPtr port_info) { + DispatchEvent(*SerialConnectionEvent::Create( + event_type_names::kConnect, GetOrCreatePort(std::move(port_info)))); +} + +void Serial::OnPortRemoved(mojom::blink::SerialPortInfoPtr port_info) { + DispatchEvent(*SerialConnectionEvent::Create( + event_type_names::kDisconnect, GetOrCreatePort(std::move(port_info)))); +} + ScriptPromise Serial::getPorts(ScriptState* script_state, ExceptionState& exception_state) { auto* context = GetExecutionContext(); @@ -63,9 +76,8 @@ ScriptPromise Serial::getPorts(ScriptState* script_state, return ScriptPromise(); } - if (!context->GetSecurityContext().IsFeatureEnabled( - mojom::FeaturePolicyFeature::kSerial, - ReportOptions::kReportOnFailure)) { + if (!context->IsFeatureEnabled(mojom::blink::FeaturePolicyFeature::kSerial, + ReportOptions::kReportOnFailure)) { exception_state.ThrowSecurityError(kFeaturePolicyBlocked); return ScriptPromise(); } @@ -91,7 +103,7 @@ ScriptPromise Serial::requestPort(ScriptState* script_state, } if (!frame->GetDocument()->IsFeatureEnabled( - mojom::FeaturePolicyFeature::kSerial, + mojom::blink::FeaturePolicyFeature::kSerial, ReportOptions::kReportOnFailure)) { exception_state.ThrowSecurityError(kFeaturePolicyBlocked); return ScriptPromise(); @@ -103,17 +115,50 @@ ScriptPromise Serial::requestPort(ScriptState* script_state, return ScriptPromise(); } + Vector<mojom::blink::SerialPortFilterPtr> filters; + if (options && options->hasFilters()) { + for (const auto& filter : options->filters()) { + auto mojo_filter = mojom::blink::SerialPortFilter::New(); + + mojo_filter->has_vendor_id = filter->hasUsbVendorId(); + if (mojo_filter->has_vendor_id) { + mojo_filter->vendor_id = filter->usbVendorId(); + } else { + exception_state.ThrowTypeError( + "A filter must provide a property to filter by."); + return ScriptPromise(); + } + + mojo_filter->has_product_id = filter->hasUsbProductId(); + if (mojo_filter->has_product_id) { + if (!mojo_filter->has_vendor_id) { + exception_state.ThrowTypeError( + "A filter containing a usbProductId must also specify a " + "usbVendorId."); + return ScriptPromise(); + } + mojo_filter->product_id = filter->usbProductId(); + } + + filters.push_back(std::move(mojo_filter)); + } + } + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); request_port_promises_.insert(resolver); EnsureServiceConnection(); - service_->RequestPort(Vector<mojom::blink::SerialPortFilterPtr>(), + service_->RequestPort(std::move(filters), WTF::Bind(&Serial::OnRequestPort, WrapPersistent(this), WrapPersistent(resolver))); return resolver->Promise(); } +void Serial::Dispose() { + receiver_.reset(); +} + void Serial::GetPort( const base::UnguessableToken& token, mojo::PendingReceiver<device::mojom::blink::SerialPort> receiver) { @@ -126,7 +171,26 @@ void Serial::Trace(Visitor* visitor) { visitor->Trace(request_port_promises_); visitor->Trace(port_cache_); EventTargetWithInlineData::Trace(visitor); - ContextLifecycleObserver::Trace(visitor); + ExecutionContextLifecycleObserver::Trace(visitor); +} + +void Serial::AddedEventListener(const AtomicString& event_type, + RegisteredEventListener& listener) { + EventTargetWithInlineData::AddedEventListener(event_type, listener); + + if (event_type != event_type_names::kConnect && + event_type != event_type_names::kDisconnect) { + return; + } + + ExecutionContext* context = GetExecutionContext(); + if (!context || + !context->IsFeatureEnabled(mojom::blink::FeaturePolicyFeature::kSerial, + ReportOptions::kDoNotReport)) { + return; + } + + EnsureServiceConnection(); } void Serial::EnsureServiceConnection() { @@ -141,10 +205,13 @@ void Serial::EnsureServiceConnection() { service_.BindNewPipeAndPassReceiver(task_runner)); service_.set_disconnect_handler( WTF::Bind(&Serial::OnServiceConnectionError, WrapWeakPersistent(this))); + + service_->SetClient(receiver_.BindNewPipeAndPassRemote()); } void Serial::OnServiceConnectionError() { service_.reset(); + receiver_.reset(); // Script may execute during a call to Resolve(). Swap these sets to prevent // concurrent modification. |