简体   繁体   English

Firefox 扩展无法访问本地存储

[英]Firefox extension fails on accessing local storage

I have a Chrome extension I'm trying to adapt to FF.我有一个 Chrome 扩展程序,我正在尝试适应 FF。 When I try to access local storage, the code is failing.当我尝试访问本地存储时,代码失败。 There is no JS error in the console.控制台没有JS错误。 I am new to FF, so the problem is probably basic.我是 FF 的新手,所以问题可能是基本的。 Why is execution stopping on var gettingItem = browser.local.storage.get();为什么执行在var gettingItem = browser.local.storage.get();上停止var gettingItem = browser.local.storage.get();

Also, when I load my extension in FF, I don't see an options menu like I do in Chrome.此外,当我在 FF 中加载我的扩展程序时,我没有看到像在 Chrome 中那样的选项菜单。 How do I open the options pane?如何打开选项窗格?

My manifest:我的清单:

{
    "manifest_version": 2,
    "name": "My name's mod",
    "short_name": "Mod",
    "version": "1.2.0",
    "description": "Make the ",
    "web_accessible_resources": [
        "base-theme.css",
        "light-theme.css",
        "wider-theme.css",
        "nobg-theme.css"
    ],
    "permissions": [
        "storage",
        "cookies",
        "*://forums.site.com/*"
    ],
    "content_scripts": [{
        "js": [
            "cg-mod.js",
            "cg-forum-class.js",
            "cg-forum-writer.js",           
            "cg-onload.js"
        ],
        "matches": ["https://forums.site.com/*", "http://forums.site.com/*" ]
    }],
    "icons": { 
        "16": "icon16.png",
        "48": "icon48.png",
        "128": "icon128.png" },
    "options_ui": {
        "page": "options.html",
        "chrome_style": true
    }
}

This is the first file being called:这是第一个被调用的文件:

//https://stackoverflow.com/questions/2400935/browser-detection-in-javascript
function IsChrome(){
    var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    var isChrome = !!window.chrome && !isOpera;              // Chrome 1+
    return isChrome;
}

function IsFirefox()
{
    var isFirefox = typeof InstallTrigger !== 'undefined';   // Firefox 1.0+
    return isFirefox;
}

function GetStorage( callback ){    

    var defaultOptions = {
        Theme: 'wider',
        ShowSignatures: true,
        TheNewlyArrived: false,
        Kickstarter: false,
        Recruitment: false,
        Off: false
    };

    if( IsChrome() )
    {
        chrome.storage.sync.get( defaultOptions, function(items) {
            console.log( "Get Storage for Chrome");
            console.log( items );
            callback( items );
        }); 
    }else if( IsFirefox() ) {
        console.log("is firefox: "+ IsFirefox());
        //browser.storage.sync.get
        var gettingItem = browser.local.storage.get();
        console.log(gettingItem);
        console.log("THE PROBLEM IS HERE ^^");
/*      gettingItem.then((items) => {
            console.log( "Get Storage for Firefox");
            callback( items );
        }); */
    }
}

Then in my onload file, I have this:然后在我的 onload 文件中,我有这个:

/*
Run these commands on startup.
*/

// link the custom CSS as a stylesheet to give it higher priority
function Onload( storage )
{
    console.log( "storage: ");
    console.log( storage );

    // If off is true, they don't want to load the extension...
    if( storage.Off )
        return;

    var link = document.createElement('link');
    if( IsChrome() ){
        link.href = chrome.extension.getURL( 'base-theme.css' );        
    } else if( IsFirefox() ) {
        link.href = browser.extension.getURL( 'base-theme.css' );       
    }
    link.type = 'text/css';
    link.rel = 'stylesheet';
    document.getElementsByTagName("head")[0].appendChild(link);

    var link = document.createElement('link');
    if( IsChrome() ){
        link.href = chrome.extension.getURL( storage.Theme +'-theme.css');
    } else if( IsFirefox() ) {
        link.href = browser.extension.getURL( storage.Theme +'-theme.css');
    }
    link.type = 'text/css';
    link.rel = 'stylesheet';
    document.getElementsByTagName("head")[0].appendChild(link);

    if( ! storage.ShowSignatures )
        ForumWriter.ToggleVisibility( 'Signature' );
}

console.log("get storage pre");
// Call the Google values through a callback
GetStorage( Onload );   
console.log("get storage post"); 

The console reads:控制台显示:

Name says hello! (proves the files are loading in the right oder)
get storage pre  
is firefox: true

The problem comes from this line:问题来自这一行:

browser.local.storage.get()

You've mixed it up a bit, local is a property of storage, and storage a property of browser.您有点混淆了,本地是存储的属性,而存储是浏览器的属性。

browser.storage.local.get()

But looking at your chrome implementation, you seem to want to access the sync storage instead...但是看看你的 chrome 实现,你似乎想要访问同步存储......

browser.storage.sync.get()

Also.还。 I'd really like to point out that you are doubling your code base and that should be avoided, to ease future maintenance.我真的想指出您正在将代码库加倍,应该避免这种情况,以简化未来的维护。 I suggest you this snippet of code:我建议你使用这段代码:

var client;
if( IsChrome() ){
    client= chrome;        
} else if( IsFirefox() ) {
    client = browser;       
}

So then you can replace all the snippets that look like this那么你可以替换所有看起来像这样的片段

if( IsChrome() ){
    link.href = chrome.extension.getURL( 'base-theme.css' );        
} else if( IsFirefox() ) {
    link.href = browser.extension.getURL( 'base-theme.css' );       
}

With

link.href = client.extension.getURL( 'base-theme.css' );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM