This version bump is a bit delayed, since I forgot to open the PR before
FOSDEM. The actual release will thus likely not be based on this commit,
but backported to the release branch, to stay in sync with our monthly
report.
There still has been no resolution on the `0.1` version bump situation,
hence another bump of the patch version.
Testing: Not required
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
pauseCompositor/resumeCompositor have been renamed
topausePainting/resumePainting in 824f551. This renames the Java methods
to fix the regression.
Testing: Built servoview.aar and tested in Android app.
Fixes#41826
Signed-off-by: Niklas Merz <niklasmerz@apache.org>
Turns out we can squeeze a bit more out of rippy.png, as well as a
single byte off the big logo with a few new tricks I found.
This PR also converts the new kebab menu icon in the Android app to webp
like all the others, for another 3kb saved.
Testing: Manual.
Signed-off-by: lumiscosity <averyrudelphe@gmail.com>
Remove the public API to trigger shutdown and instead trigger the
process from `Servo`'s implementation of `Drop` trait.
This makes it hard to create issues involving the order of destruction
of `Servo` and `WebView`s. It will also allow us to implement
asynchronous shutdown in the future.
Testing: Should be covered by existing unit tests.
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
As discussed in the tsc-channel, prepare for the next release by cutting
a version on the last day of the month.
Note: The actual release would happen ~ 2 weeks from now, when the blog
post for november is ready.
This commit was produced by running `./mach release 0.0.3`.
Testing: Not required. Additional pre-release testing will happen after
the version bump and before the release, with potential patches being
cherry-picked to a release branch.
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This change is a major re-architecture of servoshell to support multiple
windows. Unfortunately it was not possible to do this incrementally, but
@mukilan and I did this together so we feel more confident about these
changes.
The main change here is that now the `HashMap` of windows that `App`
has can be filled with more than one `ServoShellWindow`.
`ServoShellWindow` is a wrapper around a `PlatformWindow` which can
either be headed, headless, or for embedded platforms. Embedded
platforms (Android and OHOS) are only expected to have a single window,
but there is no reason that more windows cannot be added.
There is still a little bit more work to be done in order to fully
enable
mulitple windows, so this change is just the architectural preparation.
This change enables the embedded and desktop versions of servoshell to
start to be fully integrated so that the entire `RunningAppState` is
shared between them.
Testing: servoshell is the test harness so these changes are covered
by the WPT tests.
---------
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Mukilan Thiyagarajan <mukilan@igalia.com>
Instead of relying on `Sevo::animating()` in servoshell to drive the
event loop, it is sufficient to just let the `RefreshDriver` wake it up
when it is time to re-render.
This allows us to remove `Servo::animating()` completely. It is a bit
odd that there is a global API to track this, rather than per-`WebView`
or window, so this change just removes it entirely.
Testing: This should make the main loop of headless servoshell more
efficient,
but I do not think this difference is going to be observable in any way.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Ran ./mach release 0.0.2 to update the version number and update the
license.html
This is in preperation for the v0.0.2 release with the next nightly, as
discussed on zulip.
Testing: Not tested
Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
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>
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>
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>
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>
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>
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>
* 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>
* 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>
* android: publish nightly builds for aarch64
Publish the aarch64 apk and aar packages to both Github Releases
and S3 so that it can be linked from servo.org.
The focus is on getting a working version of the APK on the homepage,
so few issues are resolved with temporary solutions:
1) We publish the "release" profile instead of "production" since the
latter will need changes in the gradle configuration (the changes
required was previously blocked on #32720 which is now closed).
2) The scheme for the version code is simple and doesn't consider
other factors such as API level and product variants discussed in the
Android docs (https://developer.android.com/google/play/publishing/multiple-apks#VersionCodes)
This should be fine for now as we don't publish to any store yet.
The change also makes it so that the 'Release nightly' workflow will
endup building all 4 variants for the Android target, but only aarch64
is uploaded. This is because GH Actions doesn't have a good way to skip
a specific job in a matrix and the additionally code complexity needed
to acheive it (either generating a JSON dynamically in a new job and using
`fromJSON` in the matrix definition or skipping each individual step
based on matrix.target and `inputs.upload`) didn't seem worth the cost
saved (this is executed only once a day).
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* android: add attestation for nightly build artifacts
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
---------
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
This PR adds support for signing all APKs we produce on the CI
with a custom signing key. Currently the logic falls back to
the debug key (which is generated by AGP and not persistent) if
the environment variable for the keystore is not set. This allows
local developer builds to work without requiring a key store.
Once #32720 is resolved, we could sign just the production builds
and remove the conditional logic.
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* Android build
* Fixes
* More fixes
- Still failing in the linking step
* More work on getting linking working
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* android: use mozjs with ndk r25c. loads servo.org
more android build fixes.
* fix ./mach run for android and make it follow logs
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* add experimental logic for compositor pause/resume
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* pass DPI from android to simpleservo
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* ci: add android workflow
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* switch to ANDROID_SDK_ROOT and ANDROID_NDK_ROOT vars
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* upgrade gradle to 4.10.1
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* upgrade to gradle 5.1.1
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* upgrade to gradle 8 and agp 8
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* make compositing work again with external present
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* android: improve mach support for non-NixOS and CI
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* fix sampler compilation bug introduced in #30490
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* ci: add android build to main workflow
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* gradle: set MinSdk = targetSdk = 30
NDK requires we compile against the minSdk API level
which is 30 in our case.
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* add instructions for android in README.md
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* apk: move servosurface to servoview
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* apk: uncomment the mediasession callbacks on MainActivity
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* apk: fix crash on MainAtivity.onDestroy
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* apk: drop VR, arm 5 and unused code
This commit drops:
* support for google, oculusvr
* support for arm5 architecture
and also removes
* fakeld scripts
* unused java code
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* cleanup shell.nix
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* android: add FIXMEs for gstreamer code
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* apk: remove commented code and debug logs
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* cleanup ServoView.java
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* mach: comment call to download gstreamer deps for android
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* disable bluetooth for jniapi as blurdroid is broken
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* fixup! README.md
* fixup! remove change in Cargo.toml
* fixup! move shell variables together
* fixup! cleanup jniapi/Cargo.toml comments
* delete commented gstreamer related android code
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* remove unused config variable in servbuild
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* android: more cleanup
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* force no_static_freetype only for android
* use actions to manage sdk, ndk and java
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* rename embedder event names to be more clear.
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* link to startup crash issue
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* fix lint issues
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* upgrade env_logger to 0.10 with duplicate exception
libservo and android_logger can use env_logger 0.10
but quickcheck is still stuck on 0.8 and has not seen
any activity in the last 2 years. This commit adds
a duplicate exception until the quickcheck dependency
can be upgraded (or replaced)
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* android: fix comments
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* disable jemalloc on android
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
* fixup! replace linux with android in cfg
---------
Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This change replaces OpenSSL with rustls and also the manually curated
CA certs file with webpki-roots (effectively the same thing, but as a
crate).
Generally speaking the design of the network stack is the same. Changes:
- Code around certificate overrides needed to be refactored to work with
rustls so the various thread-safe list of certificates is refactored
into `CertificateErrorOverrideManager`
- hyper-rustls takes care of setting ALPN protocols for HTTP requests,
so for WebSockets this is moved to the WebSocket code.
- The safe set of cypher suites is chosen, which seem to correspond to
the "Modern" configuration from [1]. This can be adjusted later.
- Instead of passing a string of PEM CA certificates around, an enum is
used that includes parsed Certificates (or the default which reads
them from webpki-roots).
- Code for starting up an SSL server for testing is cleaned up a little,
due to the fact that the certificates need to be overriden explicitly
now. This is due to the fact that the `webpki` crate is more stringent
with self-signed certificates than SSL (CA certificates cannot used as
end-entity certificates). [2]
1. https://wiki.mozilla.org/Security/Server_Side_TLS
2. https://github.com/briansmith/webpki/issues/114Fixes#7888.
Fixes#13749.
Fixes#26835.
Fixes#29291.