Как сохранить скрипт расширения работающим после закрытия всплывающего окна? - PullRequest
0 голосов
/ 28 июня 2018

Допустим, я делаю дополнение / расширение для Firefox / Chrome. У меня есть всплывающее окно с одной кнопкой. Это выглядит так:

enter image description here

Когда кнопка нажата, я хочу, чтобы какая-то функция выполнялась, и я хочу, чтобы она продолжала выполняться даже после того, как всплывающее окно теряет фокус и исчезает.

Обычное поведение - закрывать всплывающее окно, как только оно теряет фокус. Поэтому, если я нажимаю кнопку, а затем сразу нажимаю что-то еще, всплывающее окно исчезает, и я получаю это сообщение в консоли:

Cannot send function call result: other side closed connection (calldata:
({path:"bookmarks.getTree", args:[]}))

Нет проверки ошибок или использования onbeforeunload работ.

Вот минимальный пример:

manifest.json

{
    "manifest_version": 2,
    "name": "delete bookmarks",
    "version": "0.1",
    "browser_action": {
        "default_popup": "popup.html"
    },
    "permissions": ["management", "bookmarks", "http://*/"],
    "background": {
        "scripts": ["doStuff.js"]
    },
    "content_scripts": [{
        "matches": ["<all_urls>"],
        "js": ["doStuff.js"]
    }]
}

popup.html

<!DOCTYPE html>
<html>
    <button id="doStuff">doStuff</button>
    <script src="doStuff.js"></script>
</html>

doStuff.js

var button = document.getElementById("doStuff");
button.addEventListener("click", function() {
  doStuff();
}, false); 

function doStuff(){
  chrome.bookmarks.getTree(deleteAllBookmarks);
}

function deleteAllBookmarks(result){  //JUST AN EXAMPLE!
 //delete/remove ALL bookmarks
  for(var i = 0 ; i < result[0].children.length; i ++){  //get children of root 
    var child = result[0].children[i];
    for(var j = 0 ; j < child.children.length; j++){  //get children of children of root 
      var childchild = child.children[j];
      console.log("deleting id " + childchild.id);
      chrome.bookmarks.removeTree(childchild.id, success);  //delete everything
    }
  }
}

function success(result){
  alert("Success");
}

Итак, я снова пытаюсь завершить выполнение кода javascript даже после закрытия родительской html-страницы. Кажется, что это должно быть легко, так как я загружаю скрипт как content_script, так и фоновый скрипт, но я не могу понять это, и нет подходящих SO сообщений. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 июня 2018

Вы должны обмен сообщениями хрома. При нажатии кнопки popup отправит сообщение на background, а background прослушает и что-то сделает.

Вы не можете сделать это, если просто используете popup page. И если вы хотите что-то сделать с active page, вам нужно создать слушателя на этой странице (добавить скрипт с content_scripts).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...