Detect URLs and email addresses, and suppress both line breaking and
hyphenation within them.
Bug: 20126487
Bug: 20566159
Change-Id: I43629347a063dcf579e355e5b678d7195f453ad9
The FLX will contain a font manifest JSON file that maps font family names
to custom font assets. Flutter will provide a FontSelector that loads
fonts on demand and caches typeface and style data.
Before this patch, the font fallback chain iterated all installed font
families if a variation selector was specified.
This CL narrows down the range of iteration.
To decide the font family for the variation sequence, we need to search
for both the variation sequence and its base code point.
The new range of the iteration is a union of them.
With this change, the running time of Paint.hasGlyph for the variation
sequence improves 50% and the running time of Paint.measureText for the
variation sequence improves 40% for the large text case on Nexus 6
userdebug.
Bug: 26784699
Bug: 11750374
Change-Id: Iced1349e3ca750821d8882c551551f65bb569794
Implement a WordBreaker that defines our concept of valid word
boundaries, customizing the ICU behavior. Currently, we suppress line
breaks at soft hyphens (these are handled specially). Also, the
new WordBreaker class has methods that determine the start and end
of the word (punctuation stripped) for the purpose of hyphenation.
This patch, in its current form, doesn't handle email addresses and
URLs specially, but the WordBreaker class is the correct place to do
so. Also, special case handling of hyphens and dashes is still done
in LineBreaker, but all of that should be moved to WordBreaker.
Bug: 20126487
Bug: 20566159
Change-Id: I492cbad963f9b74a2915f010dad46bb91f97b2fe
The Dart code uses -1 to signal that there is no current selection. If
we get text input in this state, we need to do something reasonable.
This patch teach us to treat that case as if the selection was zero.
This patch also improves how we convert from NSString to string16 and
makes it so we don't leak keyboard subviews.
Fixes https://github.com/flutter/flutter/issues/1878
It's possible for multiple calls to AwaitVSync to be pending while reloading
an application. The Animator may get an AwaitVSync, a Reset, and then another
AwaitVSync before the first vsync completes.
If this happens, invoke both callbacks. If we close the pipe, then the
Animator will no longer make progress.
* Use Node::Combinator::PRUNE, which stops the Mozart launcher from showing red
when we're loading child views. Instead of blocking the whole app, we'll now
just prune away the children that aren't ready. Eventually we'll want
to let authors control these operations.
* Grab the service registry in AcceptConnection rather than CreateView. The
CreateView comes from the Mozart launcher, which isn't where we want to get
the service registry. Now we get the service registry from the first app to
connect, which isn't right either but at least works while we sort out what
we really want.