anchor.diff:  }
   
   
  -void pageActionOnClickedAction(JsObject tab) {
  +void _pageActionOnClickedAction(JsObject tab) {
     addToClipboardAsIpfsUrl(tab['url']);
   }
   
  -class WebRequestRedirect {
  +
  +class HostServerSettings {
  +  String get host => _host;
  +  int get port => _port;
     String _host = 'localhost';
     int _port = 8080;
   
  -  WebRequestRedirect(JsObject chromeWebRequest, JsObject chromeRuntime) {
  -    dartifyChromeEvent(chromeWebRequest, 'onBeforeRequest').callMethod('addListener', [
  -      _onBeforeRequestAction,
  -      new JsObject.jsify({
  -        'urls': ['http://gateway.ipfs.io/ipfs/*', 'http://gateway.ipfs.io/ipns/*']
  -      }),
  -      new JsObject.jsify(['blocking'])
  -    ]);
  +  Stream get changes => _changesController.stream;
   
  +  final _changesController = new StreamController();
  +
  +  HostServerSettings(JsObject chromeRuntime) {
       addListenerToChromeEvent(chromeRuntime, 'onMessage', _handleRuntimeMsg);
     }
   
     void _handleRuntimeMsg(JsObject msg, JsObject sender, JsFunction response) {
       if (msg['host'] != null) {
         _host = msg['host'] as String;
  +      _changesController.add(_host);
       } else if (msg['port'] != null) {
         _port = msg['port'] as int;
  +      _changesController.add(_port);
       } else if (msg['options'] != null && msg['options'] == 'hostServer') {
         response.apply([new JsObject.jsify({
           'host': _host,
  
positive.code: 
  
  void main() {
    addListenerToChromeEvent(_runtime, 'onInstalled', onInstalledAction);
  
    // A page action is the little icon that appears in the URL bar.
    addListenerToChromeEvent(_pageAction, 'onClicked', pageActionOnClickedAction);
  
    addContextMenu();
    new WebRequestRedirect(_webRequest, _runtime);
  }
  
  
  void addContextMenu() {
    var urlMatch = ["http://localhost:*/ipfs/*", "http://localhost:*/ipns/*"];
    var props = new JsObject.jsify({
      'contexts': ['link'],
  
      // This should match the default_title under page_action in the manifest
      'title': 'Copy as IPFS link',
  
      'documentUrlPatterns': urlMatch,
      'targetUrlPatterns': urlMatch,
      'onclick': (JsObject info, JsObject tab) {
        addToClipboardAsIpfsUrl(info['linkUrl']);
      }
    });
    _contextMenus.callMethod('create', [props]);
  }
  
  
  
negative.code: library ipfs_interceptor;
  
  import 'dart:async';
  import 'dart:html';
  import 'dart:js';
  
  