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 GM_xmlhttpRequest
, 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?
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>