

FirefoxのWebExtensionsでgetBackgroundPageを使ってbackground
script上の関数を呼び出そうとすると、`Error: Permission denied to access property
"f1"`というエラーが発生します

下記の例ではブラウザのポップアップにあるcheckboxがtrueの時だけ、10秒ごとにデータを取得しています。

何故、このようなエラーが起こるのでしょうか?

### Edit: 最小限の・自己完結した・確認可能なサンプルコードに変更

* * *

### Edit 2:

chrome54ではgetBackgroundPageを使って関数がうまく実行できているようです  
もしかしてFirefoxのバグなのでしょうか?

* * *

background-page.js:

[code]

    
    
    function f1() {
        fetch("http://example.something.com/example").then((res) => {
            res.text().then((text) => console.log(text));
        });
    }
    
    function loop() {
        f1();
        if (getStorageValue("checked")) {
            setTimeout(loop, 10000); // setTimeoutを使って10秒ごとにデータを取得
        }
    }
    
    function getStorageValue(key) {
        let retVal;
        chrome.storage.local.get(key, (result) => {
            retVal = result[key];
        });
        return retVal;
    }
    
    loop();
    
    
[/code]

browser_action.js

[code]

    let bgpage = chrome.extension.getBackgroundPage();
    let checkbox = document.getElementById("checkbox"); // checkboxを取得
    let status = document.getElementById("status");
    chrome.storage.local.get("checked", (result) => {
        checkbox.checked = result.checked || true; // storageに格納したcheckboxの値を反映させる
    });
    
    
    checkbox.onchange = (e) => {
        chrome.storage.local.set({"checked": checkbox.checked}); // checkboxの状態をstorageに格納
        if (checkbox.checked) {
                status.textContent = "ON";
                bgpage.loop(); // Error: Permission denied to access property "f1"
        }
        else {
            status.textContent = "OFF";
        }
    }
    
[/code]

default_popup.html:

[code]

    
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
        </head>
        <body>
            <label class="switch">
                <span id="status">OFF</span>
                <input id="check" type="checkbox">
            </label>
            <script src="browser_action.js"></script>
        </body>
    </html>
    
    
[/code]

manifest.json:

[code]

    
    {
        "manifest_version": 2,
        "version": "1.0",
        "name": "My Extension",
    
        "background": {
            "scripts": ["background-page.js"]
        },
    
        "permissions": [
            "*://example.something.com/example/*",
            "webRequest",
            "alarms",
            "notifications",
            "storage"
        ],
    
        "browser_action": {
            "default_icon": {
                "19": "icons/icon-19.png",
                "38": "icons/icon-38.png"
            },
            "default_title": "my popup",
            "default_popup": "popup/default_popup.html"
        }
    }
    
    
    
[/code]


CC BY-SA 3.0
2016-10-08T11:01:10.033
29431
2016-10-27T14:36:01.680
2016-10-27T14:36:01.680
5246
5246
question
javascript firefox firefox-webextension
WebExtensionsのgetBackgroundPageでバックグラウンドの関数を呼び出せない


以下のコードで手元では問題が再現しませんでした。  
（`background`の関数を`popup`から直接呼ぶというやり方が正しいものなのかは解りませんが）  
[最小限の・自己完結した・確認可能なサンプルコードの書き方](https://ja.stackoverflow.com/help/mcve)
を参考に、質問に再現可能なコードを載せて下さい。

popup.html

[code]

    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
    * { color: white; background-color: gray; }
        </style>
    </head>
    <body>
        <h1>Try Firefox WebExtension</h1>
        <p id="message_elm"></p>
        <script src="popup.js"></script>
    </body>
    </html>
    
[/code]

popup.js

[code]

    chrome.runtime.getBackgroundPage((bg_win) => {
        console.log("bg_win.url:", bg_win.url);
        bg_win.fetch_page(message_elm);
    });
    
[/code]

background.js

[code]

    var url = "http://example.com/";
    function fetch_page(elm){
        fetch(url).then(res => res.text()).then(text=>elm.textContent = text);
    }
    
[/code]

manifest.json

[code]

    {
    
        "manifest_version": 2,
        "name": "Try_ex",
        "version": "1.0",
    
        "description": "Try Firefox WebExtension",
    
        "icons": {
            "48": "icon_48.png"
        },
    
        "background": {
            "scripts": ["background.js"]
        },
    
        "browser_action":{
            "default_icon": {
                "48": "icon_48.png"
            },
            "default_title": "Try Firefox WebExtension",
                "default_popup": "popup.html"
        },
    
        "permissions": ["*://example.com/*"]
    }
    
[/code]


CC BY-SA 3.0
2016-10-23T01:45:42.913
29822
2016-10-23T01:45:42.913
2017-04-13T12:52:39.113
-1
3054
29431
answer