2020-01-18 09:38:21 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
2021-09-03 11:14:37 +01:00
|
|
|
* Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
|
2020-01-18 09:38:21 +01:00
|
|
|
*
|
2021-04-22 01:24:48 -07:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
2020-01-18 09:38:21 +01:00
|
|
|
*/
|
|
|
|
|
2020-02-14 21:41:10 +01:00
|
|
|
#include <AK/ByteBuffer.h>
|
2020-05-25 14:54:27 -04:00
|
|
|
#include <LibGfx/Palette.h>
|
LibWeb: Add CSS ValueListStyleValue
As the new CSS parser tokenizes its input, we can no longer easily
rely on a StringStyleValue for multi-value properties. (eg, border)
ValueListStyleValue lets us wrap all of the ComponentValues that
the Parser produced for one declaration, as a single StyleValue, to
then be parsed into StyleValues by the StyleResolver.
Originally, I wanted it to be a list of StyleValues, but several
properties use syntax that makes use of non-StyleValue tokens, eg:
```css
/* Syntax using a / */
font: 12px/14px sans-serif;
/* Multiple values separated by commas */
background: url(catdog.png), url(another-image.jpg), blue;
```
Passing the ComponentValue tokens themselves means that all that
information is carried over. The alternative might be to create a
StyleValue subclass for each property and parse them fully inside
the Parser. (eg, `FontStyleValue`)
I decided against `ListStyleValue` as a name, to avoid confusion
with list styles. It's not ideal, but names are hard.
2021-07-13 16:50:58 +01:00
|
|
|
#include <LibWeb/CSS/Parser/StyleComponentValueRule.h>
|
2020-03-07 10:32:51 +01:00
|
|
|
#include <LibWeb/CSS/StyleValue.h>
|
|
|
|
#include <LibWeb/DOM/Document.h>
|
2020-06-02 13:51:30 +02:00
|
|
|
#include <LibWeb/Loader/LoadRequest.h>
|
2020-06-01 20:42:50 +02:00
|
|
|
#include <LibWeb/Loader/ResourceLoader.h>
|
2021-05-30 12:36:53 +02:00
|
|
|
#include <LibWeb/Page/BrowsingContext.h>
|
2021-08-24 16:28:08 +02:00
|
|
|
#include <LibWeb/Page/Page.h>
|
2019-06-22 21:48:21 +02:00
|
|
|
|
2020-07-26 20:01:35 +02:00
|
|
|
namespace Web::CSS {
|
2020-03-07 10:27:02 +01:00
|
|
|
|
2019-06-22 21:48:21 +02:00
|
|
|
StyleValue::StyleValue(Type type)
|
|
|
|
: m_type(type)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
StyleValue::~StyleValue()
|
|
|
|
{
|
|
|
|
}
|
2019-10-06 10:25:08 +02:00
|
|
|
|
|
|
|
String IdentifierStyleValue::to_string() const
|
|
|
|
{
|
2020-12-15 20:39:09 +01:00
|
|
|
return CSS::string_from_value_id(m_id);
|
2019-10-06 10:25:08 +02:00
|
|
|
}
|
|
|
|
|
2021-09-16 19:20:20 +01:00
|
|
|
Color IdentifierStyleValue::to_color(Layout::NodeWithStyle const& node) const
|
2019-10-06 10:25:08 +02:00
|
|
|
{
|
2021-09-16 19:40:56 +01:00
|
|
|
if (id() == CSS::ValueID::Currentcolor) {
|
|
|
|
if (!node.has_style())
|
|
|
|
return Color::Black;
|
|
|
|
return node.computed_values().color();
|
|
|
|
}
|
|
|
|
|
2021-09-16 19:20:20 +01:00
|
|
|
auto& document = node.document();
|
2020-12-15 20:39:09 +01:00
|
|
|
if (id() == CSS::ValueID::LibwebLink)
|
2019-10-06 10:25:08 +02:00
|
|
|
return document.link_color();
|
2020-05-25 14:54:27 -04:00
|
|
|
|
2021-02-23 20:42:32 +01:00
|
|
|
VERIFY(document.page());
|
2020-11-12 18:23:05 +01:00
|
|
|
auto palette = document.page()->palette();
|
2020-05-25 14:54:27 -04:00
|
|
|
switch (id()) {
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteDesktopBackground:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::DesktopBackground);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteActiveWindowBorder1:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ActiveWindowBorder1);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteActiveWindowBorder2:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ActiveWindowBorder2);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteActiveWindowTitle:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ActiveWindowTitle);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteInactiveWindowBorder1:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::InactiveWindowBorder1);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteInactiveWindowBorder2:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::InactiveWindowBorder2);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteInactiveWindowTitle:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::InactiveWindowTitle);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMovingWindowBorder1:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MovingWindowBorder1);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMovingWindowBorder2:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MovingWindowBorder2);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMovingWindowTitle:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MovingWindowTitle);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteHighlightWindowBorder1:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::HighlightWindowBorder1);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteHighlightWindowBorder2:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::HighlightWindowBorder2);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteHighlightWindowTitle:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::HighlightWindowTitle);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMenuStripe:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MenuStripe);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMenuBase:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MenuBase);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMenuBaseText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MenuBaseText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMenuSelection:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MenuSelection);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteMenuSelectionText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::MenuSelectionText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteWindow:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::Window);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteWindowText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::WindowText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteButton:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::Button);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteButtonText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ButtonText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteBase:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::Base);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteBaseText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::BaseText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteThreedHighlight:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ThreedHighlight);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteThreedShadow1:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ThreedShadow1);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteThreedShadow2:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ThreedShadow2);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteHoverHighlight:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::HoverHighlight);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSelection:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::Selection);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSelectionText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SelectionText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteInactiveSelection:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::InactiveSelection);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteInactiveSelectionText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::InactiveSelectionText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteRubberBandFill:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::RubberBandFill);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteRubberBandBorder:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::RubberBandBorder);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteLink:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::Link);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteActiveLink:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::ActiveLink);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteVisitedLink:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::VisitedLink);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteRuler:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::Ruler);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteRulerBorder:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::RulerBorder);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteRulerActiveText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::RulerActiveText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteRulerInactiveText:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::RulerInactiveText);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteTextCursor:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::TextCursor);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteFocusOutline:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::FocusOutline);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxComment:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxComment);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxNumber:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxNumber);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxString:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxString);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxType:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxType);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxPunctuation:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxPunctuation);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxOperator:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxOperator);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxKeyword:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxKeyword);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxControlKeyword:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxControlKeyword);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxIdentifier:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxIdentifier);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxPreprocessorStatement:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxPreprocessorStatement);
|
2020-12-15 20:39:09 +01:00
|
|
|
case CSS::ValueID::LibwebPaletteSyntaxPreprocessorValue:
|
2020-05-25 14:54:27 -04:00
|
|
|
return palette.color(ColorRole::SyntaxPreprocessorValue);
|
|
|
|
default:
|
|
|
|
return {};
|
|
|
|
}
|
2019-10-06 10:25:08 +02:00
|
|
|
}
|
2019-10-19 11:49:46 +02:00
|
|
|
|
2021-09-13 00:33:23 +03:00
|
|
|
ImageStyleValue::ImageStyleValue(const AK::URL& url, DOM::Document& document)
|
2019-10-19 11:49:46 +02:00
|
|
|
: StyleValue(Type::Image)
|
|
|
|
, m_url(url)
|
AK: Make RefPtr, NonnullRefPtr, WeakPtr thread safe
This makes most operations thread safe, especially so that they
can safely be used in the Kernel. This includes obtaining a strong
reference from a weak reference, which now requires an explicit
call to WeakPtr::strong_ref(). Another major change is that
Weakable::make_weak_ref() may require the explicit target type.
Previously we used reinterpret_cast in WeakPtr, assuming that it
can be properly converted. But WeakPtr does not necessarily have
the knowledge to be able to do this. Instead, we now ask the class
itself to deliver a WeakPtr to the type that we want.
Also, WeakLink is no longer specific to a target type. The reason
for this is that we want to be able to safely convert e.g. WeakPtr<T>
to WeakPtr<U>, and before this we just reinterpret_cast the internal
WeakLink<T> to WeakLink<U>, which is a bold assumption that it would
actually produce the correct code. Instead, WeakLink now operates
on just a raw pointer and we only make those constructors/operators
available if we can verify that it can be safely cast.
In order to guarantee thread safety, we now use the least significant
bit in the pointer for locking purposes. This also means that only
properly aligned pointers can be used.
2020-09-29 16:26:13 -06:00
|
|
|
, m_document(document)
|
2019-10-19 11:49:46 +02:00
|
|
|
{
|
2021-04-14 10:41:14 -04:00
|
|
|
auto request = LoadRequest::create_for_url_on_page(url, document.page());
|
2020-06-05 23:32:23 +02:00
|
|
|
set_resource(ResourceLoader::the().load_resource(Resource::Type::Image, request));
|
2020-06-02 13:51:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImageStyleValue::resource_did_load()
|
|
|
|
{
|
|
|
|
if (!m_document)
|
|
|
|
return;
|
2020-06-23 13:33:03 +02:00
|
|
|
m_bitmap = resource()->bitmap();
|
2020-06-02 13:51:30 +02:00
|
|
|
// FIXME: Do less than a full repaint if possible?
|
2021-05-30 12:36:53 +02:00
|
|
|
if (m_document->browsing_context())
|
|
|
|
m_document->browsing_context()->set_needs_display({});
|
2019-10-19 11:49:46 +02:00
|
|
|
}
|
2020-03-07 10:27:02 +01:00
|
|
|
|
|
|
|
}
|