2

this API에 해당합니까? 아니면 다시 시작하지 않는 확장 프로그램에서 호출하는 방법이 있습니까? 브라우저 세션간에 몇 개의 문자열을 저장해야합니다.재시작이 필요없는 파이어 폭스 확장을위한 간단한 저장소 API에 해당합니다.

나는 this을 찾았지만 단순한 문자열 저장에는 너무 복잡해 보입니다. SS API가 장면 뒤에서 똑같은 것을 사용합니까?

const { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); 
const { require } = devtools; 

let ss = require('sdk/simple-storage'); 
+0

단순 저장 API는 addon-sdk로 재시작없는 추가 기능을 개발할 때 잘 작동합니다. 예제를 사용해 보셨습니까? 그들은 실패하거나 당신에게 오류를 줄 수 있습니까? – Kapep

+0

그게 핵심입니다. addon-sdk를 사용하고 있지 않습니다. 나는 많은 외부 dll 함수로 작업하기 때문에'bootstrap.js'에서 네이티브 코드를 사용하고 있습니다. –

+0

곧 addon-sdk로 현재 확장을 옮기려고 노력할 것입니다.하지만 그때까지는 수정이 필요합니다. –

답변

2

당신은 정상은 재시작 확장에이 방법을 어떤 SDK 모듈을 가져올 수 있습니다. IndexedDB과 같은 대체물이 있습니다. can be used from chrome/add-on code 매우 쉽게.

당신은 또한 추가 기능 (SDK를 simple-storage API를 사용할 필요가 없습니다)에 localStorage를 사용할 수 있지만이 부가 기능 공유 할 것이기 때문에 오버레이에 window.localStorage를 사용해서는 안되며, bootstrap.jswindow.localStorage을 사용할 수 없습니다 및/또는 js 코드 모듈은 단순히 window이 아니기 때문에 가능합니다. 하지만 저장 개체를 직접 만들 수 있습니다.

function getStorage(uri) { 
    if (!(uri instanceof Ci.nsIURI)) { 
    uri = Services.io.newURI(uri, null, null); 
    } 
    let principal = Cc["@mozilla.org/scriptsecuritymanager;1"]. 
    getService(Ci.nsIScriptSecurityManager). 
    getNoAppCodebasePrincipal(uri); 
    let dsm = Cc["@mozilla.org/dom/localStorage-manager;1"]. 
    getService(Ci.nsIDOMStorageManager); 
    return dsm.createStorage(principal, ""); 
} 

var s1 = getStorage("chrome://my-addon/content/whatever.xul"); // does not actually have to point to a resource. 

일반적으로 localStorage의 제한 사항이 적용됩니다 (할당량 등).

동의어 :이 코드에서는 localStorage 개의 웹 사이트 (예 : getStorage("http://stackoverflow.com/");. (내선 이름, 예를 들어 앞에 추가 모든 키 이름)

const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); 
ss.setGlobalValue("my-extension-few-strings", "blah blah blah"); 
const fewStrings = ss.getGlobalValue("my-extension-few-strings"); 
// fewStrings === "blah blah blah"; 
ss.deleteGlobalValue("my-extension-few-strings"); 

세션 저장소가 모든 확장에서 공유되므로 저장된 값에 대한 고유 한 이름을 선택합니다

+0

빠른 응답을 보내 주셔서 감사합니다. –

+4

이것이 좋은 생각이 아닌가 ... 이것은'devtools'와이 해킹을 사용하는 다른 애드온간에 공유되는'simple-storage' 인스턴스를 제공합니다. 그래서 두 개의 다른 부가 기능이 같은 * key *를 가진 * 공유 *'devtools' 인스턴스를 사용한다면 ** boom **이 될 것입니다. 직접 적절한 SDK 로더를 만드는 것이 더 좋습니다. – nmaier

+0

우리가 말하는대로 작업하십시오. 그 동안 임시 수정이 필요했습니다. 부가 기능은 지금 개념 증명으로 사용됩니다. 많은 작업을 한 후에 만 ​​작동합니다. –

3

simple-storage/localStorage API를 때문에 동기 파일 I/O의 빨아 :

+0

감사합니다. 이것은 나를 위해 일을 정리했다. –

+0

''dsm.createStorage (principal, "")'첫 번째 매개 변수'dsm.createStorage (null, principal, ")'에'null'을 지정하기 전까지는 dsm.createStorage 아마 유용 할거야 ... 어쨌든, 고마워! – smnbbrv

1

당신은 Session store API (nsISessionStore) 사용할 수 있습니다. 또한 단순 저장 장치 및 localStorage와 달리 크기가 제한되지 않습니다.

p.s. setGlobalValue, getGlobalValue, deleteGlobalValue은 어디에도 없습니다.