diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index af5212a3df804..17e1c0d136ebf 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc @@ -4593,4 +4593,47 @@ IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTestWindowControlsOverlay, ValidateTitlebarAreaInsetValue("margin-top", "2px"); ValidateTitlebarAreaInsetValue("margin-bottom", "2px"); } + +IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTestWindowControlsOverlay, + GeometryChangeEvent) { + auto* web_contents = shell()->web_contents(); + + GURL url(url::kAboutBlankURL); + EXPECT_TRUE(NavigateToURL(shell(), url)); + EXPECT_TRUE(ExecuteScript( + web_contents->GetMainFrame(), + "geometrychangeCount = 0;" + "navigator.windowControlsOverlay.ongeometrychange = (e) => {" + " geometrychangeCount++;" + " rect = e.boundingRect;" + " visible = e.visible;" + "}")); + + WaitForLoadStop(web_contents); + + // Ensure the "geometrychange" event is only fired when the the window + // controls overlay bounds are updated. + EXPECT_EQ(0, EvalJs(web_contents, "geometrychangeCount")); + + // information about the bounds should be updated + int x = 2; + int y = 2; + int width = 2; + int height = 2; + + gfx::Rect bounding_client_rect = gfx::Rect(x, y, width, height); + gfx::Insets insets = gfx::Insets(0, 0, 0, 0); + + web_contents->UpdateWindowControlsOverlay(bounding_client_rect, insets); + + // Expect the "geometrychange" event to have fired once. + EXPECT_EQ(1, EvalJs(web_contents, "geometrychangeCount")); + + // Validate the event payload. + EXPECT_EQ(true, EvalJs(web_contents, "visible")); + EXPECT_EQ(x, EvalJs(web_contents, "rect.x;")); + EXPECT_EQ(y, EvalJs(web_contents, "rect.y")); + EXPECT_EQ(width, EvalJs(web_contents, "rect.width")); + EXPECT_EQ(height, EvalJs(web_contents, "rect.height")); +} } // namespace content diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index 98b486bf8370d..282a352a8e189 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni @@ -351,6 +351,8 @@ generated_dictionary_sources_in_core = [ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_validity_state_flags.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_wheel_event_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_wheel_event_init.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay_geometry_change_event_init.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay_geometry_change_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_post_message_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_post_message_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_options.cc", @@ -1401,6 +1403,8 @@ generated_interface_sources_in_core = [ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay_geometry_change_event.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay_geometry_change_event.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_worker_global_scope.cc", diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index 16d8c5ebee344..7bd06d1544d7e 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni @@ -300,6 +300,8 @@ static_idl_files_in_core = get_path_info( "//third_party/blink/renderer/core/frame/window_event_handlers.idl", "//third_party/blink/renderer/core/frame/window_or_worker_global_scope.idl", "//third_party/blink/renderer/core/frame/window_post_message_options.idl", + "//third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl", + "//third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl", "//third_party/blink/renderer/core/fullscreen/document_fullscreen.idl", "//third_party/blink/renderer/core/fullscreen/element_fullscreen.idl", "//third_party/blink/renderer/core/fullscreen/fullscreen_options.idl", diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index 96315711f9c09..e640c5276a9a1 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni @@ -206,6 +206,7 @@ core_interface_idl_files_core_only = "frame/user_activation.idl", "frame/visual_viewport.idl", "frame/window_controls_overlay.idl", + "frame/window_controls_overlay_geometry_change_event.idl", "geometry/dom_matrix.idl", "geometry/dom_matrix_read_only.idl", "geometry/dom_point.idl", @@ -635,149 +636,151 @@ core_callback_interface_idl_files = "abspath") core_dictionary_idl_files = - get_path_info([ - "animation/base_keyframe.idl", - "animation/base_property_indexed_keyframe.idl", - "animation/computed_effect_timing.idl", - "animation/document_timeline_options.idl", - "animation/effect_timing.idl", - "animation/get_animations_options.idl", - "animation/keyframe_animation_options.idl", - "animation/keyframe_effect_options.idl", - "animation/optional_effect_timing.idl", - "animation/scroll_timeline_element_based_offset.idl", - "animation/scroll_timeline_options.idl", - "css/css_style_sheet_init.idl", - "css/font_face_descriptors.idl", - "css/font_face_set_load_event_init.idl", - "css/media_query_list_event_init.idl", - "css/property_definition.idl", - "css/cssom/css_matrix_component_options.idl", - "css/cssom/css_numeric_type.idl", - "document_transition/document_transition_init.idl", - "dom/element_creation_options.idl", - "dom/element_definition_options.idl", - "dom/element_registration_options.idl", - "dom/get_inner_html_options.idl", - "dom/get_root_node_options.idl", - "dom/idle_request_options.idl", - "dom/interest_cohort.idl", - "dom/mutation_observer_init.idl", - "dom/pointer_lock_options.idl", - "dom/shadow_root_init.idl", - "dom/static_range_init.idl", - "dom/events/add_event_listener_options.idl", - "dom/events/custom_event_init.idl", - "dom/events/event_init.idl", - "dom/events/event_listener_options.idl", - "dom/events/event_modifier_init.idl", - "editing/ime/edit_context_init.idl", - "editing/ime/text_update_event_init.idl", - "editing/ime/text_format_update_event_init.idl", - "events/animation_event_init.idl", - "events/animation_playback_event_init.idl", - "events/application_cache_error_event_init.idl", - "events/clipboard_event_init.idl", - "events/composition_event_init.idl", - "events/drag_event_init.idl", - "events/error_event_init.idl", - "events/focus_event_init.idl", - "events/hash_change_event_init.idl", - "events/input_event_init.idl", - "events/keyboard_event_init.idl", - "events/message_event_init.idl", - "events/mouse_event_init.idl", - "events/overscroll_event_init.idl", - "events/page_transition_event_init.idl", - "events/pointer_event_init.idl", - "events/pop_state_event_init.idl", - "events/progress_event_init.idl", - "events/promise_rejection_event_init.idl", - "events/security_policy_violation_event_init.idl", - "events/touch_event_init.idl", - "events/transition_event_init.idl", - "events/ui_event_init.idl", - "events/wheel_event_init.idl", - "fetch/request_init.idl", - "fetch/response_init.idl", - "fetch/trust_token.idl", - "fileapi/blob_property_bag.idl", - "fileapi/file_property_bag.idl", - "frame/impression_params.idl", - "frame/is_input_pending_options.idl", - "frame/navigator_ua_brand_version.idl", - "frame/reporting_observer_options.idl", - "frame/scroll_into_view_options.idl", - "frame/scroll_options.idl", - "frame/scroll_to_options.idl", - "frame/window_post_message_options.idl", - "fullscreen/fullscreen_options.idl", - "geometry/dom_matrix_2d_init.idl", - "geometry/dom_matrix_init.idl", - "geometry/dom_point_init.idl", - "geometry/dom_quad_init.idl", - "geometry/dom_rect_init.idl", - "html/focus_options.idl", - "html/assigned_nodes_options.idl", - "html/canvas/baselines.idl", - "html/canvas/image_data_settings.idl", - "html/canvas/image_encode_options.idl", - "html/custom/validity_state_flags.idl", - "html/forms/form_data_event_init.idl", - "html/forms/submit_event_init.idl", - "html/portal/portal_activate_event_init.idl", - "html/portal/portal_activate_options.idl", - "html/track/track_event_init.idl", - "imagebitmap/image_bitmap_options.idl", - "input/input_device_capabilities_init.idl", - "input/touch_init.idl", - "intersection_observer/intersection_observer_init.idl", - "frame/ua_data_values.idl", - "layout/ng/custom/custom_layout_constraints_options.idl", - "layout/ng/custom/fragment_result_options.idl", - "layout/ng/custom/intrinsic_sizes_result_options.idl", - "messaging/post_message_options.idl", - "mojo/mojo_create_data_pipe_options.idl", - "mojo/mojo_create_data_pipe_result.idl", - "mojo/mojo_create_message_pipe_result.idl", - "mojo/mojo_create_shared_buffer_result.idl", - "mojo/mojo_discard_data_options.idl", - "mojo/mojo_duplicate_buffer_handle_options.idl", - "mojo/mojo_handle_signals.idl", - "mojo/mojo_map_buffer_result.idl", - "mojo/mojo_read_data_options.idl", - "mojo/mojo_read_data_result.idl", - "mojo/mojo_read_message_flags.idl", - "mojo/mojo_read_message_result.idl", - "mojo/mojo_write_data_options.idl", - "mojo/mojo_write_data_result.idl", - "mojo/test/mojo_interface_request_event_init.idl", - "page/scrolling/scroll_state_init.idl", - "resize_observer/resize_observer_options.idl", - "streams/readable_stream_byob_read_result.idl", - "streams/readable_stream_get_reader_options.idl", - "streams/readable_writable_pair.idl", - "streams/stream_pipe_options.idl", - "streams/underlying_source.idl", - "streams/queuing_strategy_init.idl", - "timing/measure_memory/memory_measurement.idl", - "timing/measure_memory/memory_breakdown_entry.idl", - "timing/measure_memory/memory_attribution.idl", - "timing/measure_memory/memory_attribution_container.idl", - "timing/performance_mark_options.idl", - "timing/performance_measure_options.idl", - "timing/performance_observer_init.idl", - "timing/profiler_frame.idl", - "timing/profiler_init_options.idl", - "timing/profiler_sample.idl", - "timing/profiler_stack.idl", - "timing/profiler_trace.idl", - "trustedtypes/trusted_type_policy_options.idl", - "workers/worker_options.idl", - "workers/worklet_options.idl", - "xml/parse_from_string_options.idl", - ], - "abspath") + get_path_info( + [ + "animation/base_keyframe.idl", + "animation/base_property_indexed_keyframe.idl", + "animation/computed_effect_timing.idl", + "animation/document_timeline_options.idl", + "animation/effect_timing.idl", + "animation/get_animations_options.idl", + "animation/keyframe_animation_options.idl", + "animation/keyframe_effect_options.idl", + "animation/optional_effect_timing.idl", + "animation/scroll_timeline_element_based_offset.idl", + "animation/scroll_timeline_options.idl", + "css/css_style_sheet_init.idl", + "css/font_face_descriptors.idl", + "css/font_face_set_load_event_init.idl", + "css/media_query_list_event_init.idl", + "css/property_definition.idl", + "css/cssom/css_matrix_component_options.idl", + "css/cssom/css_numeric_type.idl", + "document_transition/document_transition_init.idl", + "dom/element_creation_options.idl", + "dom/element_definition_options.idl", + "dom/element_registration_options.idl", + "dom/get_inner_html_options.idl", + "dom/get_root_node_options.idl", + "dom/idle_request_options.idl", + "dom/interest_cohort.idl", + "dom/mutation_observer_init.idl", + "dom/pointer_lock_options.idl", + "dom/shadow_root_init.idl", + "dom/static_range_init.idl", + "dom/events/add_event_listener_options.idl", + "dom/events/custom_event_init.idl", + "dom/events/event_init.idl", + "dom/events/event_listener_options.idl", + "dom/events/event_modifier_init.idl", + "editing/ime/edit_context_init.idl", + "editing/ime/text_update_event_init.idl", + "editing/ime/text_format_update_event_init.idl", + "events/animation_event_init.idl", + "events/animation_playback_event_init.idl", + "events/application_cache_error_event_init.idl", + "events/clipboard_event_init.idl", + "events/composition_event_init.idl", + "events/drag_event_init.idl", + "events/error_event_init.idl", + "events/focus_event_init.idl", + "events/hash_change_event_init.idl", + "events/input_event_init.idl", + "events/keyboard_event_init.idl", + "events/message_event_init.idl", + "events/mouse_event_init.idl", + "events/overscroll_event_init.idl", + "events/page_transition_event_init.idl", + "events/pointer_event_init.idl", + "events/pop_state_event_init.idl", + "events/progress_event_init.idl", + "events/promise_rejection_event_init.idl", + "events/security_policy_violation_event_init.idl", + "events/touch_event_init.idl", + "events/transition_event_init.idl", + "events/ui_event_init.idl", + "events/wheel_event_init.idl", + "fetch/request_init.idl", + "fetch/response_init.idl", + "fetch/trust_token.idl", + "fileapi/blob_property_bag.idl", + "fileapi/file_property_bag.idl", + "frame/impression_params.idl", + "frame/is_input_pending_options.idl", + "frame/navigator_ua_brand_version.idl", + "frame/reporting_observer_options.idl", + "frame/scroll_into_view_options.idl", + "frame/scroll_options.idl", + "frame/scroll_to_options.idl", + "frame/window_controls_overlay_geometry_change_event_init.idl", + "frame/window_post_message_options.idl", + "fullscreen/fullscreen_options.idl", + "geometry/dom_matrix_2d_init.idl", + "geometry/dom_matrix_init.idl", + "geometry/dom_point_init.idl", + "geometry/dom_quad_init.idl", + "geometry/dom_rect_init.idl", + "html/focus_options.idl", + "html/assigned_nodes_options.idl", + "html/canvas/baselines.idl", + "html/canvas/image_data_settings.idl", + "html/canvas/image_encode_options.idl", + "html/custom/validity_state_flags.idl", + "html/forms/form_data_event_init.idl", + "html/forms/submit_event_init.idl", + "html/portal/portal_activate_event_init.idl", + "html/portal/portal_activate_options.idl", + "html/track/track_event_init.idl", + "imagebitmap/image_bitmap_options.idl", + "input/input_device_capabilities_init.idl", + "input/touch_init.idl", + "intersection_observer/intersection_observer_init.idl", + "frame/ua_data_values.idl", + "layout/ng/custom/custom_layout_constraints_options.idl", + "layout/ng/custom/fragment_result_options.idl", + "layout/ng/custom/intrinsic_sizes_result_options.idl", + "messaging/post_message_options.idl", + "mojo/mojo_create_data_pipe_options.idl", + "mojo/mojo_create_data_pipe_result.idl", + "mojo/mojo_create_message_pipe_result.idl", + "mojo/mojo_create_shared_buffer_result.idl", + "mojo/mojo_discard_data_options.idl", + "mojo/mojo_duplicate_buffer_handle_options.idl", + "mojo/mojo_handle_signals.idl", + "mojo/mojo_map_buffer_result.idl", + "mojo/mojo_read_data_options.idl", + "mojo/mojo_read_data_result.idl", + "mojo/mojo_read_message_flags.idl", + "mojo/mojo_read_message_result.idl", + "mojo/mojo_write_data_options.idl", + "mojo/mojo_write_data_result.idl", + "mojo/test/mojo_interface_request_event_init.idl", + "page/scrolling/scroll_state_init.idl", + "resize_observer/resize_observer_options.idl", + "streams/readable_stream_byob_read_result.idl", + "streams/readable_stream_get_reader_options.idl", + "streams/readable_writable_pair.idl", + "streams/stream_pipe_options.idl", + "streams/underlying_source.idl", + "streams/queuing_strategy_init.idl", + "timing/measure_memory/memory_measurement.idl", + "timing/measure_memory/memory_breakdown_entry.idl", + "timing/measure_memory/memory_attribution.idl", + "timing/measure_memory/memory_attribution_container.idl", + "timing/performance_mark_options.idl", + "timing/performance_measure_options.idl", + "timing/performance_observer_init.idl", + "timing/profiler_frame.idl", + "timing/profiler_init_options.idl", + "timing/profiler_sample.idl", + "timing/profiler_stack.idl", + "timing/profiler_trace.idl", + "trustedtypes/trusted_type_policy_options.idl", + "workers/worker_options.idl", + "workers/worklet_options.idl", + "xml/parse_from_string_options.idl", + ], + "abspath") core_testing_dictionary_idl_files = get_path_info([ diff --git a/third_party/blink/renderer/core/events/event_target_names.json5 b/third_party/blink/renderer/core/events/event_target_names.json5 index 42f72e1bfe426..5c6e987aabca4 100644 --- a/third_party/blink/renderer/core/events/event_target_names.json5 +++ b/third_party/blink/renderer/core/events/event_target_names.json5 @@ -48,5 +48,6 @@ "Worker", "XMLHttpRequest", "XMLHttpRequestUpload", + "WindowControlsOverlay", ], } diff --git a/third_party/blink/renderer/core/frame/build.gni b/third_party/blink/renderer/core/frame/build.gni index 86cf89cb5206b..e7708653359ec 100644 --- a/third_party/blink/renderer/core/frame/build.gni +++ b/third_party/blink/renderer/core/frame/build.gni @@ -221,6 +221,8 @@ blink_core_sources_frame = [ "window_event_handlers.h", "window_controls_overlay.cc", "window_controls_overlay.h", + "window_controls_overlay_geometry_change_event.cc", + "window_controls_overlay_geometry_change_event.h", "window_or_worker_global_scope.cc", "window_or_worker_global_scope.h", ] diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index e65423f92b015..e1353cf55aa63 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc @@ -122,6 +122,7 @@ #include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/frame/web_frame_widget_impl.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" +#include "third_party/blink/renderer/core/frame/window_controls_overlay.h" #include "third_party/blink/renderer/core/fullscreen/fullscreen.h" #include "third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h" #include "third_party/blink/renderer/core/html/html_frame_element_base.h" @@ -2885,6 +2886,14 @@ void LocalFrame::UpdateWindowControlsOverlay( StyleEnvironmentVariables::FormatPx(insets.bottom())); vars.SetVariable(UADefinedVariable::kTitlebarAreaInsetRight, StyleEnvironmentVariables::FormatPx(insets.right())); + + auto* window_controls_overlay = + WindowControlsOverlay::FromIfExists(*DomWindow()->navigator()); + + if (window_controls_overlay) { + window_controls_overlay->WindowControlsOverlayChanged( + window_controls_overlay_rect); + } } void LocalFrame::RequestFullscreenVideoElement() { diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.cc b/third_party/blink/renderer/core/frame/window_controls_overlay.cc index 0804aa5ed5344..96b8f2bfdffc5 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.cc +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.cc @@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/navigator.h" +#include "third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.h" #include "third_party/blink/renderer/platform/heap/handle.h" namespace blink { @@ -16,8 +17,7 @@ const char WindowControlsOverlay::kSupplementName[] = "WindowControlsOverlay"; // static WindowControlsOverlay& WindowControlsOverlay::From(Navigator& navigator) { - WindowControlsOverlay* supplement = - Supplement::From(navigator); + WindowControlsOverlay* supplement = FromIfExists(navigator); if (!supplement) { supplement = MakeGarbageCollected(navigator); ProvideTo(navigator, supplement); @@ -25,6 +25,12 @@ WindowControlsOverlay& WindowControlsOverlay::From(Navigator& navigator) { return *supplement; } +// static +WindowControlsOverlay* WindowControlsOverlay::FromIfExists( + Navigator& navigator) { + return Supplement::From(navigator); +} + // static WindowControlsOverlay* WindowControlsOverlay::windowControlsOverlay( Navigator& navigator) { @@ -36,6 +42,14 @@ WindowControlsOverlay::WindowControlsOverlay(Navigator& navigator) WindowControlsOverlay::~WindowControlsOverlay() = default; +ExecutionContext* WindowControlsOverlay::GetExecutionContext() const { + return GetSupplementable()->DomWindow(); +} + +const AtomicString& WindowControlsOverlay::InterfaceName() const { + return event_target_names::kWindowControlsOverlay; +} + bool WindowControlsOverlay::visible() const { if (!GetSupplementable()->DomWindow()) return false; @@ -57,8 +71,17 @@ DOMRect* WindowControlsOverlay::getBoundingClientRect() const { return DOMRect::Create(rect.x(), rect.y(), rect.width(), rect.height()); } +void WindowControlsOverlay::WindowControlsOverlayChanged( + const gfx::Rect& rect) { + DispatchEvent( + *(MakeGarbageCollected( + event_type_names::kGeometrychange, + DOMRect::Create(rect.x(), rect.y(), rect.width(), rect.height()), + !rect.IsEmpty()))); +} + void WindowControlsOverlay::Trace(blink::Visitor* visitor) const { - ScriptWrappable::Trace(visitor); + EventTargetWithInlineData::Trace(visitor); Supplement::Trace(visitor); } diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.h b/third_party/blink/renderer/core/frame/window_controls_overlay.h index 16a3731169452..0a6d722ae12ec 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.h +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.h @@ -5,7 +5,9 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_H_ +#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/core/geometry/dom_rect.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -15,8 +17,9 @@ namespace blink { class Navigator; -class CORE_EXPORT WindowControlsOverlay final : public ScriptWrappable, - public Supplement { +class CORE_EXPORT WindowControlsOverlay final + : public EventTargetWithInlineData, + public Supplement { DEFINE_WRAPPERTYPEINFO(); public: @@ -25,6 +28,7 @@ class CORE_EXPORT WindowControlsOverlay final : public ScriptWrappable, static WindowControlsOverlay* windowControlsOverlay(Navigator& navigator); static WindowControlsOverlay& From(Navigator& navigator); + static WindowControlsOverlay* FromIfExists(Navigator& navigator); explicit WindowControlsOverlay(Navigator& navigator); WindowControlsOverlay(const WindowControlsOverlay&) = delete; @@ -32,10 +36,16 @@ class CORE_EXPORT WindowControlsOverlay final : public ScriptWrappable, WindowControlsOverlay& operator=(const WindowControlsOverlay&) = delete; + ExecutionContext* GetExecutionContext() const override; + const AtomicString& InterfaceName() const override; + + DEFINE_ATTRIBUTE_EVENT_LISTENER(geometrychange, kGeometrychange) + bool visible() const; DOMRect* getBoundingClientRect() const; - // ScriptWrappable + void WindowControlsOverlayChanged(const gfx::Rect& rect); + void Trace(Visitor*) const override; }; diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.idl b/third_party/blink/renderer/core/frame/window_controls_overlay.idl index 1ef1d140698cd..0315cf1c79a14 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.idl +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.idl @@ -7,7 +7,8 @@ [ RuntimeEnabled=WebAppWindowControlsOverlay, Exposed=Window -] interface WindowControlsOverlay { +] interface WindowControlsOverlay : EventTarget { readonly attribute boolean visible; DOMRect getBoundingClientRect(); + attribute EventHandler ongeometrychange; }; diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.cc b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.cc new file mode 100644 index 0000000000000..21360bb58e9d5 --- /dev/null +++ b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.cc @@ -0,0 +1,48 @@ +// Copyright 2020 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. + +#include "third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.h" + +#include "third_party/blink/renderer/bindings/core/v8/v8_window_controls_overlay_geometry_change_event_init.h" +#include "third_party/blink/renderer/core/geometry/dom_rect.h" +#include "ui/gfx/geometry/rect.h" + +namespace blink { + +WindowControlsOverlayGeometryChangeEvent* +WindowControlsOverlayGeometryChangeEvent::Create( + const AtomicString& type, + const WindowControlsOverlayGeometryChangeEventInit* initializer) { + return MakeGarbageCollected( + type, initializer); +} + +WindowControlsOverlayGeometryChangeEvent:: + WindowControlsOverlayGeometryChangeEvent( + const AtomicString& type, + const WindowControlsOverlayGeometryChangeEventInit* initializer) + : Event(type, initializer) {} + +WindowControlsOverlayGeometryChangeEvent:: + WindowControlsOverlayGeometryChangeEvent(const AtomicString& type, + DOMRect* rect, + bool visible) + : Event(type, Bubbles::kNo, Cancelable::kNo), + bounding_rect_(rect), + visible_(visible) {} + +DOMRect* WindowControlsOverlayGeometryChangeEvent::boundingRect() const { + return bounding_rect_; +} + +bool WindowControlsOverlayGeometryChangeEvent::visible() const { + return visible_; +} + +void WindowControlsOverlayGeometryChangeEvent::Trace(Visitor* visitor) const { + visitor->Trace(bounding_rect_); + Event::Trace(visitor); +} + +} // namespace blink diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.h b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.h new file mode 100644 index 0000000000000..1cfc3fa2529d7 --- /dev/null +++ b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.h @@ -0,0 +1,43 @@ +// Copyright 2021 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_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_GEOMETRY_CHANGE_EVENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_GEOMETRY_CHANGE_EVENT_H_ + +#include "third_party/blink/renderer/core/dom/events/event.h" +#include "third_party/blink/renderer/platform/heap/handle.h" + +namespace blink { + +class DOMRect; +class WindowControlsOverlayGeometryChangeEventInit; + +class WindowControlsOverlayGeometryChangeEvent final : public Event { + DEFINE_WRAPPERTYPEINFO(); + + public: + static WindowControlsOverlayGeometryChangeEvent* Create( + const AtomicString& type, + const WindowControlsOverlayGeometryChangeEventInit*); + + WindowControlsOverlayGeometryChangeEvent( + const AtomicString& type, + const WindowControlsOverlayGeometryChangeEventInit*); + WindowControlsOverlayGeometryChangeEvent(const AtomicString& type, + DOMRect* rect, + bool visible); + + DOMRect* boundingRect() const; + bool visible() const; + + void Trace(Visitor*) const override; + + private: + Member bounding_rect_; + bool visible_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_GEOMETRY_CHANGE_EVENT_H_ diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl new file mode 100644 index 0000000000000..bfc2392803865 --- /dev/null +++ b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl @@ -0,0 +1,15 @@ +// Copyright 2021 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. + +// https://github.com/WICG/window-controls-overlay/blob/master/explainer.md + +[ + Exposed=Window, + RuntimeEnabled=WebAppWindowControlsOverlay +] interface WindowControlsOverlayGeometryChangeEvent : Event { + constructor(DOMString type, WindowControlsOverlayGeometryChangeEventInit eventInitDict); + [SameObject] readonly attribute DOMRect boundingRect; + readonly attribute boolean visible; +}; + diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl new file mode 100644 index 0000000000000..76f3974bb10a9 --- /dev/null +++ b/third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl @@ -0,0 +1,8 @@ +// Copyright 2021 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. + +dictionary WindowControlsOverlayGeometryChangeEventInit : EventInit { + required DOMRect boundingRect; + required boolean visible; +}; diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt index 3c87e7a38b8b6..31f8dff4c2d66 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt @@ -5,5 +5,6 @@ FAIL visible should be false Cannot read property 'visible' of undefined FAIL getBoundingClientRect should be a method of the windowControlsOverlay object assert_idl_attribute: provided value is not an object FAIL getBoundingClientRect return type should be DOMRect Cannot read property 'getBoundingClientRect' of undefined FAIL getBoundingClientRect should return a empty DOMRect Cannot read property 'getBoundingClientRect' of undefined +FAIL ongeometrychange should be a member of the windowControlsOverlay object assert_idl_attribute: provided value is not an object Harness: the test ran to completion. diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html index 069ff1602a621..0f7230e09db8a 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html @@ -34,4 +34,8 @@ assert_equals(rect.width, 0); assert_equals(rect.height, 0); }, 'getBoundingClientRect should return a empty DOMRect'); + + test(function(){ + assert_idl_attribute(navigator.windowControlsOverlay, 'ongeometrychange'); + }, 'ongeometrychange should be a member of the windowControlsOverlay object'); diff --git a/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt index 40dfc179c3c71..f0e12b4d39d2c 100644 --- a/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt +++ b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt @@ -5,5 +5,6 @@ PASS visible should be false PASS getBoundingClientRect should be a method of the windowControlsOverlay object PASS getBoundingClientRect return type should be DOMRect PASS getBoundingClientRect should return a empty DOMRect +PASS ongeometrychange should be a member of the windowControlsOverlay object Harness: the test ran to completion.