* src/client/components/client-web-view.vala (ClientWebView::has_valid_height),
src/client/conversation-viewer/conversation-email.vala
(ConversationEmail::message_bodies_loaded): Only update the values of
these properties when they have actually changed, to avoid sending
multiple notifies out for them.
* src/client/composer/composer-web-view.vala (ComposerWebView): Add new
::cursor_style_changed signal, hook it up to the JS cursorStyleChanged
message and interpret the raw results from the web view before passing
it on.
* src/client/composer/composer-widget.vala (ComposerWidget): Replace
remainder of old ::update_actions method with a listener for
ComposerWebView::cursor_style_changed. Reimplement in terms of that
signal.
* ui/composer-web-view.js: Keep track of font family and size changes,
send a cursorStyleChanged message when they change.
* src/client/composer/composer-web-view.vala (ComposerWebView): Add new
::command_stack_changed signal to manage undo/redo enabled state, hook
it up to a JS callback. Add ::is_empty property as a non-functioning
shim in lieu of can_undo going away. Remove ::can_undo and ::can_redo,
replace them with methods to actually fire an undo and redo.
* src/client/composer/composer-widget.vala (ComposerWidget): Use
ClientWebView::is_empty rather inplace of can_redo for determining
editing state. Remove old undo/redo signal hookups, replace with
::command_stack_changed and manage action enable state from there.
(ComposerWidget::action_entries): Add explicit actions for undo/redo,
since they need some custom code over on on the web process side.
(ComposerWidget::on_compose_as_html_toggled): Explciitly manage the
visibility of rich text toolbar buttons, don't rely on obscure
GtkBuilder magic that Glade doesn't support.
* ui/composer-web-view.js: Add a mutation observer for the message body
and explcit methods for firing undo/redo commands, so we can keep track
of how the command stack changes. As it does, fire commandStackChanged
messages back to the client process. Explicity set the message body as
content-editable after the document has been mutated for quotes, etc.
* ui/composer-widget.ui: Add bonus undo/redo toobar buttons for the
composer.
* src/client/components/client-web-view.vala (copy_clipboard): Fixed to
actually copy, not cut. Removed can_copy_clipboard since it's no longer
implementable or useful.
* src/client/composer/composer-web-view.vala (ComposerWebView): Remove
can_cut_clipboard and can_paste_clipboard, since they are no longer
implementable or useful. Implement simple part of insert_text so
pasting plain text works, but still need to handle scroll update.
* src/client/composer/composer-widget.vala (ComposerWidget): Fix keyboard
shortcut for copying. Remove old WK1 clipboard related events. Update
clipboard actions' state using selection changed signal. Handle pasting
plain and rich text via the editor.
* src/client/web-process/util-composer.vala (insert_clipboard_text):
Remove code moved back to ComposerWebView.
* src/client/composer/composer-widget.vala
(ComposerWidget::action_entries): Add an entry for the inspector so it
can be loaded via the context model in the same way as other items.
(ComposerWidget::context_menu_*): Keep track of a number of the context
menu's sections, so we can selectively include them in the WK context
menu.
(ComposerWidget::on_context_menu): Re-implement to work wth the WK2
context menu model, which annoyingly doesn't even extend any of the
GtkMenu infrastrcuture.
* src/client/util/util-gtk.vala (menu_foreach): Pass the action
target through to the loop's delegate, it's a bit more useful for
dealing with the WK2 model.
(add_g_menu_to_gtk_menu): Removed, WebKitContextMenu doesn't extend
Gtk.Menu any longer so this is is no longer needed.
* ui/composer-menus.ui: Reoganise to use standard composer action
prefix. Duplicate rich and plain text clipboard sections so they can
just be selectively enabled. Include dummy sections for WK items to
specify where they are located in the menu, and a section for the
inspector.
* src/client/composer/composer-web-view.vala (ComposerWebView): Add
is_rich_text pop, keep it updated.
* src/client/composer/composer-widget.vala (ComposerWidget): Use
is_rich_text property rather than consulting the action's state.
* src/client/application/geary-config.vala (Configuration): Remove
spell-check setting, we can just get it from the list of visible
languages instead. Update the schema.
* src/client/components/client-web-view.vala (WebView::init_web_context):
Pass in a config object, use that to init WebKit's spell checking on
the WebContext now that is a global configuration, update it when the
config changes, update call sites.
* src/client/composer/composer-widget.vala (ComposerWidget): Remove
WK1-syle spell checking settings prefs.
* src/client/composer/spell-check-popover.vala (SpellCheckPopover): Pass
a config object in so we don't have to use the global app singleton
instance.
* src/client/dialogs/preferences-dialog.vala (PreferencesDialog):
Modernise by converting into a widget template.
* test/client/components/client-web-view-test-case.vala (TestCase):
Construct a config object as a fixture, use it to init the WebContext
and make it avalaible to subclasses & update subclasses.
* ui/preferences-dialog.ui: Moved from preferences.dialog, remove spell
check preference.
* src/client/components/client-web-view.vala (ClientWebView): Make
has_valid_height a GObject property so we can get notified about it
changing.
* src/client/conversation-viewer/conversation-email.vala
(ConversationEmail::connect_message_view_signals): Fixed to listen to
has-valid-height changing rather than the old WK1 load-status property.
* ui/conversation-message.ui: Set body_container orientation to vertical
so adding the attachments widget works as expected.
* src/client/components/client-web-view.vala (ClientWebView): Make some
unnecessarily internal methods private.
* ui/*.js: Replace "var" with "let" where appropriate - i.e. almost
everywhere.
* ui/conversation-web-view.js (ConversationPageState): Add
::updatePreferredHeight method to waitch for and update the web view's
preferred height when it changes.
(ConversationPageState::createControllableQuotes): Create quote
controllers using the DOM so we can easily attach click handlers to
it. Attach handlers to toggle the hide class and updated the preferred
height.
* ui/client-web-view.js (PageState): Add ::getPreferredHeight method, use
that to determine the preferred height of the page.
* ui/conversation-web-view.css: Import GTK+4 Adwaita button CSS to work
around WebKitGTK+ Bug 166648. Tweak quote style a bit.
* src/client/conversation-viewer/conversation-list-box.vala
(EmailRow::on_size_allocate): Disable should-scroll when we have a
valid height, not when loaded, so we stop pinning the scroll value and
let users scroll, even when remote images loads are still running.
* src/client/components/client-web-view.vala (WebView): Replace is_loaded
with has_valid_height, so we can if the body has been parsed and some
content is visible. This still isn't perfect, but better than using
load-ended. Fix call sites.
* src/client/conversation-viewer/conversation-message.vala
(ConversationMessage): Chase body container type and name change,
update call sites. Add in a Progress bar and update it using callbacks
from the web view, handling both initial load and the user subsequently
giving permission to load remote images.
* src/client/components/client-web-view.vala (ClientWebView): Provide a
form of the internal URL scheme prefix.
* ui/conversation-message.ui: Convert body container from being a GtkBox
to a GtkGrid, add in a GtkProgressBar.
This ensures that non-breaking space chars (not HTML entities) are
removed from text obtainined from the composer, and moves the F=F text
formatting from JS back to Vala, to minimimse the JS footprint and return
to using the old (working) version again.
* src/client/composer/composer-web-view.vala (ClientWebView::get_text):
Restore the old F=F formatting code previously in webkit-util, apply it
to plain text obtained from the composer.
* test/client/components/client-web-view-test-case.vala: New base class
for tests involving ClientWebView.
* test/client/composer/composer-web-view-test.vala: New tests for
ComposerWebView::get_html and ::get_text.
* test/js/composer-page-state-test.vala: Reworked to use
ClientWebViewTestCase, updated tests now that JS is returning
QUOTE_MARKER-delinated text, not F=F text.
* test/testcase.vala (TestCase): Move ::async_complete and ::async_result
from ComposerPageStateTest so all test cases can test async code.
* test/CMakeLists.txt: Add new source files.
* test/main.vala (main): Add new test.
* ui/composer-web-view.js: Update doc comments, remove F=F code, break
out non-breaking space replacement so it can be tested.
This makes debugging easier, since the URL will show up in the console,
Inspector and elsewhere, and the HTML message source, etc will appear in
the Inspector.
* src/client/components/client-web-view.vala
(ClientWebView::init_web_context): Rehitser new internal scheme, hook
it up to the new ::handle_internal_request handler for it.
(ClientWebView::load_html): Keep a reference to the HTML body so it can
be loaded via the URL scheme handler, make the second param optional
and if null, use the new internal URL for the body part. Update call
sites to avoid using the second param.
* src/client/web-process/web-process-extension.vala
(GearyWebExtension::on_send_request): Allow requests for the
internal URL scheme.
* bindings/vapi/javascriptcore-4.0.vapi: Don't pretend JS.String will
be unreff'ed by vala, it wont. Add JS.GlobalContext.retain, in case it
wants to be used.
* src/client/components/client-web-view.vala
(ClientWebView::ClientWebView): JavascriptResult instances are unref'ed
when unowned.
* bindings/vapi/javascriptcore-4.0.vapi: Make JS objects match their JSC
definitions: move JSValueFoo methods to JS.Value, etc. Update call
sites.
* src/client/util/util-webkit.vala: Move WebKit-specific common methods
from ClientWebView here. Update call sites.
* src/engine/util/util-js.vala: Move JSC-specific common methods from
ClientWebView and ComposerPageStateTest here. Update call sites.
* src/client/web-process/web-process-extension.vala: Check for and handle
exceptions when calling JS code.
* src/CMakeLists.txt: Add new source files, make WebKit VAPI generation
and engine compilation depend on JSC.
* ui/composer-web-view.js (ComposerPageState::resolveNesting): Apply JS
RegExp globally, to match default GLib RegEx behaviour.
* test/js/composer-page-state-test.vala: New tests covering generation of
HTML and F=F text from JS ComposerPageState object.
* test/CMakeLists.txt: Add the new test.
* test/main.vala (main): Add a test suite for JS tests, add the new test
to it.
* src/client/components/client-web-view.vala (ClientWebView): Add a
reason to the JSError domain for when a JS exception is thrown.
* bindings/vapi/javascriptcore-4.0.vapi (JS::Context): Add JS.Type and
some additional methods needed for the unit tests. Move most
GlobalContext methods to Context so we can pass the lowest common
demominator around.
Include GResources in the build so they can be loaded.
Bug 776421.
* test/main.vala (main): Init GTK, start a main loop and run the tests in
that.
* test/CMakeLists.txt: Include GResources in unit test binary so they can
be loaded by tests, and since we can't compile them into the client
static lib.
This is also needed to make the class and its subclasses unit testable.
* src/client/components/client-web-view.vala
(ClientWebView::ClientWebView): Replace use of
GearyApplication.instance.config with a constructor parameter. Update
all subclassess and call sites to ensure the parameter is passed in.
* src/client/components/client-web-view.vala (ClientWebView): Don't
require an instance of GearyApplication to be passed in to resource
loading, use new GioUtil methods to load the resources instead. Update
subclasses and call sites. Add a static init method for initialising
the WebKit.WebContext move code from GearyController here.
* src/client/application/geary-application.vala (GearyApplication):
Reimplement ::create_builder and ::read_resource using new GioUtil,
deprecate them. Merge ::load_ui_resource_for_manager into
::load_ui_resource since that's its only use, deprecate it.
* src/client/util/util-gio.vala: New util methods for loading GResources,
independent of the app.
* src/CMakeLists.txt: Add new util source.
UNit tetsing
* src/client/composer/composer-web-view.vala (ComposerWebView): Implement
both ::get_html and ::get_text as async JS calls, make the methods
async and update cal sites to handle that.
* src/client/composer/composer-widget.vala: Make saving deafts and
sending message async, to handle editor returning message body text
async. Remove uneeded ::get_html and ::get_text functions, update call
sites to call same directly on the on editor instead.
* src/client/web-process/util-composer.vala: Remove obsolete ::get_html
and ::get_text functions.
* ui/composer-web-view.js (ComposerPageState): Initial implementation of
getHtml and getText methods.
* src/client/conversation-viewer/conversation-web-view.vala
(ConversationWebView): Remove has_selection method since we are
using the signal to specify if a selection was found or not. Update
call sites to use that.
(ConversationWebView::get_selection_for_find,
ConversationWebView::get_selection_for_quoting): Implement using calls
to web process JS methods.
* src/client/application/geary-controller.vala
(GearyController::create_reply_forward_widget): If we have a possible
message view to quote from, handle constructing the compser widget
asynchronously, when we know if we have a quote or not.
* src/client/conversation-viewer/conversation-viewer.vala:
(ConversationViewer::on_find_mode_changed): Handle getting text
selection for finds asynchonously.
* src/client/components/client-web-view.vala
(ClientWebView::get_string_result): New helper for getting string
values from JS calls.
* src/client/conversation-viewer/conversation-email.vala
(ConversationEmail::get_selection_for_quoting,
ConversationEmail::get_selection_for_find): Handxle errors when
obtaining selections from a message view.
* src/client/conversation-viewer/conversation-message.vala: Remove
methods that were simply passed through to the web view anyway. Update
call sies.
* src/client/web-process/util-conversation.vala: Port all remaining
functions to JS, remove.
* bindings/vapi/javascriptcore-4.0.vapi: Add methods needed to get
strings out of WebKit.JavascriptResult instances.
* ui/conversation-web-view.js: Implement selection functions in JS, minor
cleanup.
* src/client/application/geary-controller.vala (GearyController::open_async):
Load ComposerWebView resources.
* src/client/composer/composer-web-view.vala (ComposerWebView): Move
HTML/CSS template here from ComposerWidget. Load composer-web-view.js
on app init and add it to the web view's user content manager.
(ComposerWebView::load_html): Overridden to require HTML body and
signature, assemble complete HTML as appropriate before chaining up to
the default impl.
(ComposerWebView::load_finished_and_realised): Remove redundant method.
* src/client/composer/composer-widget.vala (ComposerWidget):
Remove 'message' prop since it is unused and onerous. Cache current
account's signature as a field so it can be passed through to the
editor as needed. Port on_link_clicked to composer-web-view.js.
* src/client/web-process/util-composer.vala: Remove function ported to JS
in composer-web-view.js
* ui/CMakeLists.txt: Include new ComposerWebView JS resource.
* ui/composer-web-view.js: Port composer HTML sanitisation methods to JS,
add to a custom subclass of PageState. Instantiate it and hook it up to
onload.
* ui/conversation-web-view.js: New script, port old HTML cleaning code in
vala to Javascript as new subclass of PageState. Instantiate that on
page load.
* src/client/conversation-viewer/conversation-web-view.vala
(ConversationWebView): Load and add new JS script for conversations.
* src/client/web-process/util-conversation.vala (Util.Conversation):
Remove migrated and obsolete code.
* ui/client-web-view.js (PageState): Allow on-load behaviour to be
overridden in subclasses.
* ui/CMakeLists.txt: Include new JS script.
* ui/conversation-web-view.css: Chase CSS class name changes.
WK2 seems to be reporting valid hight values now, so we don't need this
any more. With an additional small tweak, this also fixes auto-marking
messages as read under WK2.
* src/client/conversation-viewer/conversation-web-view.vala
(ConversationWebView): Remove ::is_height_valid property. Update call
sites to use ClientWebView::is_loaded instead.
* src/client/conversation-viewer/conversation-list-box.vala
(ConversationListBox::check_mark_read): Also check that the web view
has been allocated a positive size before auto-marking as read.
Add a "has_selection" param to avoid a second round-trip to the web
process to determine that.
* src/client/components/client-web-view.vala (ClientWebView): Add a
selection_changed signal, register a JS message handler for the JS
equivalent hook up firing the signal.
* src/client/web-process/web-process-extension.vala (GearyWebExtension):
Send a JS selectionChanged message when the page's selection changes.
* src/client/composer/composer-widget.vala,
src/client/conversation-viewer/conversation-email.vala,
src/client/conversation-viewer/conversation-message.vala: Uncomment
code that relied on the WK1 selection_changed signal, use signal param
rather than DOM calls.
* ui/client-web-view.js: Implement sending the selectionChanged message.
* ui/client-web-view.js: Move emitPreferredHeightChanged() into PageState
as ::preferredHeightChanged(). Add a explicit constructor, move
instance properties into that. Add an interval timer to periodically
update the preferred height until loaded.
* src/client/components/client-web-view.vala (ClientWebView): Register
for new remoteImageLoadBlocked message from JS. Add new
::remote_image_load_blocked signal to notify when a remote image load
was blocked. Add ::allow_remote_image_loading and ::load_remote_images
methods to allow th app to manage image loading state.
* src/client/conversation-viewer/conversation-email.vala
(ConversationEmail): Determine up front whether the message view should
load remote images and flag that, rather than passing through the email
flag and the contact store.
* src/client/conversation-viewer/conversation-message.vala
(ConversationMessage): Rmeove contact_store and
always_load_remote_images properties and related code, just let the
parent email view advise whether remote images should be initially
loaded and act accordingly. Look up to ClientWebView signal and methods
to handle manual remote image loading management by the user. Remove
some obsolete code.
* src/client/web-process/web-process-extension.vala (GearyWebExtension):
Replace allow_prefix implementation for remote image management with
explicit signalling to/from the application via JavaScript.
* ui/client-web-view.js: Add a new PageState object, add props and method
to implement remote image loading management.
* ui/client-web-view-allow-remote-images.js: Monkeypatch to be used when
remote images should be loaded by default.
* ui/CMakeLists.txt: Include new JS file.
* src/client/conversation-viewer/conversation-web-view.vala,
src/client/web-process/util-conversation.vala,
src/client/web-process/util-webkit.vala: Remove obsolete code.
* src/CMakeLists.txt: Also generate a custom Also generate a custom
webkit2gtk-web-extension-4.0 VAPI that re-includes javascriptcore
objects, so they can be access from the web extension.
* bindings/metadata/WebKit2WebExtension-4.0-custom.vala,
bindings/metadata/WebKit2WebExtension-4.0.metadata: Include in-tree
metadata for web extension VAPI, update to all access to JS obejcts.
* bindings/vapi/javascriptcore-4.0.vapi: Add a bunch of useful additional
objects and method.
* src/client/components/client-web-view.vala
(ClientWebView::load_app_script): Set script injection time to the
start of the document load.
* ui/client-web-view.js: Set an onload handler to report back the
preferred height.
* bindings/vapi/javascriptcore-4.0.vapi: Add some methods to
GlobalContext for accessing JSValues as ints.
* src/client/components/client-web-view.vala
(ClientWebView): Hook up UserContentManager script messages handler and
handler implementation for "preferredHeightChanged", update the new
preferred_height prop on the class, and queue a resize. Hook those
values up to the GTK allocation machinery.
(ClientWebView::get_int_result): Convenience method for getting an int
from a JavascriptResult.
(ClientWebView::get_preferred_height): Report back values as reported
by messages from the script handler.
(ClientWebView::register_message_handler): Convenience method for
registering script messages handlers.
* src/client/conversation-viewer/conversation-web-view.vala
(ConversationWebView): Remove now-redundant GTK allocation machinery.
* ui/client-web-view.js: Post a message to preferredHeightChanged when
the page is sorta-kinda loaded.
* src/client/application/geary-controller.vala
(GearyController::open_async): Load the app script for ClientWebView at
startup.
* src/client/components/client-web-view.vala
(ClientWebView::ClientWebView): Ensure we actually have a
UserContentManager instance to work with, add the app script to the
manager for the instance.
(ClientWebView::load_scripts): Actually load client-web-view.js.
(ClientWebView::load_user_stylesheet): Helper method for this class and
subsclasses for doing the actual script load from the app.
* ui/client-web-view.js: Add boilerplaye for new file.
* ui/CMakeLists.txt: Include client-web-view.js.