Files
serenity/Userland/Libraries/LibWebView/OutOfProcessWebView.h
Aliaksandr Kalenik 40a570e237 LibWeb+WebContent: Move scrollbar painting into WebContent
The main intention of this change is to have a consistent look and
behavior across all scrollbars, including elements with
`overflow: scroll` and `overflow: auto`, iframes, and a page.

Before:
- Page's scrollbar is painted by Browser (Qt/AppKit) using the
  corresponding UI framework style,
- Both WebContent and Browser know the scroll position offset.
- WebContent uses did_request_scroll_to() IPC call to send updates.
- Browser uses set_viewport_rect() to send updates.

After:
- Page's scrollbar is painted on WebContent side using the same style as
  currently used for elements with `overflow: scroll` and
  `overflow: auto`. A nice side effects: scrollbars are now painted for
  iframes, and page's scrollbar respects scrollbar-width CSS property.
- Only WebContent knows scroll position offset.
- did_request_scroll_to() is no longer used.
- set_viewport_rect() is changed to set_viewport_size().

(cherry picked from commit 5285e22f2aa09152365179865f135e7bc5d254a5)

Co-authored-by: Jamie Mansfield <jmansfield@cadixdev.org>
Co-authored-by: Nico Weber <thakis@chromium.org>
2024-07-07 11:32:25 +02:00

93 lines
3.2 KiB
C++

/*
* Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Queue.h>
#include <LibGUI/Frame.h>
#include <LibGUI/Widget.h>
#include <LibURL/URL.h>
#include <LibWeb/CSS/Selector.h>
#include <LibWeb/HTML/ActivateTab.h>
#include <LibWeb/Page/Page.h>
#include <LibWebView/ViewImplementation.h>
namespace Messages::WebContentServer {
class WebdriverExecuteScriptResponse;
}
namespace WebView {
class WebContentClient;
class OutOfProcessWebView final
: public GUI::Frame
, public ViewImplementation {
C_OBJECT(OutOfProcessWebView);
using Super = GUI::Frame;
public:
virtual ~OutOfProcessWebView() override;
ByteString dump_layout_tree();
OrderedHashMap<String, String> get_local_storage_entries();
OrderedHashMap<String, String> get_session_storage_entries();
void set_content_filters(Vector<String>);
void set_autoplay_allowed_on_all_websites();
void set_autoplay_allowlist(Vector<String>);
void set_proxy_mappings(Vector<ByteString> proxies, HashMap<ByteString, size_t> mappings);
void connect_to_webdriver(ByteString const& webdriver_ipc_path);
void set_window_position(Gfx::IntPoint);
void set_window_size(Gfx::IntSize);
void set_system_visibility_state(bool visible);
// This is a hint that tells OOPWV that the content will scale to the viewport size.
// In practice, this means that OOPWV may render scaled stale versions of the content while resizing.
void set_content_scales_to_viewport(bool);
private:
OutOfProcessWebView();
// ^Widget
virtual void paint_event(GUI::PaintEvent&) override;
virtual void resize_event(GUI::ResizeEvent&) override;
virtual void mousedown_event(GUI::MouseEvent&) override;
virtual void mouseup_event(GUI::MouseEvent&) override;
virtual void mousemove_event(GUI::MouseEvent&) override;
virtual void mousewheel_event(GUI::MouseEvent&) override;
virtual void doubleclick_event(GUI::MouseEvent&) override;
virtual void keydown_event(GUI::KeyEvent&) override;
virtual void keyup_event(GUI::KeyEvent&) override;
virtual void theme_change_event(GUI::ThemeChangeEvent&) override;
virtual void screen_rects_change_event(GUI::ScreenRectsChangeEvent&) override;
virtual void focusin_event(GUI::FocusEvent&) override;
virtual void focusout_event(GUI::FocusEvent&) override;
virtual void show_event(GUI::ShowEvent&) override;
virtual void hide_event(GUI::HideEvent&) override;
// ^WebView::ViewImplementation
virtual void initialize_client(CreateNewClient) override;
virtual void update_zoom() override;
virtual Web::DevicePixelSize viewport_size() const override;
virtual Gfx::IntPoint to_content_position(Gfx::IntPoint widget_position) const override;
virtual Gfx::IntPoint to_widget_position(Gfx::IntPoint content_position) const override;
void enqueue_native_event(Web::MouseEvent::Type, GUI::MouseEvent const& event);
void enqueue_native_event(Web::KeyEvent::Type, GUI::KeyEvent const& event);
void finish_handling_key_event(Web::KeyEvent const&);
bool m_content_scales_to_viewport { false };
};
}