123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #include <AK/ByteBuffer.h>
- #include <LibGfx/Bitmap.h>
- #include <LibGfx/PNGLoader.h>
- #include <LibGfx/Palette.h>
- #include <LibWeb/CSS/StyleValue.h>
- #include <LibWeb/DOM/Document.h>
- #include <LibWeb/Frame/Frame.h>
- #include <LibWeb/Loader/LoadRequest.h>
- #include <LibWeb/Loader/ResourceLoader.h>
- #include <LibWeb/PageView.h>
- namespace Web {
- StyleValue::StyleValue(Type type)
- : m_type(type)
- {
- }
- StyleValue::~StyleValue()
- {
- }
- String IdentifierStyleValue::to_string() const
- {
- switch (id()) {
- case CSS::ValueID::Invalid:
- return "(invalid)";
- case CSS::ValueID::VendorSpecificLink:
- return "-libweb-link";
- case CSS::ValueID::VendorSpecificPaletteDesktopBackground:
- return "-libweb-palette-desktop-background";
- case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder1:
- return "-libweb-palette-active-window-border1";
- case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder2:
- return "-libweb-palette-active-window-border2";
- case CSS::ValueID::VendorSpecificPaletteActiveWindowTitle:
- return "-libweb-palette-active-window-title";
- case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder1:
- return "-libweb-palette-inactive-window-border1";
- case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder2:
- return "-libweb-palette-inactive-window-border2";
- case CSS::ValueID::VendorSpecificPaletteInactiveWindowTitle:
- return "-libweb-palette-inactive-window-title";
- case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder1:
- return "-libweb-palette-moving-window-border1";
- case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder2:
- return "-libweb-palette-moving-window-border2";
- case CSS::ValueID::VendorSpecificPaletteMovingWindowTitle:
- return "-libweb-palette-moving-window-title";
- case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder1:
- return "-libweb-palette-highlight-window-border1";
- case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder2:
- return "-libweb-palette-highlight-window-border2";
- case CSS::ValueID::VendorSpecificPaletteHighlightWindowTitle:
- return "-libweb-palette-highlight-window-title";
- case CSS::ValueID::VendorSpecificPaletteMenuStripe:
- return "-libweb-palette-menu-stripe";
- case CSS::ValueID::VendorSpecificPaletteMenuBase:
- return "-libweb-palette-menu-base";
- case CSS::ValueID::VendorSpecificPaletteMenuBaseText:
- return "-libweb-palette-menu-base-text";
- case CSS::ValueID::VendorSpecificPaletteMenuSelection:
- return "-libweb-palette-menu-selection";
- case CSS::ValueID::VendorSpecificPaletteMenuSelectionText:
- return "-libweb-palette-menu-selection-text";
- case CSS::ValueID::VendorSpecificPaletteWindow:
- return "-libweb-palette-window";
- case CSS::ValueID::VendorSpecificPaletteWindowText:
- return "-libweb-palette-window-text";
- case CSS::ValueID::VendorSpecificPaletteButton:
- return "-libweb-palette-button";
- case CSS::ValueID::VendorSpecificPaletteButtonText:
- return "-libweb-palette-button-text";
- case CSS::ValueID::VendorSpecificPaletteBase:
- return "-libweb-palette-base";
- case CSS::ValueID::VendorSpecificPaletteBaseText:
- return "-libweb-palette-base-text";
- case CSS::ValueID::VendorSpecificPaletteThreedHighlight:
- return "-libweb-palette-threed-highlight";
- case CSS::ValueID::VendorSpecificPaletteThreedShadow1:
- return "-libweb-palette-threed-shadow1";
- case CSS::ValueID::VendorSpecificPaletteThreedShadow2:
- return "-libweb-palette-threed-shadow2";
- case CSS::ValueID::VendorSpecificPaletteHoverHighlight:
- return "-libweb-palette-hover-highlight";
- case CSS::ValueID::VendorSpecificPaletteSelection:
- return "-libweb-palette-selection";
- case CSS::ValueID::VendorSpecificPaletteSelectionText:
- return "-libweb-palette-selection-text";
- case CSS::ValueID::VendorSpecificPaletteInactiveSelection:
- return "-libweb-palette-inactive-selection";
- case CSS::ValueID::VendorSpecificPaletteInactiveSelectionText:
- return "-libweb-palette-inactive-selection-text";
- case CSS::ValueID::VendorSpecificPaletteRubberBandFill:
- return "-libweb-palette-rubber-band-fill";
- case CSS::ValueID::VendorSpecificPaletteRubberBandBorder:
- return "-libweb-palette-rubber-band-border";
- case CSS::ValueID::VendorSpecificPaletteLink:
- return "-libweb-palette-link";
- case CSS::ValueID::VendorSpecificPaletteActiveLink:
- return "-libweb-palette-active-link";
- case CSS::ValueID::VendorSpecificPaletteVisitedLink:
- return "-libweb-palette-visited-link";
- case CSS::ValueID::VendorSpecificPaletteRuler:
- return "-libweb-palette-ruler";
- case CSS::ValueID::VendorSpecificPaletteRulerBorder:
- return "-libweb-palette-ruler-border";
- case CSS::ValueID::VendorSpecificPaletteRulerActiveText:
- return "-libweb-palette-ruler-active-text";
- case CSS::ValueID::VendorSpecificPaletteRulerInactiveText:
- return "-libweb-palette-ruler-inactive-text";
- case CSS::ValueID::VendorSpecificPaletteTextCursor:
- return "-libweb-palette-text-cursor";
- case CSS::ValueID::VendorSpecificPaletteFocusOutline:
- return "-libweb-palette-focus-outline";
- case CSS::ValueID::VendorSpecificPaletteSyntaxComment:
- return "-libweb-palette-syntax-comment";
- case CSS::ValueID::VendorSpecificPaletteSyntaxNumber:
- return "-libweb-palette-syntax-number";
- case CSS::ValueID::VendorSpecificPaletteSyntaxString:
- return "-libweb-palette-syntax-string";
- case CSS::ValueID::VendorSpecificPaletteSyntaxType:
- return "-libweb-palette-syntax-type";
- case CSS::ValueID::VendorSpecificPaletteSyntaxPunctuation:
- return "-libweb-palette-syntax-punctuation";
- case CSS::ValueID::VendorSpecificPaletteSyntaxOperator:
- return "-libweb-palette-syntax-operator";
- case CSS::ValueID::VendorSpecificPaletteSyntaxKeyword:
- return "-libweb-palette-syntax-keyword";
- case CSS::ValueID::VendorSpecificPaletteSyntaxControlKeyword:
- return "-libweb-palette-syntax-control-keyword";
- case CSS::ValueID::VendorSpecificPaletteSyntaxIdentifier:
- return "-libweb-palette-syntax-identifier";
- case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorStatement:
- return "-libweb-palette-syntax-preprocessor-statement";
- case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorValue:
- return "-libweb-palette-syntax-preprocessor-value";
- default:
- ASSERT_NOT_REACHED();
- }
- }
- Color IdentifierStyleValue::to_color(const Document& document) const
- {
- if (id() == CSS::ValueID::VendorSpecificLink)
- return document.link_color();
- auto palette = document.frame()->page().palette();
- switch (id()) {
- case CSS::ValueID::VendorSpecificPaletteDesktopBackground:
- return palette.color(ColorRole::DesktopBackground);
- case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder1:
- return palette.color(ColorRole::ActiveWindowBorder1);
- case CSS::ValueID::VendorSpecificPaletteActiveWindowBorder2:
- return palette.color(ColorRole::ActiveWindowBorder2);
- case CSS::ValueID::VendorSpecificPaletteActiveWindowTitle:
- return palette.color(ColorRole::ActiveWindowTitle);
- case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder1:
- return palette.color(ColorRole::InactiveWindowBorder1);
- case CSS::ValueID::VendorSpecificPaletteInactiveWindowBorder2:
- return palette.color(ColorRole::InactiveWindowBorder2);
- case CSS::ValueID::VendorSpecificPaletteInactiveWindowTitle:
- return palette.color(ColorRole::InactiveWindowTitle);
- case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder1:
- return palette.color(ColorRole::MovingWindowBorder1);
- case CSS::ValueID::VendorSpecificPaletteMovingWindowBorder2:
- return palette.color(ColorRole::MovingWindowBorder2);
- case CSS::ValueID::VendorSpecificPaletteMovingWindowTitle:
- return palette.color(ColorRole::MovingWindowTitle);
- case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder1:
- return palette.color(ColorRole::HighlightWindowBorder1);
- case CSS::ValueID::VendorSpecificPaletteHighlightWindowBorder2:
- return palette.color(ColorRole::HighlightWindowBorder2);
- case CSS::ValueID::VendorSpecificPaletteHighlightWindowTitle:
- return palette.color(ColorRole::HighlightWindowTitle);
- case CSS::ValueID::VendorSpecificPaletteMenuStripe:
- return palette.color(ColorRole::MenuStripe);
- case CSS::ValueID::VendorSpecificPaletteMenuBase:
- return palette.color(ColorRole::MenuBase);
- case CSS::ValueID::VendorSpecificPaletteMenuBaseText:
- return palette.color(ColorRole::MenuBaseText);
- case CSS::ValueID::VendorSpecificPaletteMenuSelection:
- return palette.color(ColorRole::MenuSelection);
- case CSS::ValueID::VendorSpecificPaletteMenuSelectionText:
- return palette.color(ColorRole::MenuSelectionText);
- case CSS::ValueID::VendorSpecificPaletteWindow:
- return palette.color(ColorRole::Window);
- case CSS::ValueID::VendorSpecificPaletteWindowText:
- return palette.color(ColorRole::WindowText);
- case CSS::ValueID::VendorSpecificPaletteButton:
- return palette.color(ColorRole::Button);
- case CSS::ValueID::VendorSpecificPaletteButtonText:
- return palette.color(ColorRole::ButtonText);
- case CSS::ValueID::VendorSpecificPaletteBase:
- return palette.color(ColorRole::Base);
- case CSS::ValueID::VendorSpecificPaletteBaseText:
- return palette.color(ColorRole::BaseText);
- case CSS::ValueID::VendorSpecificPaletteThreedHighlight:
- return palette.color(ColorRole::ThreedHighlight);
- case CSS::ValueID::VendorSpecificPaletteThreedShadow1:
- return palette.color(ColorRole::ThreedShadow1);
- case CSS::ValueID::VendorSpecificPaletteThreedShadow2:
- return palette.color(ColorRole::ThreedShadow2);
- case CSS::ValueID::VendorSpecificPaletteHoverHighlight:
- return palette.color(ColorRole::HoverHighlight);
- case CSS::ValueID::VendorSpecificPaletteSelection:
- return palette.color(ColorRole::Selection);
- case CSS::ValueID::VendorSpecificPaletteSelectionText:
- return palette.color(ColorRole::SelectionText);
- case CSS::ValueID::VendorSpecificPaletteInactiveSelection:
- return palette.color(ColorRole::InactiveSelection);
- case CSS::ValueID::VendorSpecificPaletteInactiveSelectionText:
- return palette.color(ColorRole::InactiveSelectionText);
- case CSS::ValueID::VendorSpecificPaletteRubberBandFill:
- return palette.color(ColorRole::RubberBandFill);
- case CSS::ValueID::VendorSpecificPaletteRubberBandBorder:
- return palette.color(ColorRole::RubberBandBorder);
- case CSS::ValueID::VendorSpecificPaletteLink:
- return palette.color(ColorRole::Link);
- case CSS::ValueID::VendorSpecificPaletteActiveLink:
- return palette.color(ColorRole::ActiveLink);
- case CSS::ValueID::VendorSpecificPaletteVisitedLink:
- return palette.color(ColorRole::VisitedLink);
- case CSS::ValueID::VendorSpecificPaletteRuler:
- return palette.color(ColorRole::Ruler);
- case CSS::ValueID::VendorSpecificPaletteRulerBorder:
- return palette.color(ColorRole::RulerBorder);
- case CSS::ValueID::VendorSpecificPaletteRulerActiveText:
- return palette.color(ColorRole::RulerActiveText);
- case CSS::ValueID::VendorSpecificPaletteRulerInactiveText:
- return palette.color(ColorRole::RulerInactiveText);
- case CSS::ValueID::VendorSpecificPaletteTextCursor:
- return palette.color(ColorRole::TextCursor);
- case CSS::ValueID::VendorSpecificPaletteFocusOutline:
- return palette.color(ColorRole::FocusOutline);
- case CSS::ValueID::VendorSpecificPaletteSyntaxComment:
- return palette.color(ColorRole::SyntaxComment);
- case CSS::ValueID::VendorSpecificPaletteSyntaxNumber:
- return palette.color(ColorRole::SyntaxNumber);
- case CSS::ValueID::VendorSpecificPaletteSyntaxString:
- return palette.color(ColorRole::SyntaxString);
- case CSS::ValueID::VendorSpecificPaletteSyntaxType:
- return palette.color(ColorRole::SyntaxType);
- case CSS::ValueID::VendorSpecificPaletteSyntaxPunctuation:
- return palette.color(ColorRole::SyntaxPunctuation);
- case CSS::ValueID::VendorSpecificPaletteSyntaxOperator:
- return palette.color(ColorRole::SyntaxOperator);
- case CSS::ValueID::VendorSpecificPaletteSyntaxKeyword:
- return palette.color(ColorRole::SyntaxKeyword);
- case CSS::ValueID::VendorSpecificPaletteSyntaxControlKeyword:
- return palette.color(ColorRole::SyntaxControlKeyword);
- case CSS::ValueID::VendorSpecificPaletteSyntaxIdentifier:
- return palette.color(ColorRole::SyntaxIdentifier);
- case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorStatement:
- return palette.color(ColorRole::SyntaxPreprocessorStatement);
- case CSS::ValueID::VendorSpecificPaletteSyntaxPreprocessorValue:
- return palette.color(ColorRole::SyntaxPreprocessorValue);
- default:
- return {};
- }
- }
- ImageStyleValue::ImageStyleValue(const URL& url, Document& document)
- : StyleValue(Type::Image)
- , m_url(url)
- , m_document(document.make_weak_ptr())
- {
- LoadRequest request;
- request.set_url(url);
- set_resource(ResourceLoader::the().load_resource(Resource::Type::Image, request));
- }
- void ImageStyleValue::resource_did_load()
- {
- if (!m_document)
- return;
- // FIXME: Use the shared decoder from ImageResource!
- m_bitmap = Gfx::load_png_from_memory(resource()->encoded_data().data(), resource()->encoded_data().size());
- if (!m_bitmap)
- return;
- // FIXME: Do less than a full repaint if possible?
- if (m_document->frame())
- m_document->frame()->set_needs_display({});
- }
- }
|