From d482163f59c49c32cb329beb2c3111c8e961d6b9 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Thu, 23 Apr 2020 11:57:18 -0700 Subject: [PATCH] Revert "Fix FlutterError.onError in debug mode (#53843)" (#55484) This reverts commit d35671c6d10b2aa7cf7f8e5c022fd8eea902cf44. --- .../lib/src/foundation/assertions.dart | 15 +-- .../lib/src/widgets/widget_inspector.dart | 6 +- .../flutter/test/material/scaffold_test.dart | 2 +- packages/flutter/test/widgets/image_test.dart | 2 - ...widget_inspector_structure_error_test.dart | 91 ------------------- .../test/widgets/widget_inspector_test.dart | 4 +- packages/flutter_test/lib/src/binding.dart | 6 +- 7 files changed, 11 insertions(+), 115 deletions(-) delete mode 100644 packages/flutter/test/widgets/widget_inspector_structure_error_test.dart diff --git a/packages/flutter/lib/src/foundation/assertions.dart b/packages/flutter/lib/src/foundation/assertions.dart index ab2d13e4d72..cf7b0707234 100644 --- a/packages/flutter/lib/src/foundation/assertions.dart +++ b/packages/flutter/lib/src/foundation/assertions.dart @@ -715,7 +715,7 @@ class FlutterError extends Error with DiagnosticableTreeMixin implements Asserti /// Called whenever the Flutter framework catches an error. /// - /// The default behavior is to call [presentError]. + /// The default behavior is to call [dumpErrorToConsole]. /// /// You can set this to your own function to override this default behavior. /// For example, you could report all errors to your server. @@ -725,18 +725,7 @@ class FlutterError extends Error with DiagnosticableTreeMixin implements Asserti /// /// Set this to null to silently catch and ignore errors. This is not /// recommended. - static FlutterExceptionHandler onError = (FlutterErrorDetails details) => presentError(details); - - /// Called whenever the Flutter framework wants to present an error to the - /// users. - /// - /// The default behavior is to call [dumpErrorToConsole]. - /// - /// Plugins can override how an error is to be presented to the user. For - /// example, the structured errors service extension sets its own method when - /// the extension is enabled. If you want to change how Flutter responds to an - /// error, use [onError] instead. - static FlutterExceptionHandler presentError = dumpErrorToConsole; + static FlutterExceptionHandler onError = dumpErrorToConsole; static int _errorCount = 0; diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart index 361ff1e4856..3e17698d0e2 100644 --- a/packages/flutter/lib/src/widgets/widget_inspector.dart +++ b/packages/flutter/lib/src/widgets/widget_inspector.dart @@ -959,13 +959,13 @@ mixin WidgetInspectorService { SchedulerBinding.instance.addPersistentFrameCallback(_onFrameStart); final FlutterExceptionHandler structuredExceptionHandler = _reportError; - final FlutterExceptionHandler defaultExceptionHandler = FlutterError.presentError; + final FlutterExceptionHandler defaultExceptionHandler = FlutterError.onError; _registerBoolServiceExtension( name: 'structuredErrors', - getter: () async => FlutterError.presentError == structuredExceptionHandler, + getter: () async => FlutterError.onError == structuredExceptionHandler, setter: (bool value) { - FlutterError.presentError = value ? structuredExceptionHandler : defaultExceptionHandler; + FlutterError.onError = value ? structuredExceptionHandler : defaultExceptionHandler; return Future.value(); }, ); diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart index 4e1dbb3fdc4..afcaebef258 100644 --- a/packages/flutter/test/material/scaffold_test.dart +++ b/packages/flutter/test/material/scaffold_test.dart @@ -1840,7 +1840,7 @@ void main() { final GlobalKey key = GlobalKey(); const Key buttonKey = Key('button'); final List errors = []; - FlutterError.presentError = (FlutterErrorDetails error) => errors.add(error); + FlutterError.onError = (FlutterErrorDetails error) => errors.add(error); int state = 0; await tester.pumpWidget( MaterialApp( diff --git a/packages/flutter/test/widgets/image_test.dart b/packages/flutter/test/widgets/image_test.dart index d4a98e24b6f..bea9a12d7d5 100644 --- a/packages/flutter/test/widgets/image_test.dart +++ b/packages/flutter/test/widgets/image_test.dart @@ -528,7 +528,6 @@ void main() { final ImageListener listener = (ImageInfo info, bool synchronous) { capturedImage = info; }; - final FlutterExceptionHandler oldHandler = FlutterError.onError; FlutterError.onError = (FlutterErrorDetails flutterError) { reportedException = flutterError.exception; reportedStackTrace = flutterError.stack; @@ -565,7 +564,6 @@ void main() { // The image stream error handler should have the original exception. expect(capturedException, testException); expect(capturedStackTrace, testStack); - FlutterError.onError = oldHandler; }); testWidgets('Duplicate listener registration does not affect error listeners', (WidgetTester tester) async { diff --git a/packages/flutter/test/widgets/widget_inspector_structure_error_test.dart b/packages/flutter/test/widgets/widget_inspector_structure_error_test.dart deleted file mode 100644 index c87746d3bcf..00000000000 --- a/packages/flutter/test/widgets/widget_inspector_structure_error_test.dart +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:convert'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/rendering.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - StructureErrorTestWidgetInspectorService.runTests(); -} - -typedef InspectorServiceExtensionCallback = FutureOr> Function(Map parameters); - -class StructureErrorTestWidgetInspectorService extends Object with WidgetInspectorService { - final Map extensions = {}; - - final Map>> eventsDispatched = >>{}; - - @override - void registerServiceExtension({ - @required String name, - @required FutureOr> callback(Map parameters), - }) { - assert(!extensions.containsKey(name)); - extensions[name] = callback; - } - - @override - void postEvent(String eventKind, Map eventData) { - getEventsDispatched(eventKind).add(eventData); - } - - List> getEventsDispatched(String eventKind) { - return eventsDispatched.putIfAbsent(eventKind, () => >[]); - } - - Iterable> getServiceExtensionStateChangedEvents(String extensionName) { - return getEventsDispatched('Flutter.ServiceExtensionStateChanged') - .where((Map event) => event['extension'] == extensionName); - } - - Future testBoolExtension(String name, Map arguments) async { - expect(extensions, contains(name)); - // Encode and decode to JSON to match behavior using a real service - // extension where only JSON is allowed. - return json.decode(json.encode(await extensions[name](arguments)))['enabled'] as String; - } - - - static void runTests() { - final StructureErrorTestWidgetInspectorService service = StructureErrorTestWidgetInspectorService(); - WidgetInspectorService.instance = service; - - test('ext.flutter.inspector.structuredErrors still report error to original on error', () async { - final FlutterExceptionHandler oldHandler = FlutterError.onError; - - FlutterErrorDetails actualError; - // Creates a spy onError. This spy needs to be set before widgets binding - // initializes. - FlutterError.onError = (FlutterErrorDetails details) { - actualError = details; - }; - - WidgetsFlutterBinding.ensureInitialized(); - try { - // Enables structured errors. - expect(await service.testBoolExtension( - 'structuredErrors', {'enabled': 'true'}), - equals('true')); - - // Creates an error. - final FlutterErrorDetails expectedError = FlutterErrorDetailsForRendering( - library: 'rendering library', - context: ErrorDescription('during layout'), - exception: StackTrace.current, - ); - FlutterError.reportError(expectedError); - - // Validates the spy still received an error. - expect(actualError, expectedError); - } finally { - FlutterError.onError = oldHandler; - } - }); - } -} \ No newline at end of file diff --git a/packages/flutter/test/widgets/widget_inspector_test.dart b/packages/flutter/test/widgets/widget_inspector_test.dart index 04b52814b9c..a0b5b5cd2b9 100644 --- a/packages/flutter/test/widgets/widget_inspector_test.dart +++ b/packages/flutter/test/widgets/widget_inspector_test.dart @@ -2280,7 +2280,7 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { List> flutterErrorEvents = service.getEventsDispatched('Flutter.Error'); expect(flutterErrorEvents, isEmpty); - final FlutterExceptionHandler oldHandler = FlutterError.presentError; + final FlutterExceptionHandler oldHandler = FlutterError.onError; try { // Enable structured errors. @@ -2337,7 +2337,7 @@ class TestWidgetInspectorService extends Object with WidgetInspectorService { error = flutterErrorEvents.last; expect(error['errorsSinceReload'], 0); } finally { - FlutterError.presentError = oldHandler; + FlutterError.onError = oldHandler; } }); diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index d1d4ecba436..4e217ffda22 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -572,9 +572,9 @@ abstract class TestWidgetsFlutterBinding extends BindingBase }) { assert(description != null); assert(inTest); - _oldExceptionHandler = FlutterError.presentError; + _oldExceptionHandler = FlutterError.onError; int _exceptionCount = 0; // number of un-taken exceptions - FlutterError.presentError = (FlutterErrorDetails details) { + FlutterError.onError = (FlutterErrorDetails details) { if (_pendingExceptionDetails != null) { debugPrint = debugPrintOverride; // just in case the test overrides it -- otherwise we won't see the errors! if (_exceptionCount == 0) { @@ -800,7 +800,7 @@ abstract class TestWidgetsFlutterBinding extends BindingBase /// Called by the [testWidgets] function after a test is executed. void postTest() { assert(inTest); - FlutterError.presentError = _oldExceptionHandler; + FlutterError.onError = _oldExceptionHandler; _pendingExceptionDetails = null; _parentZone = null; buildOwner.focusManager = FocusManager();