Commit 85689f12 authored by Hixie's avatar Hixie

Make the Semantics code be a service.

Port the tests to use the new interface.
parent e8a21f5d
...@@ -7,6 +7,7 @@ import 'dart:ui' as ui; ...@@ -7,6 +7,7 @@ import 'dart:ui' as ui;
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:mojo/core.dart' as core;
import 'package:sky_services/semantics/semantics.mojom.dart' as mojom; import 'package:sky_services/semantics/semantics.mojom.dart' as mojom;
import 'box.dart'; import 'box.dart';
...@@ -26,6 +27,7 @@ abstract class Renderer extends Object with Scheduler, MojoShell ...@@ -26,6 +27,7 @@ abstract class Renderer extends Object with Scheduler, MojoShell
_instance = this; _instance = this;
ui.window.onMetricsChanged = handleMetricsChanged; ui.window.onMetricsChanged = handleMetricsChanged;
initRenderView(); initRenderView();
initSemantics();
assert(renderView != null); assert(renderView != null);
assert(() { assert(() {
initServiceExtensions(); initServiceExtensions();
...@@ -41,8 +43,6 @@ abstract class Renderer extends Object with Scheduler, MojoShell ...@@ -41,8 +43,6 @@ abstract class Renderer extends Object with Scheduler, MojoShell
if (renderView == null) { if (renderView == null) {
renderView = new RenderView(); renderView = new RenderView();
renderView.scheduleInitialFrame(); renderView.scheduleInitialFrame();
if (_semanticsClient != null)
renderView.scheduleInitialSemantics();
} }
handleMetricsChanged(); // configures renderView's metrics handleMetricsChanged(); // configures renderView's metrics
} }
...@@ -65,12 +65,11 @@ abstract class Renderer extends Object with Scheduler, MojoShell ...@@ -65,12 +65,11 @@ abstract class Renderer extends Object with Scheduler, MojoShell
renderView.configuration = new ViewConfiguration(size: ui.window.size); renderView.configuration = new ViewConfiguration(size: ui.window.size);
} }
mojom.SemanticsListener _semanticsClient; void initSemantics() {
void setSemanticsClient(mojom.SemanticsListener client) { SemanticsNode.onSemanticsEnabled = renderView.scheduleInitialSemantics;
assert(_semanticsClient == null); provideService(mojom.SemanticsServer.serviceName, (core.MojoMessagePipeEndpoint endpoint) {
_semanticsClient = client; return new SemanticsServer();
if (renderView != null) });
renderView.scheduleInitialSemantics();
} }
void _handlePersistentFrameCallback(Duration timeStamp) { void _handlePersistentFrameCallback(Duration timeStamp) {
...@@ -84,9 +83,9 @@ abstract class Renderer extends Object with Scheduler, MojoShell ...@@ -84,9 +83,9 @@ abstract class Renderer extends Object with Scheduler, MojoShell
RenderObject.flushCompositingBits(); RenderObject.flushCompositingBits();
RenderObject.flushPaint(); RenderObject.flushPaint();
renderView.compositeFrame(); // this sends the bits to the GPU renderView.compositeFrame(); // this sends the bits to the GPU
if (_semanticsClient != null) { if (SemanticsNode.hasListeners) {
RenderObject.flushSemantics(); RenderObject.flushSemantics();
SemanticsNode.sendSemanticsTreeTo(_semanticsClient); SemanticsNode.sendSemanticsTree();
} }
} }
......
...@@ -333,7 +333,18 @@ class SemanticsNode extends AbstractNode { ...@@ -333,7 +333,18 @@ class SemanticsNode extends AbstractNode {
return result; return result;
} }
static void sendSemanticsTreeTo(mojom.SemanticsListener client) { static List<mojom.SemanticsListener> _listeners;
static bool get hasListeners => _listeners != null && _listeners.length > 0;
static VoidCallback onSemanticsEnabled; // set by the binding
static void addListener(mojom.SemanticsListener listener) {
if (!hasListeners)
onSemanticsEnabled();
_listeners ??= <mojom.SemanticsListener>[];
_listeners.add(listener);
}
static void sendSemanticsTree() {
assert(hasListeners);
for (SemanticsNode oldNode in _detachedNodes) { for (SemanticsNode oldNode in _detachedNodes) {
// The other side will have forgotten this node if we even send // The other side will have forgotten this node if we even send
// it again, so make sure to mark it dirty so that it'll get // it again, so make sure to mark it dirty so that it'll get
...@@ -377,7 +388,8 @@ class SemanticsNode extends AbstractNode { ...@@ -377,7 +388,8 @@ class SemanticsNode extends AbstractNode {
if (node._dirty && node.attached) if (node._dirty && node.attached)
updatedNodes.add(node._serialize()); updatedNodes.add(node._serialize());
} }
client.updateSemanticsTree(updatedNodes); for (mojom.SemanticsListener listener in _listeners)
listener.updateSemanticsTree(updatedNodes);
_dirtyNodes.clear(); _dirtyNodes.clear();
} }
...@@ -428,6 +440,7 @@ class SemanticsNode extends AbstractNode { ...@@ -428,6 +440,7 @@ class SemanticsNode extends AbstractNode {
class SemanticsServer extends mojom.SemanticsServer { class SemanticsServer extends mojom.SemanticsServer {
void addSemanticsListener(mojom.SemanticsListener listener) { void addSemanticsListener(mojom.SemanticsListener listener) {
SemanticsNode.addListener(listener);
} }
void tap(int nodeID) { void tap(int nodeID) {
SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeTapped)?.handleSemanticTap(); SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeTapped)?.handleSemanticTap();
......
...@@ -31,7 +31,7 @@ class _SemanticsDebuggerState extends State<SemanticsDebugger> { ...@@ -31,7 +31,7 @@ class _SemanticsDebuggerState extends State<SemanticsDebugger> {
} }
void _update() { void _update() {
setState(() { setState(() {
// the generation of the _SemanticsDebuggerClient has changed // the generation of the _SemanticsDebuggerListener has changed
}); });
} }
Point _lastPointerDownLocation; Point _lastPointerDownLocation;
...@@ -214,9 +214,10 @@ class _SemanticsDebuggerEntry { ...@@ -214,9 +214,10 @@ class _SemanticsDebuggerEntry {
_SemanticsDebuggerEntry hitTest(Point position, _SemanticsDebuggerEntryFilter filter) { _SemanticsDebuggerEntry hitTest(Point position, _SemanticsDebuggerEntryFilter filter) {
if (transform != null) { if (transform != null) {
if (transform.determinant == 0.0) Matrix4 invertedTransform = new Matrix4.identity();
double determinant = invertedTransform.copyInverse(transform);
if (determinant == 0.0)
return null; return null;
Matrix4 invertedTransform = new Matrix4.inverted(transform);
position = MatrixUtils.transformPoint(invertedTransform, position); position = MatrixUtils.transformPoint(invertedTransform, position);
} }
if (!rect.contains(position)) if (!rect.contains(position))
...@@ -235,13 +236,12 @@ class _SemanticsDebuggerEntry { ...@@ -235,13 +236,12 @@ class _SemanticsDebuggerEntry {
class _SemanticsDebuggerListener implements mojom.SemanticsListener { class _SemanticsDebuggerListener implements mojom.SemanticsListener {
_SemanticsDebuggerListener._() { _SemanticsDebuggerListener._() {
Renderer.instance.setSemanticsClient(this); SemanticsNode.addListener(this);
} }
static _SemanticsDebuggerListener instance; static _SemanticsDebuggerListener instance;
static mojom.SemanticsServer _server; static final SemanticsServer _server = new SemanticsServer();
static void ensureInstantiated({ mojom.SemanticsServer server }) { static void ensureInstantiated() {
_server = server ?? new SemanticsServer();
instance ??= new _SemanticsDebuggerListener._(); instance ??= new _SemanticsDebuggerListener._();
} }
......
...@@ -26,7 +26,7 @@ enum EnginePhase { ...@@ -26,7 +26,7 @@ enum EnginePhase {
composite composite
} }
class TestRenderingFlutterBinding extends BindingBase with Scheduler, Renderer, Gesturer { class TestRenderingFlutterBinding extends BindingBase with Scheduler, MojoShell, Renderer, Gesturer {
void initRenderView() { void initRenderView() {
if (renderView == null) { if (renderView == null) {
renderView = new TestRenderView(); renderView = new TestRenderView();
......
...@@ -7,7 +7,7 @@ import 'package:sky_services/semantics/semantics.mojom.dart' as mojom; ...@@ -7,7 +7,7 @@ import 'package:sky_services/semantics/semantics.mojom.dart' as mojom;
class TestSemanticsListener implements mojom.SemanticsListener { class TestSemanticsListener implements mojom.SemanticsListener {
TestSemanticsListener() { TestSemanticsListener() {
Renderer.instance.setSemanticsClient(this); SemanticsNode.addListener(this);
} }
final List<mojom.SemanticsNode> updates = <mojom.SemanticsNode>[]; final List<mojom.SemanticsNode> updates = <mojom.SemanticsNode>[];
updateSemanticsTree(List<mojom.SemanticsNode> nodes) { updateSemanticsTree(List<mojom.SemanticsNode> nodes) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment