anchor.diff:      // Merge the results of both streams.
       var mergedLayoutStream =
           _mergeStreams([popupContentsLayoutStream, popupSourceLayoutStream]);
  -    _layoutChangeSub = mergedLayoutStream.listen((layoutRects) {
  +    _visibleDisposer
  +        .addStreamSubscription(mergedLayoutStream.listen((layoutRects) {
         // Ignore partial results.
         if (layoutRects.every((r) => r != null)) {
           if (!initialData.isCompleted) {
  
positive.code:       throw StateError('Cannot open popup: no source set.');
      }
  
      // Initialize the minimum/maximum size and content size based on the
      // viewport size before popup position is populated.
      _updatePopupMinMaxSize();
  
      // Put the overlay in the live DOM so we can measure its size.
      _overlayRef.state.visibility = visibility.Visibility.Hidden;
  
negative.code:   final ChangeDetectorRef _changeDetector;
    final ViewContainerRef _viewContainer;
    final Disposer _disposer = Disposer.oneShot();
    final Disposer _visibleDisposer = Disposer.multi();
    final NgZone _ngZone;
    final OverlayService _overlayService;
    final DomService _domService;
  