Viziionary Viziionary - 3 months ago 15
Javascript Question

Can the mechanism that loads the worker in Shared Web Workers be modified?

Please see this related question for a background to this:

How can I load a shared web worker with a user-script?

With that question in mind, I want to explore the possibility (in context of a user-script) of modifying the Shared Worker constructor so that the mechanism responsible for loading the web worker is replaced with the GM function

, which works like
XMLHttpRequest
while ignoring same origin policies.

To be clear, I'm writing a user script for Stack Overflow to help automate a certain process for myself and others, and I need to communicate between two open SO tabs, which can be done nicely with a Shared Web Worker, however if you'll look at the related question I cited, there are problems with that.

Can the mechanism that loads the worker in Shared Web Workers be modified? Does it use the page's native
XMLHttpRequest
or is it some internal function which we can't touch? If it can be modified, how can I access it in order to perform the modification?

Answer

What are you trying to achieve using SharedWorker?

to pass messages between pages from the same domain without having to set a constant interval to check if a local storage variable had changed.

You can use storage event to communicate messages between tabs at same origin

At index.html

<!DOCTYPE html>
<html>

  <head>
  </head>

  <body>
    <a href="b.html" target="_blank">open b.html</a>
    <textarea></textarea>
    <button>click</button>
    <script>
      var messages = [];
      var button = document.querySelector("button");
      var textarea = document.querySelector("textarea");
      window.addEventListener("storage", function(e) {
        console.log(e.newValue, JSON.parse(localStorage.getItem("messages")));

      });
      button.addEventListener("click", function() {
        messages.push(textarea.value);
        localStorage.setItem("messages", JSON.stringify(messages));
        localStorage.setItem("message", textarea.value);
        textarea.value = "";
      })
    </script>
    </body>
</html>

b.html

<!DOCTYPE html>
<html>

  <head>
  </head>

  <body>
    <textarea></textarea>
    <button>click</button>

    <script>
    var messages = JSON.parse(localStorage.getItem("messages"));
      window.addEventListener("storage", function(e) {
        console.log(e.newValue, JSON.parse(localStorage.getItem("messages")));
      });
      var button = document.querySelector("button");
      var textarea = document.querySelector("textarea");
      button.addEventListener("click", function() {
        messages.push(textarea.value);
        localStorage.setItem("message", textarea.value);
        localStorage.setItem("messages", JSON.stringify(messages));
        textarea.value = "";
      })
    </script>
    </body>
</html>

plnkr http://plnkr.co/edit/4nR7Rpu4zXSgTR831vQW?p=preview