// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_SENSOR_SENSOR_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SENSOR_SENSOR_H_ #include "third_party/blink/public/common/feature_policy/feature_policy.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/core/dom/dom_high_res_time_stamp.h" #include "third_party/blink/renderer/core/dom/dom_time_stamp.h" #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/platform_event_controller.h" #include "third_party/blink/renderer/modules/event_target_modules.h" #include "third_party/blink/renderer/modules/sensor/sensor_options.h" #include "third_party/blink/renderer/modules/sensor/sensor_proxy.h" #include "third_party/blink/renderer/modules/sensor/spatial_sensor_options.h" #include "third_party/blink/renderer/platform/bindings/exception_code.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h" namespace blink { class DOMException; class ExceptionState; class ExecutionContext; class Sensor : public EventTargetWithInlineData, public ActiveScriptWrappable, public ContextLifecycleObserver, public SensorProxy::Observer { USING_GARBAGE_COLLECTED_MIXIN(Sensor); DEFINE_WRAPPERTYPEINFO(); public: enum class SensorState { kIdle, kActivating, kActivated }; ~Sensor() override; void start(); void stop(); // EventTarget overrides. const AtomicString& InterfaceName() const override { return event_target_names::kSensor; } ExecutionContext* GetExecutionContext() const override { return ContextLifecycleObserver::GetExecutionContext(); } // Getters bool activated() const; bool hasReading() const; DOMHighResTimeStamp timestamp(ScriptState*, bool& is_null) const; DEFINE_ATTRIBUTE_EVENT_LISTENER(error, kError) DEFINE_ATTRIBUTE_EVENT_LISTENER(reading, kReading) DEFINE_ATTRIBUTE_EVENT_LISTENER(activate, kActivate) // ActiveScriptWrappable overrides. bool HasPendingActivity() const override; void Trace(blink::Visitor*) override; protected: Sensor(ExecutionContext*, const SensorOptions*, ExceptionState&, device::mojom::blink::SensorType, const Vector&); Sensor(ExecutionContext*, const SpatialSensorOptions*, ExceptionState&, device::mojom::blink::SensorType, const Vector&); using SensorConfigurationPtr = device::mojom::blink::SensorConfigurationPtr; using SensorConfiguration = device::mojom::blink::SensorConfiguration; // The default implementation will init frequency configuration parameter, // concrete sensor implementations can override this method to handle other // parameters if needed. virtual SensorConfigurationPtr CreateSensorConfig(); bool IsActivated() const { return state_ == SensorState::kActivated; } bool IsIdleOrErrored() const; const device::SensorReading& GetReading() const; // SensorProxy::Observer overrides. void OnSensorInitialized() override; void OnSensorReadingChanged() override; void OnSensorError(DOMExceptionCode, const String& sanitized_message, const String& unsanitized_message) override; private: void InitSensorProxyIfNeeded(); // ContextLifecycleObserver overrides. void ContextDestroyed(ExecutionContext*) override; void OnAddConfigurationRequestCompleted(bool); void Activate(); void Deactivate(); void RequestAddConfiguration(); void HandleError(DOMExceptionCode, const String& sanitized_message, const String& unsanitized_message = String()); void NotifyReading(); void NotifyActivated(); void NotifyError(DOMException* error); double frequency_; device::mojom::blink::SensorType type_; SensorState state_; Member sensor_proxy_; double last_reported_timestamp_; SensorConfigurationPtr configuration_; TaskHandle pending_reading_notification_; TaskHandle pending_activated_notification_; TaskHandle pending_error_notification_; bool use_screen_coords_ = false; }; } // namespace blink // To be used in getters in concrete sensors // bindings code. #define INIT_IS_NULL_AND_RETURN(is_null, x) \ is_null = !hasReading(); \ if (is_null) \ return (x) #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_SENSOR_SENSOR_H_