Firefox addon 从缓存中查找并删除文件

Firefox addon 从缓存中查找并删除文件,firefox-addon,Firefox Addon,我有一个css应用背景图像:path/to/desktop/build1.png 因此,桌面上的build1.png将成为背景图像。但是,在我的插件中,在我动态删除build1.png并用另一个我重命名为build1.png的图像替换它之后,背景图像不会更新。我尝试了ctrl+f5,但没有成功。所以我在想,在动态替换桌面上的图像后,我应该将其从缓存中删除 测试用例,使用环境浏览器将粘贴复制到scratchpad并点击run,它将打开一个新选项卡,其中包含测试用例的gui。点击Release Im

我有一个css应用背景图像:path/to/desktop/build1.png

因此,桌面上的build1.png将成为背景图像。但是,在我的插件中,在我动态删除build1.png并用另一个我重命名为build1.png的图像替换它之后,背景图像不会更新。我尝试了ctrl+f5,但没有成功。所以我在想,在动态替换桌面上的图像后,我应该将其从缓存中删除

测试用例,使用环境浏览器将粘贴复制到scratchpad并点击run,它将打开一个新选项卡,其中包含测试用例的gui。点击Release Img,然后点击applyCss,然后点击Aurora Img,观察div的背景是如何保持不变的

以下是该测试用例的youtube视频演示:


奇怪的我卸载并重新安装插件或重新启动浏览器,它似乎反映了更改后的图像。但是,如果我按F5或Ctrl+F5键,它将不会更新。如果文件:资源被缓存在磁盘存储中,这将是一个惊喜和严重的性能损失。我发现有趣的是,它们看起来也不是内存缓存。谢谢你的评论,我今天将为此编写一个测试用例:我真的很好奇,你能确认文件:资源没有缓存在内存中吗?检查关于:缓存查看是否要从缓存中删除该项
var tab = gBrowser.loadOneTab('data:text/html,<div class="profilist-icon-build-1">backround of this span is of icon on desktop</div><input type="button" value="applyCss"><input type="button" value="removeCss"> Change File on Desktop to: <input type="button" value="Release Img"><input type="button" value="Beta Img"><input type="button" value="Aurora Img"><input type="button" value="Nightly Img">', {inBackground:false});
//start - listen for loadOneTab to finish loading per https://gist.github.com/Noitidart/0f076070bc77abd5e406
var mobs = new window.MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {          
    if (mutation.attributeName == 'progress' && tab.getAttribute('progress') == '') {
      //alert('tab done loading');
      init();
      mobs.disconnect();
    }

  });
});
mobs.observe(tab, {attributes: true});
//end - listen for loadOneTab to finish loading per https://gist.github.com/Noitidart/0f076070bc77abd5e406
function init() {
  //run on load of the loadOneTab
  var win = tab.linkedBrowser.contentWindow;
  var doc = win.document;

  var btns = doc.querySelectorAll('input[type=button]');
  Array.prototype.forEach.call(btns, function(b) {
    b.addEventListener('click', handleBtnClick, false);
  });

}

Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/osfile.jsm');
var sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService);
var cssBuildIconsStr = '.profilist-icon-build-1 { background-image: url("' + OS.Path.toFileURI(OS.Path.join(OS.Constants.Path.desktopDir, 'build1.png')) + '"); ';
var newURIParam = {
  aURL: 'data:text/css,' + encodeURIComponent(cssBuildIconsStr),
  aOriginCharset: null,
  aBaseURI: null
};
var cssBuildIconsURI = Services.io.newURI(newURIParam.aURL, newURIParam.aOriginCharset, newURIParam.aBaseURI);

function handleBtnClick(e) {
  var targ = e.target;
  var doc = e.target.ownerDocument;
  var win = doc.defaultView;
  switch(targ.value) {
    case 'applyCss':
      if (sss.sheetRegistered(cssBuildIconsURI, sss.AUTHOR_SHEET)) {
        win.alert('ERROR: Sheet is already registered! Will not re-register...');
      } else {
       sss.loadAndRegisterSheet(cssBuildIconsURI, sss.AUTHOR_SHEET);
       win.alert('REGISTERED')
      }
      break;
    case 'removeCss':
      if (sss.sheetRegistered(cssBuildIconsURI, sss.AUTHOR_SHEET)) {
        sss.unregisterSheet(cssBuildIconsURI, sss.AUTHOR_SHEET);
        win.alert('UNregged');
      } else {
        win.alert('ERROR: Sheet is not registered! Nothing to unregister...');
      }
      break;
    case 'Release Img':
      xhr('https://raw.githubusercontent.com/Noitidart/Profilist/%2321/bullet_release.png', function(d){saveToDiskAsBuild1(d, win)});
      break;
    case 'Beta Img':
      xhr('https://raw.githubusercontent.com/Noitidart/Profilist/%2321/bullet_beta.png', function(d){saveToDiskAsBuild1(d, win)});
      break;
    case 'Aurora Img':
      xhr('https://raw.githubusercontent.com/Noitidart/Profilist/%2321/bullet_aurora.png', function(d){saveToDiskAsBuild1(d, win)});
      break;
    case 'Nightly Img':
      xhr('https://raw.githubusercontent.com/Noitidart/Profilist/%2321/bullet_nightly.png', function(d){saveToDiskAsBuild1(d, win)});
      break;
    default:
      win.alert('unknown button clicked, value = "' + targ.value + '"');
  }
}

function xhr(url, cb) {
    let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);

    let handler = ev => {
        evf(m => xhr.removeEventListener(m, handler, !1));
        switch (ev.type) {
            case 'load':
                if (xhr.status == 200) {
                    cb(xhr.response);
                    break;
                }
            default:
                Services.prompt.alert(null, 'XHR Error', 'Error Fetching Package: ' + xhr.statusText + ' [' + ev.type + ':' + xhr.status + ']');
                break;
        }
    };

    let evf = f => ['load', 'error', 'abort'].forEach(f);
    evf(m => xhr.addEventListener(m, handler, false));

    xhr.mozBackgroundRequest = true;
    xhr.open('GET', url, true);
    xhr.channel.loadFlags |= Ci.nsIRequest.LOAD_ANONYMOUS | Ci.nsIRequest.LOAD_BYPASS_CACHE | Ci.nsIRequest.INHIBIT_PERSISTENT_CACHING;
    xhr.responseType = "arraybuffer"; //dont set it, so it returns string, you dont want arraybuffer. you only want this if your url is to a zip file or some file you want to download and make a nsIArrayBufferInputStream out of it or something
    xhr.send(null);
}

function saveToDiskAsBuild1(data, win) {
          var file = OS.Path.join(OS.Constants.Path.desktopDir, 'build1.png');
          var promised = OS.File.writeAtomic(file, new Uint8Array(data));
          promised.then(
              function() {
                  win.alert('succesfully saved image to desktop')
              },
              function(ex) {
                   win.alert('FAILED in saving image to desktop')
              }
          );
}