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;
import 'package:flutter/gestures.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:mojo/core.dart' as core;
import 'package:sky_services/semantics/semantics.mojom.dart' as mojom;
import 'box.dart';
......@@ -26,6 +27,7 @@ abstract class Renderer extends Object with Scheduler, MojoShell
_instance = this;
ui.window.onMetricsChanged = handleMetricsChanged;
initRenderView();
initSemantics();
assert(renderView != null);
assert(() {
initServiceExtensions();
......@@ -41,8 +43,6 @@ abstract class Renderer extends Object with Scheduler, MojoShell
if (renderView == null) {
renderView = new RenderView();
renderView.scheduleInitialFrame();
if (_semanticsClient != null)
renderView.scheduleInitialSemantics();
}
handleMetricsChanged(); // configures renderView's metrics
}
......@@ -65,12 +65,11 @@ abstract class Renderer extends Object with Scheduler, MojoShell
renderView.configuration = new ViewConfiguration(size: ui.window.size);
}
mojom.SemanticsListener _semanticsClient;
void setSemanticsClient(mojom.SemanticsListener client) {
assert(_semanticsClient == null);
_semanticsClient = client;
if (renderView != null)
renderView.scheduleInitialSemantics();
void initSemantics() {
SemanticsNode.onSemanticsEnabled = renderView.scheduleInitialSemantics;
provideService(mojom.SemanticsServer.serviceName, (core.MojoMessagePipeEndpoint endpoint) {
return new SemanticsServer();
});
}
void _handlePersistentFrameCallback(Duration timeStamp) {
......@@ -84,9 +83,9 @@ abstract class Renderer extends Object with Scheduler, MojoShell
RenderObject.flushCompositingBits();
RenderObject.flushPaint();
renderView.compositeFrame(); // this sends the bits to the GPU
if (_semanticsClient != null) {
if (SemanticsNode.hasListeners) {
RenderObject.flushSemantics();
SemanticsNode.sendSemanticsTreeTo(_semanticsClient);
SemanticsNode.sendSemanticsTree();
}
}
......
......@@ -333,7 +333,18 @@ class SemanticsNode extends AbstractNode {
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) {
// 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
......@@ -377,7 +388,8 @@ class SemanticsNode extends AbstractNode {
if (node._dirty && node.attached)
updatedNodes.add(node._serialize());
}
client.updateSemanticsTree(updatedNodes);
for (mojom.SemanticsListener listener in _listeners)
listener.updateSemanticsTree(updatedNodes);
_dirtyNodes.clear();
}
......@@ -428,6 +440,7 @@ class SemanticsNode extends AbstractNode {
class SemanticsServer extends mojom.SemanticsServer {
void addSemanticsListener(mojom.SemanticsListener listener) {
SemanticsNode.addListener(listener);
}
void tap(int nodeID) {
SemanticsNode.getSemanticActionHandlerForId(nodeID, neededFlag: _SemanticFlags.canBeTapped)?.handleSemanticTap();
......
......@@ -31,7 +31,7 @@ class _SemanticsDebuggerState extends State<SemanticsDebugger> {
}
void _update() {
setState(() {
// the generation of the _SemanticsDebuggerClient has changed
// the generation of the _SemanticsDebuggerListener has changed
});
}
Point _lastPointerDownLocation;
......@@ -214,9 +214,10 @@ class _SemanticsDebuggerEntry {
_SemanticsDebuggerEntry hitTest(Point position, _SemanticsDebuggerEntryFilter filter) {
if (transform != null) {
if (transform.determinant == 0.0)
Matrix4 invertedTransform = new Matrix4.identity();
double determinant = invertedTransform.copyInverse(transform);
if (determinant == 0.0)
return null;
Matrix4 invertedTransform = new Matrix4.inverted(transform);
position = MatrixUtils.transformPoint(invertedTransform, position);
}
if (!rect.contains(position))
......@@ -235,13 +236,12 @@ class _SemanticsDebuggerEntry {
class _SemanticsDebuggerListener implements mojom.SemanticsListener {
_SemanticsDebuggerListener._() {
Renderer.instance.setSemanticsClient(this);
SemanticsNode.addListener(this);
}
static _SemanticsDebuggerListener instance;
static mojom.SemanticsServer _server;
static void ensureInstantiated({ mojom.SemanticsServer server }) {
_server = server ?? new SemanticsServer();
static final SemanticsServer _server = new SemanticsServer();
static void ensureInstantiated() {
instance ??= new _SemanticsDebuggerListener._();
}
......
......@@ -26,7 +26,7 @@ enum EnginePhase {
composite
}
class TestRenderingFlutterBinding extends BindingBase with Scheduler, Renderer, Gesturer {
class TestRenderingFlutterBinding extends BindingBase with Scheduler, MojoShell, Renderer, Gesturer {
void initRenderView() {
if (renderView == null) {
renderView = new TestRenderView();
......
......@@ -7,7 +7,7 @@ import 'package:sky_services/semantics/semantics.mojom.dart' as mojom;
class TestSemanticsListener implements mojom.SemanticsListener {
TestSemanticsListener() {
Renderer.instance.setSemanticsClient(this);
SemanticsNode.addListener(this);
}
final List<mojom.SemanticsNode> updates = <mojom.SemanticsNode>[];
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