196 Commits

Author SHA1 Message Date
Michael Goderbauer
e654557320
Enable 'Speak Screen' and 'Switch Control' for iOS (#5016) 2018-04-17 09:16:24 -07:00
Chinmay Garde
91dee5981f
If the rasterizer has a valid surface context, use that to create a snapshotting render target. (#4979) 2018-04-13 16:58:27 -07:00
Chinmay Garde
58e84c8bf0
Re-land "Support multiple shells in a single process. (#4932)" (#4998)
* Re-land "Support multiple shells in a single process. (#4932)"

This reverts commit 723c7d01439da4261bc836075fb55651ce9e7f03.
2018-04-13 13:48:15 -07:00
Vyacheslav Egorov
723c7d0143
Revert "Re-land "Support multiple shells in a single process. (#4932)" (#4977)" (#4981)
This reverts commit a3327bff86800b3e654a2988fa7e6049edeb679c.
2018-04-12 18:28:55 +02:00
Chinmay Garde
a3327bff86
Re-land "Support multiple shells in a single process. (#4932)" (#4977)
This reverts commit 9199b40f2a2a6e448cd251de44e020ec3b75002d.
2018-04-11 15:41:23 -07:00
Chinmay Garde
9199b40f2a
Revert "Support multiple shells in a single process. (#4932)" (#4964)
This reverts commit 6baff4c821350bbcb64e7d029574b567f3801a1a.
2018-04-10 15:28:43 -07:00
Chinmay Garde
6baff4c821
Support multiple shells in a single process. (#4932)
* Support multiple shells in a single process.

The Flutter Engine currently works by initializing a singleton shell
instance. This shell has to be created on the platform thread. The shell
is responsible for creating the 3 main threads used by Flutter (UI, IO,
GPU) as well as initializing the Dart VM. The shell, references to task
runners of the main threads as well as all snapshots used for VM
initialization are stored in singleton objects. The Flutter shell only
creates the threads, rasterizers, contexts, etc. to fully support a
single Flutter application. Current support for multiple Flutter
applications is achieved by making multiple applications share the same
resources (via the platform views mechanism).

This scheme has the following limitations:

* The shell is a singleton and there is no way to tear it down. Once you
  run a Flutter application in a process, all resources managed by it
  will remain referenced till process termination.
* The threads on which the shell performs its operations are all
  singletons. These threads are never torn down and multiple Flutter
  applications (if present) have to compete with one another on these
  threads.
* Resources referenced by the Dart VM are leaked because the VM isn't
  shutdown even when there are no more Flutter views.
* The shell as a target does not compile on Fuchsia. The Fuchsia content
  handler uses specific dependencies of the shell to rebuild all the
  shell dependencies on its own. This leads to differences in frame
  scheduling, VM setup, service protocol endpoint setup, tracing, etc..
  Fuchsia is very much a second class citizen in this world.
* Since threads and message loops are managed by the engine, the engine
  has to know about threading and platform message loop interop on each
  supported platform.

Specific updates in this patch:

* The shell is no longer a singleton and the embedder holds the unique
  reference to the shell.
* Shell setup and teardown is deterministic.
* Threads are no longer managed by the shell. Instead, the shell is
  given a task runner configuration by the embedder.
* Since the shell does not own its threads, the embedder can control
  threads and the message loops operating on these threads. The shell is
  only given references to the task runners that execute tasks on these
  threads.
* The shell only needs task runner references. These references can be
  to the same task runner. So, if the embedder thinks that a particular
  Flutter application would not need all the threads, it can pass
  references to the same task runner. This effectively makes Flutter
  application run in single threaded mode. There are some places in the
  shell that make synchronous calls, these sites have been updated to
  ensure that they don’t deadlock.
* The test runner and the headless Dart code runner are now Flutter
  applications that are effectively single threaded (since they don’t
  have rendering concerns of big-boy Flutter application).
* The embedder has to guarantee that the threads and outlive the shell.
  It is easy for the embedder to make that guarantee because shell
  termination is deterministic.
* The embedder can create as many shell as it wants. Typically it
  creates a shell per Flutter application with its own task runner
  configuration. Most embedders obtain these task runners from threads
  dedicated to the shell. But, it is entirely possible that the embedder
  can obtain these task runners from a thread pool.
* There can only be one Dart VM in the process. The numerous shell
  interact with one another to manage the VM lifecycle. Once the last
  shell goes away, the VM does as well and hence all resources
  associated with the VM are collected.
* The shell as a target can now compile and run on Fuchsia. The current
  content handler has been removed from the Flutter engine source tree
  and a new implementation has been written that uses the new shell
  target.
* Isolate management has been significantly overhauled. There are no
  owning references to Dart isolates within the shell. The VM owns the
  only strong reference to the Dart isolate. The isolate that has window
  bindings is now called the root isolate. Child isolates can now be
  created from the root isolate and their bindings and thread
  configurations are now inherited from the root isolate.
* Terminating the shell terminates its root isolates as well as all the
  isolates spawned by this isolate. This is necessary be shell shutdown
  is deterministic and the embedder is free to collect the threads on
  which the isolates execute their tasks (and listen for mircrotasks
  flushes on).
* Launching the root isolate is now significantly overhauled. The shell
  side (non-owning) reference to an isolate is now a little state
  machine and illegal state transitions should be impossible (barring
  construction issues). This is the only way to manage Dart isolates in
  the shell (the shell does not use the C API is dart_api.h anymore).
* Once an isolate is launched, it must be prepared (and hence move to
  the ready phase) by associating a snapshot with the same. This
  snapshot can either be a precompiled snapshot, kernel snapshot, script
  snapshot or source file. Depending on the kind of data specified as a
  snapshot as well as the capabilities of the VM running in the process,
  isolate preparation can fail preparation with the right message.
* Asset management has been significantly overhauled. All asset
  resolution goes through an abstract asset resolver interface. An asset
  manager implements this interface and manages one or more child asset
  resolvers. These asset resolvers typically resolve assets from
  directories, ZIP files (legacy FLX assets if provided), APK bundles,
  FDIO namespaces, etc…
* Each launch of the shell requires a separate and fully configured
  asset resolver. This is necessary because launching isolates for the
  engine may require resolving snapshots as assets from the asset
  resolver. Asset resolvers can be shared by multiple launch instances
  in multiple shells and need to be thread safe.
* References to the command line object have been removed from the
  shell. Instead, the shell only takes a settings object that may be
  configured from the command line. This makes it easy for embedders and
  platforms that don’t have a command line (Fuchsia) to configure the
  shell. Consequently, there is only one spot where the various switches
  are read from the command line (by the embedder and not the shell) to
  form the settings object.
* All platform now respect the log tag (this was done only by Android
  till now) and each shell instance have its own log tag. This makes
  logs from multiple Flutter application in the same process (mainly
  Fuchsia) more easily decipherable.
* The per shell IO task runner now has a new component that is
  unfortunately named the IOManager. This component manages the IO
  GrContext (used for asynchronous texture uploads) that cooperates with
  the GrContext on the GPU task runner associated with the shell. The
  IOManager is also responsible for flushing tasks that collect Skia
  objects that reference GPU resources during deterministic shell
  shutdown.
* The embedder now has to be careful to only enable Blink on a single
  instance of the shell. Launching the legacy text layout and rendering
  engine multiple times is will trip assertions. The entirety of this
  runtime has been separated out into a separate object and can be
  removed in one go when the migration to libtxt is complete.
* There is a new test target for the various C++ objects that the shell
  uses to interact with the Dart VM (the shell no longer use the C API
  in dart_api.h). This allows engine developers to test VM/Isolate
  initialization and teardown without having the setup a full shell
  instance.
* There is a new test target for the testing a single shell instances
  without having to configure and launch an entire VM and associated
  root isolate.
* Mac, Linux & Windows used to have different target that created the
  flutter_tester referenced by the tool. This has now been converted
  into a single target that compiles on all platforms.
* WeakPointers vended by the fml::WeakPtrFactory(notice the difference
  between the same class in the fxl namespace) add threading checks on
  each use. This is enabled by getting rid of the “re-origination”
  feature of the WeakPtrFactory in the fxl namespace. The side effect of
  this is that all non-thread safe components have to be created, used
  and destroyed on the same thread. Numerous thread safety issues were
  caught by this extra assertion and have now been fixed.
  * Glossary of components that are only safe on a specific thread (and
    have the fml variants of the WeakPtrFactory):
    * Platform Thread: Shell
    * UI Thread: Engine, RuntimeDelegate, DartIsolate, Animator
    * GPU Thread: Rasterizer, Surface
    * IO Thread: IOManager

This patch was reviewed in smaller chunks in the following pull
requests. All comments from the pulls requests has been incorporated
into this patch:

* flutter/assets: https://github.com/flutter/engine/pull/4829
* flutter/common: https://github.com/flutter/engine/pull/4830
* flutter/content_handler: https://github.com/flutter/engine/pull/4831
* flutter/flow: https://github.com/flutter/engine/pull/4832
* flutter/fml: https://github.com/flutter/engine/pull/4833
* flutter/lib/snapshot: https://github.com/flutter/engine/pull/4834
* flutter/lib/ui: https://github.com/flutter/engine/pull/4835
* flutter/runtime: https://github.com/flutter/engine/pull/4836
* flutter/shell: https://github.com/flutter/engine/pull/4837
* flutter/synchronization: https://github.com/flutter/engine/pull/4838
* flutter/testing: https://github.com/flutter/engine/pull/4839
2018-04-10 14:57:02 -07:00
Stanislav Baranov
7fa08b3ba9
Support for decimal and signed numeric keyboard (#4853)
* Support for decimal and signed numeric keyboard

* Comments
2018-03-26 13:14:38 -07:00
Sarah Zakarias
2114a88b5e
Provide asset lookup key on ios (#4817) 2018-03-21 11:36:49 +01:00
Mikkel Nygaard Ravn
9671f63459
Make standard codecs extensible (#4770) 2018-03-16 00:08:08 +00:00
Michael Goderbauer
e44cd55fc4
Manually given hint,value,label,trait has precedence for TextFields on iOS (#4777) 2018-03-12 17:56:08 -07:00
Chinmay Garde
5bffdefbbf
Use weak pointers to the accesibility bridge from objects vended to the UIKit accessibility framework. (#4761) 2018-03-08 17:23:01 -08:00
Michael Goderbauer
7f7634fa17
Add SemanticsFlag for Header (#4752) 2018-03-06 15:43:13 -08:00
Chris Bracken
269bab73b6
Add nil check for country code and language code (#4732)
NSLocale objectForKey: may return nil for NSLocaleLanguageCode and
NSLocateCountryCode in certain cases.

This adds a defensive nil check for such cases.
2018-03-01 13:46:22 -08:00
Sarah Zakarias
4d7065af2d
remove unavailabe API from FlutterDartProject.mm (#4724) 2018-02-28 14:04:14 +01:00
xster
ba98f2634b
Add more haptic feedback varieties (#4699)
* Add more haptic feedback varieties

* Make the specific feedback types do nothing on <iOS 10
2018-02-27 14:55:18 -08:00
Yegor
3bbc71df69
fix naming of static function intToComparisonResult (#4685) 2018-02-22 11:24:51 -07:00
Yegor
503f86d54c
iOS a11y: Implement strong down weak up reference management (#4602)
* fix iOS crash in a11y mode when used too fast

* clang-format
2018-02-15 16:33:05 -08:00
Chris Bracken
439edca287
Fix unguarded availability warnings for iOS (#4664)
Place all iOS code that relies on APIs introduced in iOS versions later
than our base SDK version (iOS 8) behind @available checks. This allows
us to enable the -Wunguarded-availability compiler flag for iOS builds
in the buildroot repo.
2018-02-13 11:49:43 -08:00
Michael Goderbauer
a00f94582b
Add accessibilityFocus and loseAccessibilityFocus as a11y actions (#4655) 2018-02-09 17:47:52 -08:00
Michael Goderbauer
8ac6f6efa1
Encode scrolling status into tree (#4647) 2018-02-09 15:39:58 -08:00
Yegor
6dd49f0695
iOS a11y text entry (~70% of it) (#4575)
* implement iOS text field editing in a11y mode

* address Chinmay's comments

* replace node in child list when changing type
2018-02-05 15:14:13 -08:00
Chris Bracken
dbc071aa62
Use @available checks for iOS 11 features (#4619)
Use @available checks for iOS 11 features
2018-01-30 09:36:21 -08:00
Chris Bracken
521c73ded8
Revert "Use @available checks for iOS 11 features (#4596)" (#4597)
This reverts commit 89b6d435205d9bcdf8dde965dd1b0432482407c5.

Apparently the clang toolchain is still hitting issues. Will give this
another go after the next clang toolchain update.
2018-01-26 16:08:18 -08:00
Chris Bracken
89b6d43520
Use @available checks for iOS 11 features (#4596)
Guard code that deals with iOS safe area insets behind an @available
check.

This cleans up some old TODOs from before out clang toolchain supported
@available.
2018-01-26 15:51:00 -08:00
Chris Bracken
f937d93138
Extract common iOS asset path lookup code (#4594)
Consolidates the asset path lookup logic from FlutterDartProject and FlutterMain().
2018-01-26 14:27:46 -08:00
Alexander Aprelev
6921873c71
Lookup FTLAssetsPath when deducing assets path on ios (#4593)
* Lookup FTLAssetsPath when deducing assets path on ios

* WS

* Proper fix

* Another whitespace fix
2018-01-26 13:45:04 -08:00
Yegor
2fe8b648ed
use Human Interface Guidelines for a11y and non-a11y text sizes (#4586) 2018-01-24 15:46:35 -08:00
Alexander Aprelev
cdf869bcd7
When running on iOS deduce bundle path during engine initialization. (#4532) 2018-01-10 17:40:47 -08:00
Mikkel Nygaard Ravn
84fc920fde
Deprecate support for big integers in standard message codec (#4528) 2018-01-09 23:58:45 +01:00
Michael Goderbauer
12e0e38a8b
Split SemanticsFlags.isDisabled into two (#4517) 2018-01-04 15:15:54 -08:00
Michael Goderbauer
26010cf483
Add SemanticsFlag.isDisabled (#4503) 2018-01-02 15:57:52 -08:00
Michael Goderbauer
937bde8f98
A11y nodes with only value or hint are focusable (#4481) 2017-12-20 11:15:10 -08:00
Sarah Zakarias
4cbe26dd37
Handle Flutter assets outside FLX (#4343) 2017-12-13 10:55:24 +01:00
Michael Goderbauer
e07eafae1d
Roll forward: Parameters for SemanticActions; a11y text selection (#4452)
Reverts the revert in #4448 with fixes to pass on the bot.

This change will require framework changes in flutter/flutter#13490.
2017-12-12 14:25:45 -08:00
najeira
4ea7075c1d Map iOS touches to Flutter view coordinate system (#4425)
This change ensures that touches are mapped to the Flutter view
co-ordinate system. In the case of a Flutter view that doesn't share the
same origin and orientation as the screen co-ordinate system, touches
were appled in the wrong location. This bug affected Flutter views whose
origin was not the screen origin and Flutter apps running with the
in-call status bar on iPhones other than the iPhone X.
2017-12-12 13:22:53 -08:00
Chris Bracken
edb0201fa2
Support iOS scroll-to-top tap on iPhone X (#4436)
This adds support for scrolling the primary scroll view to the top on
status bar touches, on the iPhone X.

Notes:
1. The iPhone X status bar doesn't change height when in in-call/etc.
   mode, and unlike other iPhones, does scroll to top when in in-call mode.
2. No matter which model of iOS device, the top safe area inset doesn't
   change when in in-call mode. In in-call mode, the OS reduces the app
   view height by 20px off the top, and the double-height 'in-call' status
   bar covers this new inset (outside the view) and there continues to be a
   20px safe area in the app.

On iOS 11, rather than comparing status bar height to a hardcoded 20px
'standard height' we now compare to the top safe area inset (which is
always the standard status bar height, regardless of device). On iOS
versions prior to iOS 11, we use the previous logic.

Fixes flutter/flutter#13439
2017-12-08 19:36:53 -08:00
Chris Bracken
8e39760168
Expose keyboard height as view inset on iOS (#4428)
Keyboard height is now treated as a view inset, which could be used to
shrink the content area of the app as is done in the Material Scaffold,
rather than padding, which is used to indicate content areas where user
interaction should be avoided.
2017-12-07 18:37:46 -08:00
Chris Bracken
a94e88200a
Set window.viewInsets.bottom to keyboard height on iOS (#4420)
This allows for us to start migrating framework classes (notably
Scaffold) to use window.viewInsets.bottom to get the keyboard height.
Once framework updates have landed, we will land an engine patch to
expose the iOS bottom safe area inset as padding.

This change is already landed for Android.

Related issue: flutter/flutter#12098
2017-12-06 15:06:12 -08:00
Chris Bracken
033daf152d
Update the iOS mark region on setTextInputState (#4418)
Previously, we failed to clear/update the mark text range on updates
from the framework. This resulted in a crash if the incoming text value
was shorter than the current mark range when iOS attempts to extract the
mark range substring from the text.

Fixes flutter/flutter#12585
2017-12-06 11:30:14 -08:00
xster
22e63c3d05
Block image decoding on iOS in the background (#4384)
* Add synchronization to ResourceContext usage

* debug

* Use unique ptr factory

* formatting

* left more notes for future readers
2017-12-01 12:09:00 -08:00
Chris Bracken
93648ef0ed
Expose Window.viewInsets in dart:ui (#4403)
Window.viewInsets is the set of window-relative insets that describe the
area of the window that an application may want to treat as effectively
reducing the size of the content. Typically this is due to system UI
that fully obscures underlying content, such as the keyboard.

This area differs from padding in that padding is the set of insets that
describe the area of the window that may be partially (or fully)
obscured by system UI or physical intrusions into the view area (e.g.
iPhone X sensor housing, status bar, or the iPhone X home indicator
widget).

This patch does not yet enable the iOS bottom edge safe area. Once the
framework has been updated to use viewInsets for bottom-edge occlusions
(today, the keyboard), the bottom safe area will be enabled and
framework patches that depend on it, landed.
2017-11-29 16:27:15 -08:00
Mikkel Nygaard Ravn
1f0c959189
Align iOS event channel semantics to Android counterpart (#4353) 2017-11-13 15:34:29 +01:00
Chris Bracken
bc2acf7bdd
Revert "Roll Fuchsia buildtools to 85907c59e97527d79bbfdfd849d8e85c24959cc5 (#4331)" (#4340)
With the update to HEAD of the Fuchsia buildtools repo, the new clang
toolchain picked up caused link-time breakage in android x86_64
libFlutter.so builds.

Sample log:
https://build.chromium.org/p/client.flutter/builders/Linux%20Engine/builds/1974/steps/build%20android_debug_x64/logs/stdio

Sample failure:
FAILED: libflutter.so libflutter.so.TOC lib.stripped/libflutter.so
../../third_party/android_tools/ndk/toolchains/x86_64-4.9/prebuilt/linux-x86_64/lib/gcc/x86_64-linux-android/4.9.x/../../../../x86_64-linux-android/bin/ld.gold: error: obj/flutter/shell/platform/android/libflutter/android_context_gl.o: unsupported reloc 42 against global symbol std::__ndk1::num_put<char, std::__ndk1::ostreambuf_iterator<char, std::__ndk1::char_traits<char> > >::id

This reverts commit 8ad42f0dae3cb1267c2b9ab99db80e4696ddbc3d.
2017-11-08 16:48:00 -08:00
Chris Bracken
8ad42f0dae
Roll Fuchsia buildtools to 85907c59e97527d79bbfdfd849d8e85c24959cc5 (#4331)
* Roll Fuchsia buildtools to 85907c59e97527d79bbfdfd849d8e85c24959cc5

This also updates Flutter buildroot to a6e52dbb776c45cc8c57d7143b8eb8b2e762fdfb
which disables -Wtautological-constant-compare temporarily until
https://reviews.llvm.org/D39462 lands in clang. This is in line with
Fuchsia's compiler options.

* Apply clang-format diffs

No logical changes. This applies clang-format from the latest Fuchsia
buildtools to the engine codebase.
2017-11-08 11:18:17 -08:00
Chris Bracken
dd6585bb9a
Respond to safe area inset changes (#4330)
On iOS 11 and above, update viewport padding and notify the framework
when changes to safe area insets occur.
2017-11-07 18:26:59 -08:00
Chris Bracken
e059cc0258
Temporaribly disable bottom safe area padding on iOS (#4322)
There are two different sets of view insets that applications may want
to track in order to avoid unwanted interaction with system UI:

1. OS UI that effectively shrinks the Flutter view from a UX point of
   view: e.g., when the keyboard opens, it occludes the bottom of the
   screen and the view should be adjusted such that the bottom, for the
   purposes of scrolling is just above the keyboard.
2. OS UI that is overlaid over the application, but into which the
   application should draw. e.g., the Home indicator on the iPhone X
   typically appears near the bottom of the screen, overlaid over app
   content. Content should be rendered within this 'safe area' but apps
   should avoid requiring user interaction there. For example, list
   views may want to include some small amount of additional padding to
   ensure the last list item can scroll above this area.

Since Flutter does not currently distinguish between these two cases,
this patch disables the bottom safe area inset until API is added to
support these separately.
2017-11-03 14:20:46 -07:00
Chris Bracken
3021e8f6c3
Correct behaviour for rangeForCharacterAtIndex (#4319)
Previously it always fell through to a zero-length character range at
the specified position.
2017-11-02 15:16:06 -07:00
xster
8d8203ccb6
Make the text selection code more defensive (#4291)
* Make the text selection code more defensive

* format

* Move validation to a method

* Fix math

* rename
2017-11-02 03:36:52 -07:00
Chinmay Garde
9a960f82f5 Add texture support (eg video, camera) (#4159) 2017-11-02 10:57:29 +01:00