Unverified Commit 3c2cd015 authored by Polina Cherkasova's avatar Polina Cherkasova Committed by GitHub

Inspector should not hold callback from garbage collection. (#130436)

parent 0e543889
......@@ -784,7 +784,6 @@ mixin WidgetInspectorService {
bool _trackRebuildDirtyWidgets = false;
bool _trackRepaintWidgets = false;
late RegisterServiceExtensionCallback _registerServiceExtensionCallback;
/// Registers a service extension method with the given name (full
/// name "ext.flutter.inspector.name").
///
......@@ -797,8 +796,9 @@ mixin WidgetInspectorService {
void registerServiceExtension({
required String name,
required ServiceExtensionCallback callback,
required RegisterServiceExtensionCallback registerExtension,
}) {
_registerServiceExtensionCallback(
registerExtension(
name: 'inspector.$name',
callback: callback,
);
......@@ -809,12 +809,14 @@ mixin WidgetInspectorService {
void _registerSignalServiceExtension({
required String name,
required FutureOr<Object?> Function() callback,
required RegisterServiceExtensionCallback registerExtension,
}) {
registerServiceExtension(
name: name,
callback: (Map<String, String> parameters) async {
return <String, Object?>{'result': await callback()};
},
registerExtension: registerExtension,
);
}
......@@ -827,12 +829,14 @@ mixin WidgetInspectorService {
void _registerObjectGroupServiceExtension({
required String name,
required FutureOr<Object?> Function(String objectGroup) callback,
required RegisterServiceExtensionCallback registerExtension,
}) {
registerServiceExtension(
name: name,
callback: (Map<String, String> parameters) async {
return <String, Object?>{'result': await callback(parameters['objectGroup']!)};
},
registerExtension: registerExtension,
);
}
......@@ -852,6 +856,7 @@ mixin WidgetInspectorService {
required String name,
required AsyncValueGetter<bool> getter,
required AsyncValueSetter<bool> setter,
required RegisterServiceExtensionCallback registerExtension,
}) {
registerServiceExtension(
name: name,
......@@ -863,6 +868,7 @@ mixin WidgetInspectorService {
}
return <String, dynamic>{'enabled': await getter() ? 'true' : 'false'};
},
registerExtension: registerExtension,
);
}
......@@ -893,6 +899,7 @@ mixin WidgetInspectorService {
void _registerServiceExtensionWithArg({
required String name,
required FutureOr<Object?> Function(String? objectId, String objectGroup) callback,
required RegisterServiceExtensionCallback registerExtension,
}) {
registerServiceExtension(
name: name,
......@@ -902,6 +909,7 @@ mixin WidgetInspectorService {
'result': await callback(parameters['arg'], parameters['objectGroup']!),
};
},
registerExtension: registerExtension,
);
}
......@@ -911,6 +919,7 @@ mixin WidgetInspectorService {
void _registerServiceExtensionVarArgs({
required String name,
required FutureOr<Object?> Function(List<String> args) callback,
required RegisterServiceExtensionCallback registerExtension,
}) {
registerServiceExtension(
name: name,
......@@ -931,6 +940,7 @@ mixin WidgetInspectorService {
assert(index == parameters.length || (index == parameters.length - 1 && parameters.containsKey('isolateId')));
return <String, Object?>{'result': await callback(args)};
},
registerExtension: registerExtension,
);
}
......@@ -1011,13 +1021,12 @@ mixin WidgetInspectorService {
/// * <https://github.com/dart-lang/sdk/blob/main/runtime/vm/service/service.md#rpcs-requests-and-responses>
/// * [BindingBase.initServiceExtensions], which explains when service
/// extensions can be used.
void initServiceExtensions(RegisterServiceExtensionCallback registerServiceExtensionCallback) {
void initServiceExtensions(RegisterServiceExtensionCallback registerExtension) {
final FlutterExceptionHandler defaultExceptionHandler = FlutterError.presentError;
if (isStructuredErrorsEnabled()) {
FlutterError.presentError = _reportStructuredError;
}
_registerServiceExtensionCallback = registerServiceExtensionCallback;
assert(!_debugServiceExtensionsRegistered);
assert(() {
_debugServiceExtensionsRegistered = true;
......@@ -1033,6 +1042,7 @@ mixin WidgetInspectorService {
FlutterError.presentError = value ? _reportStructuredError : defaultExceptionHandler;
return Future<void>.value();
},
registerExtension: registerExtension,
);
_registerBoolServiceExtension(
......@@ -1045,6 +1055,7 @@ mixin WidgetInspectorService {
WidgetsApp.debugShowWidgetInspectorOverride = value;
return forceRebuild();
},
registerExtension: registerExtension,
);
if (isWidgetCreationTracked()) {
......@@ -1071,6 +1082,7 @@ mixin WidgetInspectorService {
return;
}
},
registerExtension: registerExtension,
);
_registerBoolServiceExtension(
......@@ -1097,6 +1109,7 @@ mixin WidgetInspectorService {
debugOnProfilePaint = null;
}
},
registerExtension: registerExtension,
);
}
......@@ -1106,6 +1119,7 @@ mixin WidgetInspectorService {
disposeAllGroups();
return null;
},
registerExtension: registerExtension,
);
_registerObjectGroupServiceExtension(
name: WidgetInspectorServiceExtensions.disposeGroup.name,
......@@ -1113,10 +1127,12 @@ mixin WidgetInspectorService {
disposeGroup(name);
return null;
},
registerExtension: registerExtension,
);
_registerSignalServiceExtension(
name: WidgetInspectorServiceExtensions.isWidgetTreeReady.name,
callback: isWidgetTreeReady,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.disposeId.name,
......@@ -1124,6 +1140,7 @@ mixin WidgetInspectorService {
disposeId(objectId, objectGroup);
return null;
},
registerExtension: registerExtension,
);
_registerServiceExtensionVarArgs(
name: WidgetInspectorServiceExtensions.setPubRootDirectories.name,
......@@ -1131,6 +1148,7 @@ mixin WidgetInspectorService {
setPubRootDirectories(args);
return null;
},
registerExtension: registerExtension,
);
_registerServiceExtensionVarArgs(
name: WidgetInspectorServiceExtensions.addPubRootDirectories.name,
......@@ -1138,6 +1156,7 @@ mixin WidgetInspectorService {
addPubRootDirectories(args);
return null;
},
registerExtension: registerExtension,
);
_registerServiceExtensionVarArgs(
name: WidgetInspectorServiceExtensions.removePubRootDirectories.name,
......@@ -1145,49 +1164,60 @@ mixin WidgetInspectorService {
removePubRootDirectories(args);
return null;
},
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.getPubRootDirectories.name,
callback: pubRootDirectories,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.setSelectionById.name,
callback: setSelectionById,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getParentChain.name,
callback: _getParentChain,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getProperties.name,
callback: _getProperties,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getChildren.name,
callback: _getChildren,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getChildrenSummaryTree.name,
callback: _getChildrenSummaryTree,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getChildrenDetailsSubtree.name,
callback: _getChildrenDetailsSubtree,
registerExtension: registerExtension,
);
_registerObjectGroupServiceExtension(
name: WidgetInspectorServiceExtensions.getRootWidget.name,
callback: _getRootWidget,
registerExtension: registerExtension,
);
_registerObjectGroupServiceExtension(
name: WidgetInspectorServiceExtensions.getRootWidgetSummaryTree.name,
callback: _getRootWidgetSummaryTree,
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.getRootWidgetSummaryTreeWithPreviews.name,
callback: _getRootWidgetSummaryTreeWithPreviews,
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.getDetailsSubtree.name,
......@@ -1202,19 +1232,23 @@ mixin WidgetInspectorService {
),
};
},
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getSelectedWidget.name,
callback: _getSelectedWidget,
registerExtension: registerExtension,
);
_registerServiceExtensionWithArg(
name: WidgetInspectorServiceExtensions.getSelectedSummaryWidget.name,
callback: _getSelectedSummaryWidget,
registerExtension: registerExtension,
);
_registerSignalServiceExtension(
name: WidgetInspectorServiceExtensions.isWidgetCreationTracked.name,
callback: isWidgetCreationTracked,
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.screenshot.name,
......@@ -1242,22 +1276,27 @@ mixin WidgetInspectorService {
'result': base64.encoder.convert(Uint8List.view(byteData!.buffer)),
};
},
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.getLayoutExplorerNode.name,
callback: _getLayoutExplorerNode,
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.setFlexFit.name,
callback: _setFlexFit,
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.setFlexFactor.name,
callback: _setFlexFactor,
registerExtension: registerExtension,
);
registerServiceExtension(
name: WidgetInspectorServiceExtensions.setFlexProperties.name,
callback: _setFlexProperties,
registerExtension: registerExtension,
);
}
......
......@@ -47,6 +47,7 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService {
void registerServiceExtension({
required String name,
required ServiceExtensionCallback callback,
required RegisterServiceExtensionCallback registerExtension,
}) {
assert(!extensions.containsKey(name));
extensions[name] = callback;
......
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