From 469a0000b85cd3bb805e749c1101bae897d9ad3a Mon Sep 17 00:00:00 2001 From: Hassan Talat Date: Tue, 2 Mar 2021 19:43:46 +0000 Subject: [PATCH] dpwas:Add ongeometrychange event to WindowControlsOverlay For PWAs with WindowControlsOverlay, This CL adds an ongeometrychange event for whenever the overlay bounds or visibility changes to notify the app. An example of changing bounds would be when the app is launched, the app origin is displayed and then hidden. Explainer: https://github.com/WICG/window-controls-overlay/blob/master/explainer.md Design Doc: https://docs.google.com/document/d/1k0YL_-VMLIfjYCgJ2v6cMvuUv2qMKg4BgLI2tJ4qtyo/edit?usp=sharing I2P: https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/cper6nNLFRQ/hU91kfCWBQAJ Bug: 937121 Change-Id: Ic0f6e76883d3ec5fc98f8d1bf734e72aa49de2c2 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2686584 Reviewed-by: Daniel Cheng Reviewed-by: Avi Drissman Commit-Queue: Hassan Talat Cr-Commit-Position: refs/heads/master@{#859080} --- .../web_contents_impl_browsertest.cc | 43 +++ .../renderer/bindings/generated_in_core.gni | 4 + .../blink/renderer/bindings/idl_in_core.gni | 2 + .../blink/renderer/core/core_idl_files.gni | 289 +++++++++--------- .../core/events/event_target_names.json5 | 1 + .../blink/renderer/core/frame/build.gni | 2 + .../blink/renderer/core/frame/local_frame.cc | 9 + .../core/frame/window_controls_overlay.cc | 29 +- .../core/frame/window_controls_overlay.h | 16 +- .../core/frame/window_controls_overlay.idl | 3 +- ..._controls_overlay_geometry_change_event.cc | 48 +++ ...w_controls_overlay_geometry_change_event.h | 43 +++ ...controls_overlay_geometry_change_event.idl | 15 + ...ols_overlay_geometry_change_event_init.idl | 8 + ...gator-window-controls-overlay-expected.txt | 1 + .../navigator-window-controls-overlay.html | 4 + ...gator-window-controls-overlay-expected.txt | 1 + 17 files changed, 368 insertions(+), 150 deletions(-) create mode 100644 third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.cc create mode 100644 third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.h create mode 100644 third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl create mode 100644 third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl 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.