Skip to content
This repository has been archived by the owner on Oct 10, 2019. It is now read-only.

Commit

Permalink
Converted background process
Browse files Browse the repository at this point in the history
It still doesn't work, but at least preferences are saved, loaded, read
and the background is almost complete. Check issues page for a to-do
list in the background process.
  • Loading branch information
An-dz committed Oct 24, 2014
1 parent b6d879d commit c5acb1c
Show file tree
Hide file tree
Showing 6 changed files with 248 additions and 347 deletions.
1 change: 1 addition & 0 deletions _locales/en/messages.json
@@ -0,0 +1 @@
{}
156 changes: 69 additions & 87 deletions lib/background.js
Expand Up @@ -24,7 +24,7 @@ var /**
* ID.firstplay (Boolean) - true if video is never played
* ID.focused (Boolean) - true if tab is currently focused
* ID.playing (Boolean) - true if video is playing
* ID.source (WindowProxy) - reference to tab (for sending messages)
* ID.source (Integer) - reference to tab (for sending messages)
* ID.origin (String) - URI of page
* ID.title (String) - title of the video
*/
Expand Down Expand Up @@ -57,9 +57,8 @@ function pageLoaded(event) {

// Check if this is first run.
if (pref.getPref("firstrun") === null) {
extension.tabs.create({
url: extensionAddress + "/share/page/firstrun.html",
focused: true
chrome.tabs.create({
url: "/share/page/firstrun.html"
})

log.info('Extension is run for the first time. Recommended preferences will be loaded.')
Expand All @@ -70,24 +69,23 @@ function pageLoaded(event) {
}
// Check if extension is updated.
else if (String.natcmp(pref.getItem("version"), extVersion) < 0) {
extension.tabs.create({
url: extensionAddress + "/share/page/update.html#old=" + pref.getItem("version"),
focused: true
chrome.tabs.create({
url: "/share/page/update.html#old=" + pref.getItem("version")
})

log.info('Extension is updated from version', pref.getItem("version"), 'to', extVersion, '.')

pref.setPref("version", extVersion)
}

extension.addEventListener("connect", connected, false)
extension.addEventListener("disconnect", disconnected, false)
extension.addEventListener("message", messageReceived, false)
// extension.addEventListener("connect", connected, false)
// extension.addEventListener("disconnect", disconnected, false)
chrome.runtime.onMessage.addListener(messageReceived)
window.addEventListener("storage", storageChanged, false)

log.Info('Background process started.')

extension.broadcastMessage({ subject: "background process started" })
chrome.runtime.sendMessage({ subject: "background process started" })

checkForUpdate()
}
Expand All @@ -101,11 +99,10 @@ function checkPreferences() {
catch (error) {
var message = "Widget storage area is disabled.\n"
+ "Widget storage is needed to store preferences.",
url = extensionAddress + "/share/page/error.html#"
url = "/share/page/error.html#"

extension.tabs.create({
url: url + window.encodeURIComponent(message),
focused: true
chrome.tabs.create({
url: url + window.encodeURIComponent(message)
})

log.error('Widget storage area is disabled. Error message: ' + error.message + '.')
Expand All @@ -120,18 +117,18 @@ function checkPreferences() {
}

// Run when connection with script(s) is established.
function connected(event) {
if (event.origin == extensionAddress + "/share/page/log.html")
logViewer = event.source
function connected(sender) {
if (sender.tab.url == extensionAddress + "/share/page/log.html")
logViewer = sender.tab.id
}

// Run when connection with script(s) is lost.
function disconnected(event) {
if (event.origin == extensionAddress + "/share/page/popup.html")
extension.broadcastMessage({ subject: "popup closed" })
else if (event.origin == extensionAddress + "/share/page/log.html")
if (sender.tab.url == extensionAddress + "/share/page/popup.html")
chrome.runtime.sendMessage({ subject: "popup closed" })
else if (sender.tab.url == extensionAddress + "/share/page/log.html")
logViewer = null
else if (/^widget.+index\.html$|\.youtube\.com/.test(event.origin))
else if (/^widget.+index\.html$|\.youtube\.com/.test(sender.tab.url))
removeTab(event)
}

Expand Down Expand Up @@ -188,7 +185,7 @@ function storageChanged(event) {
}

message.data[event.key] = pref.getPref(event.key)
extension.broadcastMessage(message)
chrome.runtime.sendMessage(message)

log.info('Some preferences are changed. Changes are dispatched to injected scripts.')
}
Expand All @@ -211,16 +208,16 @@ function needed(key) {
return key.indexOf("QuotaTest") < 0
}

// Inbox (with spam filter :)).
function messageReceived(event) {
var data = event.data.data,
subject = event.data.subject
// Inbox (with spam filter :D).
function messageReceived(message, sender) {
var data = message.data,
subject = message.subject

// Spam filter.
switch (subject) {
// New window is ready to receive messages.
case "hello":
log.info('Got greetings from ' + event.origin + '.')
log.info('Got greetings from ' + sender.tab.url + '.')

var play = true
if (pref.getPref("preventcrossplay")) {
Expand All @@ -233,33 +230,33 @@ function messageReceived(event) {
}
}

sendMessage(event, {
sendMessage(sender.tab.id, {
subject: "auto play",
data: {
autoplay: play
}
})

log.info('Autoplay option is sent to injected script on ' + event.origin + '.',
log.info('Autoplay option is sent to injected script on ' + sender.tab.url + '.',
'Autoplay is “' + play + '“.')
break
case "add tab":
log.info('Received request to add video to list.',
'From ' + event.origin + '.')
addTab(event)
'From ' + sender.tab.url + '.')
addTab(message, sender)
break
case "remove tab":
log.info('Received request to remove video from list.',
'From ' + event.origin + '.')
removeTab(event)
'From ' + sender.tab.url + '.')
removeTab(sender)
break
case "player ready":
sendMessage(event, event.data)
sendMessage(sender.tab.id, message)

if (!data.id || !video[data.id]) {
log.warn('Got “player ready” message but video is not in list! Asking for video info.',
'From ' + event.origin + '.')
sendMessage(event, { subject: "give me info" })
'From ' + sender.tab.url + '.')
sendMessage(sender.tab.id, { subject: "give me info" })
}
else
log.info('Player on page ' + data.id + ' is ready to play video.')
Expand All @@ -268,15 +265,15 @@ function messageReceived(event) {
if (!data.id) {
log.warn('Player changed state but video ID is missing! Asking for ID.',
'New state: ' + data.state + '.',
'From ' + event.origin + '.')
sendMessage(event, { subject: "give me info" })
'From ' + sender.tab.url + '.')
sendMessage(sender.tab.id, { subject: "give me info" })
break
}
else if (!video[data.id]) {
log.warn('Player changed state but video is not in list! Asking for video info.',
'New state:' + data.state + '.',
'From ' + event.origin + '.')
sendMessage(event, { subject: "give me info" })
'From ' + sender.tab.url + '.')
sendMessage(sender.tab.id, { subject: "give me info" })
break
}

Expand All @@ -286,7 +283,7 @@ function messageReceived(event) {
case 0:
video[data.id].playing = false
if (pref.getPref("loop")) {
sendMessage(event, {
sendMessage(sender.tab.id, {
subject: "player action",
data: {
exec: "play"
Expand Down Expand Up @@ -335,18 +332,16 @@ function messageReceived(event) {
fireStorageEvent("enablecustomstyle", oldValue)
break
case "load external resource":
loadExternalResource(event.data, event.source)
loadExternalResource(message, sender.tab.id)
break
case "show preferences":
extension.tabs.create({
url: extensionAddress + "/options.html#preferences",
focused: true
chrome.tabs.create({
url: "/options.html#preferences"
})
break
case "show bug report window":
extension.tabs.create({
url: extensionAddress + "/share/page/bug-report.html",
focused: true
chrome.tabs.create({
url: "/share/page/bug-report.html"
})
break
case "tab focused":
Expand All @@ -356,7 +351,7 @@ function messageReceived(event) {

log.warn('Tab is focussed but video ID is missing or video is not in video list!',
'Asking for video info.')
sendMessage(event, { subject: "give me info" })
sendMessage(sender.tab.id, { subject: "give me info" })
break
}
else
Expand All @@ -377,7 +372,7 @@ function messageReceived(event) {
}

if (play) {
sendMessage(event, {
sendMessage(sender.tab.id, {
subject: "player action",
data: {
exec: "play"
Expand All @@ -396,33 +391,30 @@ function messageReceived(event) {
break
case "echo replay":
if (ping[data.id]) {
video[data.id].source = event.source
video[data.id].source = sender.tab.id
reScheduleReplayCheck(data.id)
}
else {
log.warn('Received echo replay from unknown page.',
'ID: ' + data.id + '.',
'Asking for video info.')
sendMessage(event, { subject: "give me info" })
sendMessage(sender.tab.id, { subject: "give me info" })
}
break
case "here is message log":
if (logViewer)
logViewer.postMessage(event.data, [event.source])
if (logViewer) {
// message.ports[0] = sender.tab.id // needed?
chrome.tabs.sendMessage(logViewer, message, [sender.tab.id])
}
break
case "close me":
extension.tabs.getAll().some(function (tab) {
if (tab.port == event.source) {
tab.close()
return true
}
})
chrome.tabs.remove(sender.tab.id)
}
}

// Add tab to the list of tabs.
function addTab(event) {
var data = event.data.data
function addTab(message, sender) {
var data = message.data
if (!data.id) {
log.warn('Cannot add video to list! Missing video ID.')
return
Expand All @@ -434,7 +426,7 @@ function addTab(event) {

if (video[data.id]) {
video[data.id].playing = playing
video[data.id].source = event.source
video[data.id].source = sender.tab.id
video[data.id].title = data.title

if (ping[data.id].removeTimeout)
Expand All @@ -447,8 +439,8 @@ function addTab(event) {
firstplay: true,
focused: false,
playing: playing,
source: event.source,
origin: event.origin,
source: sender.tab.id,
origin: sender.tab.url,
title: data.title
}
videocount++
Expand All @@ -474,14 +466,14 @@ function addTab(event) {
}

// Remove tab from list and toolbar button if this is only tab.
function removeTab(event) {
function removeTab(sender) {
var previd = null,
removed = false,
prevcount = videocount

// Remove tab and find previous/next tab.
for (var id in video) {
if (video[id].source == event.source) {
if (video[id].source == sender.tab.id) {
window.clearTimeout(ping[id].replayCheck)
window.clearTimeout(ping[id].removeTimeout)
delete ping[id]
Expand Down Expand Up @@ -679,7 +671,7 @@ function loadExternalResource(message, target) {
message.data.xml = xmlstr

try {
target.postMessage(message)
chrome.tabs.sendMessage(target, message)
}
catch (error) {
log.error('An external resource is loaded but cannot be forwarded to injected script.',
Expand Down Expand Up @@ -722,12 +714,12 @@ function reScheduleReplayCheck(id) {
// Video page didn’t sent echo replay.
// Try to send message to it.
try {
video[id].source.postMessage({ subject: "echo request" })
chrome.tabs.sendMessage(video[id].source, { subject: "echo request" })
}
catch (error) {
log.warn('Message cannot be sent to page with ID ' + id + '. Searching for page.')

extension.broadcastMessage({ subject: "give me info" })
chrome.runtime.sendMessage({ subject: "give me info" })
}

markAsDead(id)
Expand Down Expand Up @@ -787,28 +779,18 @@ function updateCheck() {
log.Info('Checking for approved update.')

var xhr = new XMLHttpRequest(),
approved = extensionAddress + "/config.xml",
approved = "",
unapproved = "http://www.weebly.com/uploads/2/4/5/3/24536301/custom_themes/224467334766286522/files/update.xml?" + Date.now()

xhr.requestURI = approved
xhr.requestURI = unapproved
xhr.onreadystatechange = function processServerResponse() {
if (xhr.readyState != 4)
return

if (xhr.requestURI == approved) {
var uDesc = xhr.responseXML.getElementsByTagName("update-description"),
uInfo = xhr.responseXML.getElementsByTagName("update-info")

if (uDesc.length) {
approved = uDesc[0].getAttribute("href")
var uInfo = xhr.responseXML.getElementsByTagName("update-info")

xhr.requestURI = approved
xhr.open("get", xhr.requestURI)
xhr.send()

return
}
else if (uInfo.length) {
if (uInfo.length) {
var version = uInfo[0].getAttribute("version").replace(/\-.+/, "")
if (String.natcmp(version, extVersion) > 0) {
log.Info('A new version of ExtendTube is available ('
Expand Down Expand Up @@ -845,7 +827,7 @@ function updateCheck() {
}
}
else {
var uInfo = xhr.responseXML.getElementsByTagName("presto"),
var uInfo = xhr.responseXML.getElementsByTagName("blink"),
version = uInfo[0].getAttribute("version")
if (!version) {
log.Warn('Cannot get information about new (unapproved) version.')
Expand Down Expand Up @@ -873,7 +855,7 @@ function updateCheck() {

function sendMessage(destination, message) {
try {
destination.source.postMessage(message)
chrome.tabs.sendMessage(destination, message)
}
catch (error) {
log.error('An error occurred while trying to send message to injected script.',
Expand Down

0 comments on commit c5acb1c

Please sign in to comment.