Commit Graph

279 Commits

Author SHA1 Message Date
Itamar
02b3a89d96 Ladybird/WebView: Fix size calculation in update_viewport_rect()
size() may include the dimensions of the scrollbars, so we now use
viewport() instead.
2022-12-25 07:58:58 -07:00
Moustafa Raafat
22c3b8be7b Ladybird/Tab: Handle "Dump History" action 2022-12-25 07:58:58 -07:00
Moustafa Raafat
612f7daf05 Ladybird/SimpleWebView: Add debug logging for unhandled debug requests 2022-12-25 07:58:58 -07:00
Moustafa Raafat
9854feb263 Ladybird/Tab: Update history title when tab title changes 2022-12-25 07:58:58 -07:00
Moustafa Raafat
a39f0d472a Ladybird/History: Ignore title updates when history has no current item 2022-12-25 07:58:58 -07:00
Moustafa Raafat
742c4767df Ladybird/BrowserWindow: Make "View Source" a separate window
View Source was a subwindow which made it cover part of the browser with
no way for closing it.
2022-12-25 07:58:58 -07:00
Andreas Kling
c2230d5fe8 Ladybird: The JS console widget should be a standalone window
...not part of the WebView. Its lifetime is managed by a QPointer.
2022-12-25 07:58:58 -07:00
Andrew Kaster
b2ba91123b Ladybird/ConsoleClient: Get the current ESO from new HostDefined helper 2022-12-25 07:58:58 -07:00
Andrew Kaster
2ff37d7e13 Ladybird/Everywhere: Ensure that Qt objects are created with parents
This prevents memory leaks detected by both Valgrind and ASAN/LSAN.

Valgrind is still suspicious of the leaked JS::VM from
Web::Bindings::main_thread_vm() but there's other issues with leak
checking all the GC'd objects.

Co-Authored-By: Diego Iastrubni <diegoiast@gmail.com>
2022-12-25 07:58:58 -07:00
Jonas Kvinge
f9af2832c8 Ladybird: Fix typo in README.md 2022-12-25 07:58:58 -07:00
Luke Wilde
e04ec39984 Ladybird: Start applying the default content filter
For the first cut, the file path is not configurable and the content
filter cannot be toggled on or off. If we fail to apply the content
filters for any reason (e.g. the filter file doesn't exist), we simply
just stop loading the content filters to allow using Ladybird without
content filters.
2022-12-25 07:58:58 -07:00
networkException
f1c7ee2810 Ladybird/Everywhere: Replace "protocol" with "scheme" url helpers
See 4230dbbb21
2022-12-25 07:58:58 -07:00
Idan Horowitz
bf26b52ac6 Ladybird/BrowserWindow: Port user agent spoofing from Browser 2022-12-25 07:58:58 -07:00
Idan Horowitz
edd1e770d9 Ladybird/BrowserWindow: Give color scheme action group a detailed name
'group' is not very specific.
2022-12-25 07:58:58 -07:00
Andreas Kling
5ac5fef468 Ladybird: Add a very simple DOM inspector
We use a ModelTranslator to expose a DOMTreeModel from LibWebView :^)
It allows you to select the currently inspected node, which causes
the engine to render a little box model overlay above the web content.
2022-12-25 07:58:58 -07:00
Andreas Kling
98b6aea234 Ladybird: Add a ModelTranslator to translate a GUI::Model to a Qt model
This will be used to expose the DOMTreeModel from LibWebView :^)
2022-12-25 07:58:58 -07:00
Andreas Kling
2a021084e5 Ladybird: Rename WebView to SimpleWebView
This will allow us to share code with LibWebView from SerenityOS.
(This would otherwise not work, since its "WebView" namespace collides
with our "WebView" class.)

Also, we should eventually move towards a more sophisticated
multi-process WebView like OOPWV.
2022-12-25 07:58:58 -07:00
Aaron Dewes
eecee7369f Ladybird: Clean up tab bar autohide
Qt has this feature built-in, so there's no need to create a custom
implementation
2022-12-25 07:58:58 -07:00
Aaron Dewes
bdce860ac5 Ladybird: Make Tab.cpp directly take a BrowserWindows as m_window 2022-12-25 07:58:58 -07:00
Linus Groh
445cc7c97d Ladybird: Remove redundant use of impl()
This blocks us from removing it upstream in LibWeb.
2022-12-25 07:58:58 -07:00
davidot
fdf69720d4 Ladybird/PageClient: Initialize the js console earlier during page setup 2022-12-25 07:58:58 -07:00
davidot
07a500e923 Ladybird/WebView: Ensure a console widget exists before storing messages
This makes sure that any console.log (and friends) called before ever
opening the JS Console are not lost.
2022-12-25 07:58:58 -07:00
Andreas Kling
3610ac5e19 Ladybird/WebView: Close top-level BC when the WebView is destroyed 2022-12-25 07:58:58 -07:00
Niek van der Maas
f043d4b654 Ladybird: Add macOS build instructions
Remove release build info, as per request of @bgianfo
2022-12-25 07:58:58 -07:00
ylluminate
ff9dfc89cc Ladybird: Add link to Serenity's LibWeb
library path for easier reference and finding.
2022-12-25 07:58:58 -07:00
Diego Iastrubni
8acdb403c3 Ladybird: Add instructions for building on Fedora
closes #49
2022-12-25 07:58:58 -07:00
Diego Iastrubni
d579ed7e46 Ladybird: Don't propagate unrecognized button clicks to the web engine
There are a lot of unsupported mouse click events that the engine
cannot handle. It such event (0) reaches the web engine - it will
assert.

Don't even propagate them - this is the safe way. As of today!

I also added back/forward buttons to the translation.

Should fix #27
2022-12-25 07:58:58 -07:00
Andreas Kling
561303829e Ladybird/WebView: Plumb visibility state changes from Qt to LibWeb 2022-12-25 07:58:58 -07:00
Matheus Vinicius
d007160ad6 Ladybird: Add --needed option on pacman dependencies command 2022-12-25 07:58:58 -07:00
Andreas Kling
e73c2c7029 Ladybird/WebView: Move WebSocket stuff to its own files 2022-12-25 07:58:58 -07:00
Andreas Kling
4cc82ac638 Ladybird/WebView: Move our PageClient to its own file
And rename it to PageClientLadybird while we're at it, it's not
"headless" by any means.
2022-12-25 07:58:58 -07:00
Andreas Kling
97964bc710 Ladybird/BrowserWindow: Add UI for switching preferred CSS color scheme 2022-12-25 07:58:58 -07:00
Julen Ruiz Aizpuru
98bf0107ce Ladybird/Tab: Conditionally enable back/forward buttons 2022-12-25 07:58:58 -07:00
Julen Ruiz Aizpuru
ea3e9a3102 Ladybird/Tab: Make back/forward keyboard shortcuts platform-specific
This commit changes how we set the back and forward button key bindings
to use platform-specific standard key sequences.

For example, in Mac OS X, the back action will be now triggered via
Cmd+← and Cmd+[, whereas previously the action was mapped to Alt+←,
which is not standard in Mac OS X.
2022-12-25 07:58:58 -07:00
Andreas Kling
617aba2420 Ladybird/FontPluginQt: Initialize the default fixed-width font 2022-12-25 07:58:58 -07:00
Andreas Kling
3628eda0db Ladybird/FontPluginQt: Implement default font virtuals 2022-12-25 07:58:58 -07:00
Andreas Kling
c230264c63 Ladybird/WebView: Ensure JS console is initialized before handling input 2022-12-25 07:58:58 -07:00
Andreas Kling
6ee92a1fd0 Ladybird/WebView: Implement page_did_request_scroll_into_view()
This makes #foo links actually scroll the #foo element into view.
2022-12-25 07:58:58 -07:00
Andreas Kling
345faff586 Ladybird/WebView: Notify LibWeb whenever the viewport is scrolled 2022-12-25 07:58:58 -07:00
Andrew Kaster
488da351c0 Ladybird/CMake: Install resources and Lagom libraries alongside ladybird
This setup should allow the package maintainers who are looking to
distribute ladybird on their distributions to use CMake to install
ladybird using cmake install rules rather than having to write their own
2022-12-25 07:58:58 -07:00
Andrew Kaster
3403b1fd77 Ladybird/WebView: Search for resources using installed location
Reorganize the logic for initializing s_serenity_resource_root.

Now, we initialize it in platform_init(), and move platform_init to the
top of initialize_web_engine.

Add a branch at the end of the function to check
``QApplication::applicationDirPath()`` for the location of the
executable, and base the location of resources on that.
In an installed configuration, this will be /some/path/bin, with the
resource root set to /some/path/share/, looking for files in
/some/path/share/res/resource-type.

This matches up with some upcoming CMake changes to install resources in
CMAKE_INSTALL_DATADIR.
2022-12-25 07:58:58 -07:00
Diego Iastrubni
0a38d246f9 Ladybird: Fix some crashes related to keyboard events
Don't try to get the unicode value of an empty string.
2022-12-25 07:58:58 -07:00
Andreas Kling
ef757f33da Ladybird: Implement the Web::Platform::ImageCodecPlugin interface
...and move it to separate files while we're at it.
2022-12-25 07:58:58 -07:00
Andrew Kaster
4334929323 Ladybird/CMake: Link against LibSoftGPU to fix WebGL with serenity LibGL
In the future, ladybird should probably use a QOpenGLWidget or similar
platform plugin to use the native GL implementation instead of the one
in serenity.
2022-12-25 07:58:58 -07:00
Timothy Flynn
4850a2d272 Ladybird: Update pointer to current tab when the selected tab changes
This allows requests like dumping the DOM tree to be forwarded to the
correct tab. Otherwise, the event would be forwarded to the most
recently created tab.
2022-12-25 07:58:58 -07:00
Timothy Flynn
e04db5efed Ladybird: Hook up the dump-cookies debug request to the cookie jar 2022-12-25 07:58:58 -07:00
Andreas Kling
0f1644f62d Ladybird: Switch to next/previous tab with Ctrl+PageDown/PageUp 2022-12-25 07:58:58 -07:00
Andreas Kling
27b9cd13ee Ladybird: Focus the location editor when creating a new tab
This lets you start typing a new URL right after pressing Ctrl+T.
2022-12-25 07:58:58 -07:00
Andreas Kling
031005de2d Ladybird: Remove some awkward camelCase signal names
We use snake_case for everything except when we're forced by Qt to use
their camelCase names.
2022-12-25 07:58:58 -07:00
Andreas Kling
0c4ae810d7 Ladybird: Hide the hovered URL label on startup 2022-12-25 07:58:58 -07:00
Andreas Kling
4e3e5149d5 Ladybird: Show tooltips for <a title> text 2022-12-25 07:58:58 -07:00
Andreas Kling
ce38528fff Ladybird: Allow scrolling with arrow keys and PageUp/PageDown
This will need further work to integrate well with content that listens
for key events, but at least this is better than doing nothing.
2022-12-25 07:58:58 -07:00
Andreas Kling
f4a9b382b1 Ladybird: Remove spacing between toolbar and web view 2022-12-25 07:58:58 -07:00
Andreas Kling
d74802e4e2 Ladybird: Show hovered link URLs in a conditional UI label
The tooltips for hovered links were super awkward when in a tooltip
2022-12-25 07:58:58 -07:00
Andreas Kling
aa27112d78 Ladybird: Tweak the QTabWidget look 2022-12-25 07:58:58 -07:00
Andreas Kling
8a657eaa34 Ladybird: Add a FontPlugin and try much harder to find suitable fonts
Instead of only looking at the SerenityOS default fonts, we now also
look recursively in /usr/share/fonts for suitable fonts that we can
load and use.
2022-12-25 07:58:58 -07:00
Andreas Kling
37d844fd66 Ladybird: Use only the Qt event loop to speed everything up :^)
This patch removes the dual-event-loop setup, leaving only the Qt event
loop. We teach LibWeb how to drive Qt by installing an EventLoopPlugin.

This removes the 50ms latency on all UI interactions (and network
requests, etc.)
2022-12-25 07:58:58 -07:00
Andreas Kling
dcab11f5e9 Ladybird: Fix build after LibWeb+LibJS GC changes 2022-12-25 07:58:58 -07:00
Luke Wilde
9789d8b769 Ladybird: Turn initialize_global_object() into a regular initialize()
See: https://github.com/SerenityOS/serenity/commit/cfa5885
2022-12-25 07:58:58 -07:00
Luke Wilde
1e7d4bc089 Ladybird: Retrieve console object from the realm's intrinsic
See: https://github.com/SerenityOS/serenity/commit/867ad03
2022-12-25 07:58:58 -07:00
Andreas Kling
ced442f426 Ladybird: Remove obsolete call to set_associated_realm() 2022-12-25 07:58:58 -07:00
Kemal Zebari
80edd654fa Ladybird: Fix a few typos in README 2022-12-25 07:58:58 -07:00
Luke Wilde
c9e6967d7b Ladybird: Update for LibJS realm changes 2022-12-25 07:58:58 -07:00
Andreas Kling
a14b00e046 Ladybird: Remove redundant subtraction of scrollbar from viewport rect 2022-12-25 07:58:58 -07:00
Andreas Kling
b1acf17d3c Ladybird: Simplify awkward keyboard mapping code 2022-12-25 07:58:58 -07:00
Andreas Kling
90c0ae5e63 Ladybird: Update for LibJS global object construction changes 2022-12-25 07:58:58 -07:00
Andreas Kling
b1cc1bd47b Ladybird: Remove unused PageClient override 2022-12-25 07:58:58 -07:00
Xexxa
5a5473a38e Ladybird/Meta: Use reverse domain name notation in property list files 2022-12-25 07:58:58 -07:00
Filiph Sandström
7ddb433f99 Ladybird/Meta: Enable macOS high-dpi support
This also adds an Info.plist file required to properly
build macOS applications.
2022-12-25 07:58:58 -07:00
Andreas Kling
da23456f9e Ladybird: Try decoding images with Qt if LibGfx fails us
We might as well ask Qt if it can decode images in case our own decoders
don't succeed.
2022-12-25 07:58:58 -07:00
Andreas Kling
11e5be050f Ladybird: Enable HTTP pipelining 2022-12-25 07:58:58 -07:00
Andreas Kling
9073d60f00 Ladybird: Actually add request headers to outgoing HTTP requests 2022-12-25 07:58:58 -07:00
Filiph Sandström
d60f8807e3 Ladybird: Allow for setting the hompage through SettingsDialog 2022-12-25 07:58:58 -07:00
Filiph Sandström
91e5b6d4f5 Ladybird: Add SettingsDialog stub 2022-12-25 07:58:58 -07:00
Filiph Sandström
a838004725 Ladybird: Add Settings class 2022-12-25 07:58:58 -07:00
Andreas Kling
1b682e4b2c Ladybird: Don't rewrite file:// URLs to HTTP 2022-12-25 07:58:58 -07:00
Andreas Kling
c216e714c7 Ladybird: Tweak inaccurate copyright year :^) 2022-12-25 07:58:58 -07:00
Diego Iastrubni
2905bda0f2 Ladybird: Add a protocol to the URL, when one is not set
When a http(s):// is not written by the user - lets manually add one.
2022-12-25 07:58:58 -07:00
Alec Murphy
700c709c00 Ladybird: Add Ctrl-W action to close current tab (#28) 2022-12-25 07:58:58 -07:00
Diego Iastrubni
35eb696884 Ladybird: Basic keyboard input (#31)
This handles most (?) of keyboard input. For some reason, "Ctrl+A"
and Enter are not working on google.com.

It can handle plain ASCII, I tested also Hebrew input,
and https://playbiolab.com/ (which is playable now!)
2022-12-25 07:58:58 -07:00
Andrew Kaster
1002de086e Ladybird/Docs: Document Android build steps 2022-12-25 07:58:58 -07:00
Andrew Kaster
261f078a28 Ladybird/Meta: Add Android build
Build an Android APK file that, when configured properly in Qt Creator,
can be used to deploy the browser to an Android device.

The current build requires NDK 24, targets no less than Android API 30,
and Qt Creator 6.4.0.
2022-12-25 07:58:58 -07:00
Andreas Kling
7e42eae1a2 Ladybird: Add a separate license file 2022-12-25 07:58:58 -07:00
Andreas Kling
73c15ef56d Ladybird: Don't try to append to the JS console before it's instantiated 2022-12-25 07:58:58 -07:00
Andreas Kling
45c6a8c479 Ladybird: Add files I forgot to commit :^) 2022-12-25 07:58:58 -07:00
Andreas Kling
79ce12a363 Ladybird: Remove debug spam about non-existent console messages 2022-12-25 07:58:58 -07:00
Andreas Kling
f2b126f4d7 Ladybird: Basic support for window.alert() and window.confirm() 2022-12-25 07:58:58 -07:00
Andreas Kling
aa5f886128 Ladybird: Add quick & dirty port of the JS console from Browser :^) 2022-12-25 07:58:58 -07:00
Daniel Bertalan
af5250b2cb Ladybird: Fix compilation on macOS/Clang
- Silences the -Wuser-defined-literals warning which is triggered by our
  use of the `sv` suffix for StringView
- Removes an unused captured `this` pointer [-Wunused-lambda-capture]
- Changes a JSONArray.h include to JSONObject.h to get the definition
  for `JSONValue::serialize`. This is needed because template functions
  are not exported for dylibs on macOS. This is a hack; the JSON headers
  should be refactored so that each one includes the definition of
  the template functions it sees. -- Maybe we should build with
  -fvisibility-inlines-hidden on Linux to catch issues like this?
2022-12-25 07:58:58 -07:00
Filiph Sandström
d1d6a204fc Ladybird: Replace StatusBar with ToolTip
This gives the actual webcontent more space to work with,
it also emulates how other browsers does it.

In the future we'd like to do something else since only ToolTip
can be visible at the same time.
2022-12-25 07:58:58 -07:00
Andreas Kling
bfc9057638 Ladybird: Tell Qt to let us manage HTTP redirects ourselves 2022-12-25 07:58:58 -07:00
Andreas Kling
2bbf2dfb9a Ladybird: Update for removal of StringView(char const*) 2022-12-25 07:58:58 -07:00
Andreas Kling
80636d6779 Ladybird: Implement basic cookie support
We import the CookieJar class from Browser to do the work. Long-term
we should look for a way to share this code with Browser.
2022-12-25 07:58:58 -07:00
Filiph Sandström
ea7e637b6e Ladybird: Fix title branding when switching tabs 2022-12-25 07:58:58 -07:00
Filiph Sandström
ace44dc13b Ladybird: Hide TabBar if count <= 1 2022-12-25 07:58:58 -07:00
Andreas Kling
74c71804c7 Ladybird: Add "View Source" menu action (Ctrl+U) 2022-12-25 07:58:58 -07:00
Thitat Auareesuksakul
1400a160bc Ladybird: Set singleStep for scroll bars in WebView
Sets singleStep to 24px, this allows you to scroll using your mouse
scroll wheel :^)
2022-12-25 07:58:58 -07:00
Thitat Auareesuksakul
d89fbf3aa0 Ladybird: Set pageStep for scroll bars in WebView
This allows PageUp/PageDown keys to scroll 1 viewport size at a time.
This also fixes the scroll bar drag handle to be a correct length.
2022-12-25 07:58:58 -07:00
Andreas Kling
096164ea1a Ladybird: Revert accidentally commited local settings 2022-12-25 07:58:58 -07:00
Andreas Kling
487544d7b4 Ladybird: Port over part of the "Debug" menu from the SerenityOS browser
This is pretty messy, but we have to start somewhere. Eventually we
should find a way to share this code with SerenityOS.
2022-12-25 07:58:58 -07:00
David Gannerud
eea012472e Ladybird: Prevent loading of invalid URL
Loading invalid URL will result in a crash.
2022-12-25 07:58:58 -07:00
Andreas Kling
b97c74331c Ladybird: Don't include scrollbars in viewport rect size 2022-12-25 07:58:58 -07:00
Andreas Kling
a08e83e2cc Ladybird: Check for errors while decoding favicons 2022-12-25 07:58:58 -07:00
Andreas Kling
50b3672f52 Ladybird: Add keyboard shortcut for focusing the location edit (Ctrl+L) 2022-12-25 07:58:58 -07:00
Andreas Kling
303fda074a Ladybird: Fix build with Qt 6.2.4 2022-12-25 07:58:58 -07:00
Matthew Costa
7681ef25da Ladybird: Expanded toolbar with browser history and home button
This patch takes the browser history code from the Serenity browser and
wires it up to the QT interface. This is tied in with a few extra
toolbar buttons associated with each tab.
2022-12-25 07:58:58 -07:00
Matthew Costa
67ab6dd2e6 Ladybird: Allow browser tabs to be closed
This is a small patch which wires up the tab close button.
2022-12-25 07:58:58 -07:00
Matthew Costa
8af5b49cba Ladybird: Rudimentary tabbed browsing support
This patch removes the browser WebView from the window and places it
inside a Tab object, all wrapped up in a QT tab control. So far you can
create tabs, but can't close them.
2022-12-25 07:58:58 -07:00
Thitat Auareesuksakul
ec44691b56 Ladybird: Add basic cursor shape support in WebView 2022-12-25 07:58:58 -07:00
Andreas Kling
a7cb558783 Ladybird: Fix broken favicon conversion from Gfx::Bitmap to QPixmap 2022-12-25 07:58:58 -07:00
Alfonso Saavedra "Son Link
48de1fb1b1 Ladybird: Added Arch Linux/Manjaro required packages to build 2022-12-25 07:58:58 -07:00
Andreas Kling
f96b53f118 Ladybird: Stop using deprecated Qt API and re-enable deprecated warnings 2022-12-25 07:58:58 -07:00
Andreas Kling
419d3ec646 Ladybird: Use QtNetwork for HTTP and HTTPS requests
Until we can get our own RequestServer infrastructure up and running,
running the TLS and HTTP code in-process was causing lots of crashes
due to unexpected reentrancy via nested event loops.

This patch adds a simple backend for HTTP and HTTPS requests that simply
funnels them through QNetworkAccessManager.
2022-12-25 07:58:58 -07:00
Andreas Kling
69d264828f Ladybird: Add a "Reload" action to reload the current URL 2022-12-25 07:58:58 -07:00
Matthew Costa
7bf3010185 Ladybird: Trigger browser to quit when the main window is closed
This patch adds an event handler to the main window which allows it to
respond to a user closing the window. This event is then passed on to
the LibCore event loop, which allows the application quit itself.
Previously the application would hang, only running in the background,
until killed by an external force.
2022-12-25 07:58:58 -07:00
Keir Davis
95e3e06a1e Ladybird: Add Favicon to the window 2022-12-25 07:58:58 -07:00
Matthew Costa
47d7f1efec Ladybird: Apply inverse image scaling to ensure WebView renders at 1:1
On high-dpi systems QT will automatically scale up painting operations.
This results in an ugly blurry browser window surrounded by a nicely
scaled window frame. This patch applies an inverse scale to the WebView
widget, ensuring the painting and mouse events are lined up and draw
with a 1:1 pixel ratio with respect to the display's device pixels.
2022-12-25 07:58:58 -07:00
Timothy Flynn
9edd334beb Ladybird/Meta: Add libgl1-mesa-dev to build dependencies
Without this package, CMake fails with the error:

    Could NOT find OpenGL (missing: OPENGL_INCLUDE_DIR)

This package is listed in Qt's requirements here:
https://doc.qt.io/qt-6/linux.html#requirements-for-development-host
2022-12-25 07:58:58 -07:00
Andreas Kling
874e73e0c9 Ladybird/WebView: Apply viewport scroll offset to mouse event coordinate 2022-12-25 07:58:58 -07:00
Andreas Kling
96170a4f24 Ladybird/Meta: QT => Qt in the README :^) 2022-12-25 07:58:58 -07:00
Andrew Kaster
74fda4aff5 Ladybird/Meta: Convert to CMake build 2022-12-25 07:58:58 -07:00
Andreas Kling
da19b78dea Ladybird: Don't set a fixed height on the location edit 2022-12-25 07:58:58 -07:00
Andreas Kling
f5d033b8ba Ladybird: Show the web page title in the window titlebar :^) 2022-12-25 07:58:58 -07:00
Andreas Kling
8b7000e151 Ladybird: Add a location bar and allow navigating to new pages :^) 2022-12-25 07:58:58 -07:00
Andreas Kling
88d256c109 Ladybird: Show hovered link URLs in the status bar :^) 2022-12-25 07:58:58 -07:00
Andreas Kling
9b8fe16e3d Ladybird: Plumb Qt mouse events into LibWeb 2022-12-25 07:58:58 -07:00
Andreas Kling
f16ba7945a Ladybird: Make HTTPS loads default to port 443 instead of 80 :^) 2022-12-25 07:58:58 -07:00
Andreas Kling
80526625e8 Ladybird: Basic scrolling support 2022-12-25 07:58:58 -07:00
Andreas Kling
1eb653115b Ladybird: Initial import :^) 2022-12-25 07:58:58 -07:00