serenity/Ladybird/LocationEdit.cpp
Shannon Booth 8751be09f9 AK: Serialize URL hosts with 'concept-host-serializer'
In order to follow spec text to achieve this, we need to change the
underlying representation of a host in AK::URL to deserialized format.
Before this, we were parsing the host and then immediately serializing
it again.

Making that change resulted in a whole bunch of fallout.

After this change, callers can access the serialized data through
this concept-host-serializer. The functional end result of this
change is that IPv6 hosts are now correctly serialized to be
surrounded with '[' and ']'.
2023-07-31 05:18:51 +02:00

89 lines
2.7 KiB
C++

/*
* Copyright (c) 2023, Cameron Youell <cameronyouell@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "LocationEdit.h"
#include "Utilities.h"
#include <AK/URL.h>
#include <QCoreApplication>
#include <QPalette>
#include <QTextLayout>
#include <QTimer>
LocationEdit::LocationEdit(QWidget* parent)
: QLineEdit(parent)
{
setPlaceholderText("Enter web address");
connect(this, &QLineEdit::returnPressed, this, [&] {
clearFocus();
});
connect(this, &QLineEdit::textChanged, this, [&] {
highlight_location();
});
}
void LocationEdit::focusInEvent(QFocusEvent* event)
{
QLineEdit::focusInEvent(event);
highlight_location();
QTimer::singleShot(0, this, &QLineEdit::selectAll);
}
void LocationEdit::focusOutEvent(QFocusEvent* event)
{
QLineEdit::focusOutEvent(event);
highlight_location();
}
void LocationEdit::highlight_location()
{
auto url = AK::URL::create_with_url_or_path(ak_deprecated_string_from_qstring(text()));
auto darkened_text_color = QPalette().color(QPalette::Text);
darkened_text_color.setAlpha(127);
QList<QInputMethodEvent::Attribute> attributes;
if (url.is_valid() && !hasFocus()) {
if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "gemini") {
int host_start = (url.scheme().length() + 3) - cursorPosition();
auto host_length = url.serialized_host().release_value_but_fixme_should_propagate_errors().bytes().size();
// FIXME: Maybe add a generator to use https://publicsuffix.org/list/public_suffix_list.dat
// for now just highlight the whole host
QTextCharFormat defaultFormat;
defaultFormat.setForeground(darkened_text_color);
attributes.append({
QInputMethodEvent::TextFormat,
-cursorPosition(),
static_cast<int>(text().length()),
defaultFormat,
});
QTextCharFormat hostFormat;
hostFormat.setForeground(QPalette().color(QPalette::Text));
attributes.append({
QInputMethodEvent::TextFormat,
host_start,
static_cast<int>(host_length),
hostFormat,
});
} else if (url.scheme() == "file") {
QTextCharFormat schemeFormat;
schemeFormat.setForeground(darkened_text_color);
attributes.append({
QInputMethodEvent::TextFormat,
-cursorPosition(),
static_cast<int>(url.scheme().length() + 3),
schemeFormat,
});
}
}
QInputMethodEvent event(QString(), attributes);
QCoreApplication::sendEvent(this, &event);
}