anchor.diff:      _outputNode.scrollTop = _outputScrollSize.toScrollTop(scrollRatio);
     }
   
  +  // Callback invoked when the source text is scrolled.
  +  void _onSourceTextScroll(JsObject e, JsObject t) {
  +    if (_scrollEventSource == null) {
  +      _scrollEventSource = _sourceNode;
  +      _setOutputScrollRatio(_sourceScrollRatio);
  +      _scrollEventSource = null;
  +    }
  +  }
  +
  +  // Callback invoked when the output text is scrolled.
  +  void _onOutputScroll(Event e) {
  +    if (_scrollEventSource == null) {
  +      _scrollEventSource = _outputNode;
  +      _setSourceScrollRatio(_outputScrollRatio);
  +      _scrollEventSource = null;
  +    }
  +  }
  +
     // URL of the AsciiDoc API.
     static final String _ASCIIDOC_TO_HTML_URI = '/api/v1/asciidoc-to-html';
   
  
positive.code: 
    // Timer for executing _Update.
    Timer _updateTimer = null;
  }
  
  
  
negative.code:     _aceEditorSession.callMethod(
          'on', ['change', _onSourceTextChange]);
      _aceEditorSession.callMethod(
          'on', ['changeScrollTop', _onSourceTextScroll]);
      // Set focus on editor now.
      _aceEditor.callMethod('focus');
      // Register event handler for output.
      _outputNode.onScroll.listen(_onOutputScroll);
  
      // Construct node validator for output HTML.
      NodeValidatorBuilder builder = new NodeValidatorBuilder.common();
  