anchor.diff:  
   /// Implemented by recorders that use [_RecordingWidgetsBinding] to receive
   /// frame life-cycle calls.
  -abstract class RecordingWidgetsBindingListener {
  -  /// The profile where the benchmark is collecting metrics.
  -  Profile profile;
  +abstract class FrameRecorder {
  +  /// Called by the recorder when it stops recording and doesn't need to collect
  +  /// any more data.
  +  set didStop(VoidCallback cb);
   
     /// Called just before calling [SchedulerBinding.handleDrawFrame].
     void frameWillDraw();
  
positive.code:     if (profile.shouldContinue()) {
        window.scheduleFrame();
      } else {
        _profileCompleter.complete(profile);
      }
    }
  
    @override
    void _onError(dynamic error, StackTrace stackTrace) {
      _profileCompleter.completeError(error, stackTrace);
    }
  
    @override
    Future<Profile> run() {
      profile = Profile(name: name);
      final _RecordingWidgetsBinding binding =
          _RecordingWidgetsBinding.ensureInitialized();
      final Widget widget = createWidget();
      binding._beginRecording(this, widget);
  
      _profileCompleter.future.whenComplete(() {
        profile = null;
      });
      return _profileCompleter.future;
    }
  }
  
  
negative.code: ///   }
  /// }
  /// ```
  abstract class WidgetRecorder extends Recorder implements FrameRecorder {
    WidgetRecorder({@required String name}) : super._(name);
  
    /// Creates a widget to be benchmarked.
  