This adds an implementation of `VsyncRefreshDriver` ensuring that frame
updates are driven by the system compositor.
Testing: This should increase the smoothness of animations, but I'm
not sure how to test that exactly.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Change the installation directory to Servo.
This was discussed during the October TSC meeting
and removes the outdated reference to mozilla research.
Testing: Manually tested the windows installer
Fixes: #40068
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This change makes it so that Servo handles touch events on Android.
Flinging becomes a bit less native, but with two big benefits:
1. Before touch event handling on Android wasn't standards compliant,
because web content didn't get a chance to call `preventDefault()` on
touch events, whcih important for proper site behavior.
2. This unifies all touch event handling across Servo platforms. This
means that improvements to things like fling will benefit all
platforms equally. In addition, fling on Android can be integrated
into Servo's animation handler.
Generally, this also just makes things much simpler to reason about on
Android.
Testing: This kind of input handling isn't tested in Servo yet.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This change adds a full implementation of pinch zoom, including
center-aware zooming. Before this kind of pinch zooming was only enabled
on OpenHarmony. Now all pinch zooms must come with a focal point, which
determines the center point of the zoom. This enables full pinch zoom on
Android and has OpenHarmony use the same system for pinch zoom.
Every WebView now has a `PinchZoom` which describes the viewport of the
pinch zoom and handles panning with proper chaining of zoom viewport
panning to scroll layer scrolling. In addition, the collection of touch
actions is simplified by storing an array and turning each into a
ScrollZoomEvent when appropriate.
Caveats:
- We've noticed some hard to diagnose bugs with clamping the panning
viewport, but we'll tackle those later once we figure out how to
reliably reproduce them.
- Keyboard scroll events currently do not properly pan the pinch zoom
viewport. This will be handled in a followup.
Testing: There are currently no tests for this kind of touch interaction
as there's no way to read the pinch zoom from a WebView. It's processed
asynchronously. Once that API is added, we should be able to add some
simple tests, but many things are still unaccessible such as the pan
position in the pinch zoom viewport.
Fixes#4224.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Rakhi Sharma <atbrakhi@igalia.com>
These commits add a new settings screen to the app, then add:
1) a setting to disable a developer-targeted UI element (an indicator
about whether the app is polling continuously for events)
2) a toggle for experimental web platform features
The page needs to be reloaded after switching the toggle before any
changes can be observed.
Testing: Manually tested by visiting https://developer.mozilla.org with
the setting enabled and disabled. No automated testing for Android yet.
Fixes: #39791
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Focusing the location bar in the Android app shows the onscreen
keyboard, but clicking on a link in the current document does not make
it disappear. This change ensures the input focus is reset appropriately
and ensures the keyboard disappear when the location bar is not being
edited.
Testing: Manually tested. No automated tests for Android app at this
time.
Fixes: #40008
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Use Release mode for gradle for production builds and Debug for any
other builds.
This fixes an exception when building for android with a custom cargo
profile.
`SERVO_TARGET_DIR` is read in `apk/jni/Android.mk` and specifies the
folder
libservoshell.so is expected to be in.
Testing: Tested manually with `./mach build --android --production`
Fixes: #34564
---------
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
Signed-off-by: Jonathan Schwender <55576758+jschwe@users.noreply.github.com>
Co-authored-by: Mukilan Thiyagarajan <mukilanthiagarajan@gmail.com>
This is the most basic integration possible. Current limitations
include:
* the done button doesn't trigger form submission/keyboard hiding
* IME events don't trigger inputs (ie. pressing and holding a letter to
get more options)
However, it is infinitely better than the current integration.
Testing: Manually tested in the Android emulator.
Fixes: #12127 (we can open more specific issues after this)
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Another tiny binary size win for Android! .webp assets are supported
since API level 17, and Servo is built against 33, so this shouldn't
cause issues.
Testing: Manual.
Signed-off-by: lumiscosity <averyrudelphe@gmail.com>
This shows up sometimes in code reviews, so it makes sense that tidy
enforces it. `rustfmt` supports this via comment normalization, but it
does many other things and is still an unstable feature (with bugs).
Testing: There are new tidy tests for this change.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Losslessly optimizes the Android resources. These are the only non-test
PNGs remaining in the project, to my knowledge.
Testing: Unnecessary, since this only optimizes assets.
Signed-off-by: maple! <averyrudelphe@gmail.com>
OHOS CI: Now we can benchmark specific files. These files need to be in
the runs.json and in the supprt/hitrace-bench folder.
A simple testcase of parsing html from string is included (taken from
https://github.com/servo/servo/issues/37223).
We copy all files in
support/hitrace-bench into the hap of the phone.
These files can use the console.log javascript command to get their
measured output.
Additionally, this now supports reporting resident-accordings-to-smaps
which is a slightly different memory than resident.
This needs update to hitrace-bench 0.7 which will be completed once the
PR is marked ready.
Testing: On action runner here:
https://github.com/Narfinger/servo/actions/runs/16118101025/job/45477031813
Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
Previously, our Servo-specific spatial tree scroll offsets were opposite
to
that of WebRender and also the web platform. This is due to the fact,
likely, that `winit` wheel directionality is also flipped. This change
has both the Servo spatial tree and the API take offsets that are
consistent with the web.
Any possible changes to the meaning of wheel directionality will be
handled in a followup change.
This is a breaking change to the Servo API.
Testing: This change updates unit tests.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
Instead of printing a Rust compilation warning, simply print a message
before every build (when using `mach`) that shows the build
configuration and whether or not `crown` is enabled.
Fixes#32597.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Currently we just pause the compositor and replace the window in it
while having separate bookkeeping to remember which window belongs to
which tab.
Currently there are no tests for OHOS, so we cannot test the changes.
---------
Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
Co-authored-by: Jonathan Schwender <55576758+jschwe@users.noreply.github.com>
Uses the native ohos-api crates to get the required information for
starting servoshell.
This increases the minimum API version requirement to API-14.
Testing: Tested on device.
---------
Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
Co-authored-by: Jonathan Schwender <55576758+jschwe@users.noreply.github.com>
Split out `save_output_image_if_necessary` into its own file so the code
can be shared by servoshell on the desktop and ohos.
Additionally, hook it up to the loop in OHOS and have OHOS allow
exiting.
Testing: Manual testing on ohos and desktop.
---------
Signed-off-by: Narfinger <Narfinger@users.noreply.github.com>
The `Column()` height and thus also the XComponent height extends beyond
the physical display for unknown reasons. This is a problem on websites
that have a footer bar, since the footer is partially below the display
end.
Using Flex with Column direction works as expected.
Testing: Manual inspection with DevEco Testing inspecting the height of
the children elements in ArkUI
Fixes: Part of the servoshell surface extending beyond the physical
screen on ohos
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
* Migrate to 2024 edition
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Allow unsafe_op_in_unsafe_fn lint
This lint warns by default in the 2024
edition, but is *way* too noisy for servo.
We might enable it in the future, but not now.
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Compile using the 2024 edition
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
---------
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
The `shell` suffix causes issues with the startup profiling tools on
OpenHarmony. The profiler fails to detect the start of the app.
This is fixed by renaming the app. I tried various
different variations and identified the `shell`
suffix to be the culprit.
E.g. `org.servo.shell` has the same issue, so its not
a length issue.
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This is the first step toward removing `WindowMethods`, which will
gradually be integrated into the `WebView` and `WebViewDelegate`. Sizing
of the `WebView` is now handled by the a size associated with a
`RenderingContext`. `WebView`s will eventually just paint the entire
size of their `RenderingContext`. Notes:
- This is transitionary step so now there is a `WebView::resize` and a
`WebView::move_resize`. The first is the future which will resize the
`WebView` and its associated `RenderingContext`. The second is a
function that the virtual `WebView`s that will soon be replaced by a
the one-`WebView` per `WebView` model.
- We do not need to call `WebView::move_resize` at as much any longer
because the default size of the `WebView` is to take up the whole
`RenderingContext`.
- `SurfmanRenderingContext` is no longer exposed in the API, as a
surfman context doesn't naturally have a size unless a surface is
bound to it.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
* Update to rust 1.85
This is needed for cargo-deny
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Upgrade crown
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Clippy fixes
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
* Re-upgrade cargo-deny to 0.18
Keeping it locked to 0.18 just in case they
update their required rustc version again
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
---------
Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
Instead of telling the Constellation to tell the embedder that new
frames are ready, have the compositor tell the embedder directly. This
should reduce frame latency. Now, after processing compositor
updates, run any pending `WebView::new_frame_ready` delegate methods.
This change also removes the `refresh` call from the Java interface as
that was the only other place that the compositor was rendering the
WebRender scene outside of event looping spinning. This `refresh` call
was completely unused.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
* crown: Support Rc<T::Promise> and callback objects parameterized over a trait..
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* crown: Verify that attributes match between trait associated types and impls.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* crown: Check type aliases as part of associated type checks.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* crown: Add periods to all diagnostic messages.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Tidy.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* Fix compile-fail test expectations.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
---------
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
* android: Fix onScroll source
Scrolling should be based on `e2`, the second event, since dX and
dY are relative to e2 and not e1.
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
* android: Fix flinging down on android.
We need to ensure x and y are inside the window, otherwise servo will
not scroll!
Our fling implementation will set `mCurX` and `mCurY` to a very high
initial value when flinging with a negative velocity, since we don't
know the size of our content page and the android `OverScroller`
needs to know the size of the page.
Setting the page size to a ridiculously high value ensures that flinging
will not be cut of short, even if we fling farther then the edge of the
screen, starting from the touch up point.
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
---------
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This avoids future crashes if new unknown parameters
are passed by the runtime to the app.
It does make it slightly more inconvenient for the user,
since they must use `=` and space at the right place now.
This will also be updated in the book accordingly
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
Override the `onBackPress` callback, which by default
brings the application to the background and instead
tell servo to go back one page.
Users can invoke this by swiping from the left edge to the middle.
There is no equivalent callback / gesture to go forward.
In the default browser swiping from the right side to the middle
also invokes the goBack callback.
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
These following four OHOS specific arguments are being passed by the
OHOS runtime to the EntryAbility, which then passess them on to Servo's
argument parsing logic:
* `--debugApp=false`
* `--send_to_erms_targetAppDistType=os_integration`
* `--send_to_erms_targetAppProvisionType=release`
* `--send_to_erms_targetBundleType=0`
When Servo's argument parsing logic encounters an unrecognized argument,
it terminates the process after logging an error to stderr (which is not
visible in hilog).
This patch simply filters out these arguments so the parsing logic
doesn't fail.
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* Convert settings.gradle to Kotlin Script
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* servoview-local: Convert build.gradle to Kotlin Script
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Convert build.gradle to Kotlin Script
This was a trickier one, as I wanted to maintain compatibility with the rest of the files while facilitating this migration.
Closures are annoying, another annoyance of loosely typed languages in an OOP project.
Migration of child build scripts will require the reverse code and or migration of this scripts functions to kotlin lambdas / functions (which are just jvm functions).
Code based off of the following guide.
https://docs.gradle.org/current/userguide/kotlin_dsl.html#groovy_closures_from_kotlin
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* servoapp: Convert build.gradle to Kotlin Script
Migrated deprecated API usages.
There are two more, but ignored for now.
("splits.density", "capitalize")
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* servoview: Convert build.gradle to Kotlin Script
Migrated deprecated API usages.
There are two more, but ignored for now.
("splits.density", "capitalize")
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* servoview: Replace ResourceGroovyMethods with Kotlin File.walk
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Replace Groovy Closures with Kotlin Lambda types
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Move Utility fields to buildSrc
Using extra fields is quite annoying and makes it hard to maintain
API stability.
"buildSrc" is designed for this task, and thus is being used
for said task.
This means that when editing build.gradle files in an Android Studio,
there is a direct reference to the source of a function.
(Easier time referring to documentation, source of function, etc).
More information here:
https://docs.gradle.org/current/userguide/sharing_build_logic_between_subprojects.html
Stage 1 of #33742
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Sync target SDK to 33
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Make Notification actions immutable.
Otherwise android lint will be upset.
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Move dependencies from servoview to servoapp
ServoView does not use them.
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Add POST_NOTIFICATIONS to manifest
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Add host to intent-filter
Use "*" for any host, lets hope this works.
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Solve ndkBuild tasks not being linked
The problem stems from something something groovy wishy washy unclear
execution order something Kotlin explicit execution order.
Merge tasks exist after the project is evaluated.
The problem is that simply running afterEvaluate causes an
ConcurrentModificationException. This is because of creating a new
task while looping over existing tasks. To remedy this we simply
filter the tasks first, than create and link the new task.
Signed-off-by: clocks <doomsdayrs@gmail.com>
* Add documentation to why some functions are extensions to Project
Signed-off-by: clocks <doomsdayrs@gmail.com>
* android: drop the host directives from AndroidManifest.xml
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
---------
Signed-off-by: clocks <doomsdayrs@gmail.com>
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
Co-authored-by: Mukilan Thiyagarajan <mukilan@igalia.com>