ladybird/Userland/Libraries/LibWeb/CSS/VisualViewport.cpp
Andreas Kling c0d7f748ed LibWeb: Avoid FlyString lookups when setting IDL interface prototypes
This commit introduces a WEB_SET_PROTOTYPE_FOR_INTERFACE macro that
caches the interface name in a local static FlyString. This means that
we only pay for FlyString-from-literal lookup once per browser lifetime
instead of every time the interface is instantiated.
2024-03-16 16:35:54 +01:00

155 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2023, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/Bindings/VisualViewportPrototype.h>
#include <LibWeb/CSS/VisualViewport.h>
#include <LibWeb/DOM/Document.h>
#include <LibWeb/DOM/EventDispatcher.h>
#include <LibWeb/DOM/IDLEventListener.h>
#include <LibWeb/HTML/EventHandler.h>
#include <LibWeb/HTML/EventNames.h>
namespace Web::CSS {
JS_DEFINE_ALLOCATOR(VisualViewport);
JS::NonnullGCPtr<VisualViewport> VisualViewport::create(DOM::Document& document)
{
return document.heap().allocate<VisualViewport>(document.realm(), document);
}
VisualViewport::VisualViewport(DOM::Document& document)
: DOM::EventTarget(document.realm())
, m_document(document)
{
}
void VisualViewport::initialize(JS::Realm& realm)
{
Base::initialize(realm);
WEB_SET_PROTOTYPE_FOR_INTERFACE(VisualViewport);
}
void VisualViewport::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_document);
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-offsetleft
double VisualViewport::offset_left() const
{
// 1. If the visual viewports associated document is not fully active, return 0.
if (!m_document->is_fully_active())
return 0;
// 2. Otherwise, return the offset of the left edge of the visual viewport from the left edge of the layout viewport.
VERIFY(m_document->navigable());
return m_document->viewport_rect().left().to_double();
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-offsettop
double VisualViewport::offset_top() const
{
// 1. If the visual viewports associated document is not fully active, return 0.
if (!m_document->is_fully_active())
return 0;
// 2. Otherwise, return the offset of the top edge of the visual viewport from the top edge of the layout viewport.
VERIFY(m_document->navigable());
return m_document->viewport_rect().top().to_double();
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-pageleft
double VisualViewport::page_left() const
{
// 1. If the visual viewports associated document is not fully active, return 0.
if (!m_document->is_fully_active())
return 0;
// FIXME: 2. Otherwise, return the offset of the left edge of the visual viewport
// from the left edge of the initial containing block of the layout viewports document.
return offset_left();
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-pagetop
double VisualViewport::page_top() const
{
// 1. If the visual viewports associated document is not fully active, return 0.
if (!m_document->is_fully_active())
return 0;
// FIXME: 2. Otherwise, return the offset of the top edge of the visual viewport
// from the top edge of the initial containing block of the layout viewports document.
return offset_top();
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-width
double VisualViewport::width() const
{
// 1. If the visual viewports associated document is not fully active, return 0.
if (!m_document->is_fully_active())
return 0;
// 2. Otherwise, return the width of the visual viewport
// FIXME: excluding the width of any rendered vertical classic scrollbar that is fixed to the visual viewport.
VERIFY(m_document->navigable());
return m_document->viewport_rect().width().to_double();
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-height
double VisualViewport::height() const
{
// 1. If the visual viewports associated document is not fully active, return 0.
if (!m_document->is_fully_active())
return 0;
// 2. Otherwise, return the height of the visual viewport
// FIXME: excluding the height of any rendered vertical classic scrollbar that is fixed to the visual viewport.
VERIFY(m_document->navigable());
return m_document->viewport_rect().height().to_double();
}
// https://drafts.csswg.org/cssom-view/#dom-visualviewport-scale
double VisualViewport::scale() const
{
// FIXME: Implement.
return 1;
}
void VisualViewport::set_onresize(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::resize, event_handler);
}
WebIDL::CallbackType* VisualViewport::onresize()
{
return event_handler_attribute(HTML::EventNames::resize);
}
void VisualViewport::set_onscroll(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::scroll, event_handler);
}
WebIDL::CallbackType* VisualViewport::onscroll()
{
return event_handler_attribute(HTML::EventNames::scroll);
}
void VisualViewport::set_onscrollend(WebIDL::CallbackType* event_handler)
{
set_event_handler_attribute(HTML::EventNames::scrollend, event_handler);
}
WebIDL::CallbackType* VisualViewport::onscrollend()
{
return event_handler_attribute(HTML::EventNames::scrollend);
}
}