anchor.diff:  }
   
   
  -void onInstalledAction(JsObject details) {
  +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]);
  +}
  +
  +
  +void _setupPageStateMatcher(HostServerSettings settings) {
     var pageStateMatcherArg = new JsObject.jsify({
       'pageUrl': {
         // Chrome has globbing available everywhere but here
  -      'originAndPathMatches': '^http://localhost(:[[:digit:]]+)?\\/(ipfs|ipns)\\/.+',
  +      // Also note that for ports 80 and 443 the port numbers won't be present
  +      'originAndPathMatches': '^http://${settings.host}(:${settings.port})?\\/(ipfs|ipns)\\/.+',
         'schemes': ['http']
     }});
     var rules = new JsObject.jsify([{
  
positive.code: 
      print('$_host:$_port');
    }
  
    JsObject _onBeforeRequestAction(JsObject data) {
      var ipfsUrl = data['url'];
      var localhostUrl = Uri.parse(ipfsUrl).replace(host: _host, port: _port);
      var response = {
        'redirectUrl': localhostUrl.toString()
      };
  
negative.code: library ipfs_interceptor;
  
  import 'dart:async';
  import 'dart:html';
  import 'dart:js';
  
  