anchor.diff:        _setErrorListener();
         _errorMode = false;
       });
  +
  +    new Timer.periodic(_CACHE_DURATION * 10, (_) {
  +      var keysToRemove = [];
  +      var oldestCacheTime = new DateTime.now().subtract(_CACHE_DURATION);
  +      _domainCache.forEach((k, v) {
  +        if (v.cacheTime.isBefore(oldestCacheTime)) {
  +          keysToRemove.add(k);
  +        }
  +      });
  +      keysToRemove.forEach((k) => _domainCache.remove(k));
  +    });
  +  }
  +
  +  void _disableErrorMode() {
  +    _errorMode = false;
  +    _generateRequestUrls();
  +    _setRequestListener();
  +  }
  +
  +  void _enableErrorMode() {
  +    _errorMode = true;
  +    _lastErrorTime = new DateTime.now();
  +    _generateRequestUrls();
  +    _setRequestListener();
     }
   
     void _generateRequestUrls() {
  
positive.code:    * that it be FAST!
     */
    JsObject _onBeforeRequestAction(JsObject data) {
      Uri url;
      try {
        url = Uri.parse(data['url']);
  
negative.code:   }
    
    void _setRequestListener() {
      var urlsToListen = ['http://*/', 'https://*/'];
      urlsToListen.addAll(makeIpfsGlobs('file://'));
  
      dartifyChromeEvent(chromeWebRequest, 'onBeforeRequest')
          .callMethod('removeListener', [_onBeforeRequestAction]);
      dartifyChromeEvent(chromeWebRequest, 'onBeforeRequest')
          .callMethod('addListener', [
            _onBeforeRequestAction,
            new JsObject.jsify({'urls': urlsToListen}),
            new JsObject.jsify(['blocking'])
      ]);
    }
  