Statistics
| Branch: | Revision:

blinker / firefox.plugin / lib / main.js @ a03cd52e

History | View | Annotate | Download (8.837 KB)

1
/*
2
 * Copyright 2015 Thies Pfeiffer and Dimitri Heil
3
 * Blinker is distributed under the terms of the GNU General Public License
4
 * 
5
 * This file is part of Blinker.
6
 * 
7
 * Blinker is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation, either version 3 of the License, or
10
 * (at your option) any later version.
11
 * 
12
 * Blinker is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
 * GNU General Public License for more details.
16
 * 
17
 * You should have received a copy of the GNU General Public License
18
 * along with Blinker. If not, see <http://www.gnu.org/licenses/>.
19
 */
20

    
21
var {
22
    ToggleButton
23
} = require("sdk/ui/button/toggle");
24
var panels = require("sdk/panel");
25
var tabs = require("sdk/tabs");
26
var pageMod = require("sdk/page-mod");
27
var pageWorker = require("sdk/page-worker");
28
var self = require("sdk/self");
29
var settings = require("sdk/simple-prefs");
30
var activeTABURL = "no";
31
var about_config = require("sdk/preferences/service");
32
var array = require("sdk/util/array");
33
about_config.set("network.websocket.allowInsecureFromHTTPS", true);
34

    
35
var pageModWorkers = [];
36
var activeWorker;
37
var calibrationImage = self.data.url('calib.png');
38
var holeImage = self.data.url('hole_200.gif');
39
var currentPort = null;
40

    
41
var arr;
42

    
43
//open the presentation.html on startup
44
tabs.open({
45
    url: self.data.url("presentation.html"),
46
    inBackground: false,
47
});
48

    
49

    
50
//initiation of the settings panel button
51
var button = ToggleButton({
52
    id: "mozilla-link",
53
    label: "Visit Mozilla",
54
    icon: {
55
        "16": "./eye-icon.png",
56
        "32": "./eye-icon.png",
57
        "64": "./eye-icon.png"
58
    },
59
    onChange: handleChange
60
});
61

    
62
/*
63
 * Initiate pageworker (WebSocketServer-Connector)
64
 */
65
var pw = pageWorker.Page({
66
    contentURL: self.data.url("websocket.html")
67
});
68
//pw.contentURL = self.data.url("websocket.html");
69

    
70

    
71
pw.port.on('getEyeTracker', function() {
72
    worker.port.emit("EyeTracker", eyeTracker);
73
});
74

    
75
/*
76
 * If pageworker
77
 */
78
pw.port.on('getAllSettings', function() {
79
    emitAllPrefs(worker.port);
80
});
81

    
82
/*
83
 *        If message with name: 'eyeTrackerData' is received from pageworker, send it to the according listener
84
 *        inside the active pagemod
85
 */
86
pw.port.on('eyeTrackerData', function(message) {
87
    //console.log("main.js :: pageMod :: port.on.eyeTrackerData" + ", message: " + message);
88
    if (activeWorker !== undefined) {
89
        switch (settings.prefs.eyeTracker) {
90
            case "eyetribe":
91
                activeWorker.port.emit('eyeTrackerData', message);
92
                break;
93
            case "smi":
94
                activeWorker.port.emit('smiData', message);
95
                break;
96
            case "mygaze":
97
                activeWorker.port.emit('myGazeData', message);
98
                break;
99
            default:
100
                break;
101
        }
102
    }
103
});
104

    
105

    
106

    
107

    
108
/*
109
 *        Initiate pagemod and append listeners
110
 *
111
 */
112
pageMod.PageMod({
113
    include: ["*", "file://*", "resource://*"],
114
    contentScriptFile: [self.data.url("jquery-1.11.1.js"), self.data.url("notify.js"), self.data.url("jquery-ui.js"), self.data.url("jquery.knob.js"), self.data.url("eyeTribe.js"), self.data.url("withinViewport.js"), self.data.url("jquery.withinViewport.js"), self.data.url("circle-progress.js"), self.data.url("functions.js"), self.data.url("myscript.js"), self.data.url("jquery.nearest.js")],
115
    contentStyleFile: [self.data.url("style.css"), self.data.url("font-awesome.css")],
116
    attachTo: ["top"],
117
    onAttach: function(worker) {
118

    
119
        //set global activeworker to current pagemod
120
        activeWorker = worker;
121

    
122
        /*
123
         *        if page tab / page is (re)-activated - reset the eyetribes configuration settings and refresh the
124
         *        blickBrowserSettings, that might have changed in another tab
125
         */
126
        worker.tab.on('activate', function() {
127
            activeWorker = worker;
128
            activeWorker.port.emit("initializeEyeTribe", "");
129
            emitAllPrefs(activeWorker.port);
130
        });
131
        /*
132
         *        if page tab / page is (re)-activated - reset the eyetribes configuration settings and refresh the
133
         *        blickBrowserSettings, that might have changed in another tab
134
         */
135
        worker.on('pageshow', function() {
136
            activeWorker = worker;
137
            activeWorker.port.emit("initializeEyeTribe", "");
138
            array.add(pageModWorkers, this);
139
            emitAllPrefs(activeWorker.port);
140
        });
141

    
142
        /*
143
         *        if page tab / page is minimized, remove the actual worker from pagemodworkers
144
         */
145
        worker.on('pagehide', function() {
146
            array.remove(pageModWorkers, this);
147
        });
148

    
149
        /*
150
         *        if page tab / page is closed, remove the actual worker from pagemodworkers
151
         */
152
        worker.on('detach', function() {
153
            console.log("worker detached.");
154
            array.remove(pageModWorkers, this);
155
        });
156

    
157

    
158
        /*
159
         *        ################################################################
160
         *        #################### PAGEMOD PORT LISTENERS ####################
161
         *        ################################################################
162
         */
163

    
164
        /*
165
         *        Redirect message from pagemod to pageworker
166
         */
167
        worker.port.on("sendToTracker", function(message) {
168
            pw.port.emit("toEyetracker", message);
169
        });
170

    
171

    
172
        /*
173
         *        Set panel button icon color
174
         */
175
        worker.port.on('setIconGreen', function() {
176
            button.icon = "./eye-icon_green.png";
177
        });
178
        worker.port.on('setIconRed', function() {
179
            button.icon = "./eye-icon_red.png";
180
        });
181

    
182

    
183
        worker.port.on('blickBrowserMode', function(value) {
184
            settings.prefs.blickBrowserMode = value;
185
            emitAllPrefs(activeWorker.port);
186
        });
187

    
188
        /*
189
         *        Settings have changed from inside the pagemod - adjust them globally
190
         */
191
        worker.port.on("writeSettings", function(settings) {
192
            writeSettings(settings);
193
        });
194

    
195
        /*
196
         *        ################################################################
197
         *        #################### PAGEMOD PORT EMITTERS #####################
198
         *        ################################################################
199
         */
200

    
201
        /*
202
         *        Send calibration image file to pagemod
203
         */
204
        worker.port.emit("calibrationImage", calibrationImage);
205

    
206
        /*
207
         *        Send privacy image file to pagemod
208
         */
209
        worker.port.emit("holeImage", holeImage);
210

    
211

    
212
    }
213
});
214

    
215
/*
216
 *        Initiate the settings panel
217
 */
218
var panel = panels.Panel({
219
    contentURL: self.data.url("settings.html"),
220
    contentScriptFile: [self.data.url("settingsvariables.js"), self.data.url("jquery-1.11.1.js"), self.data.url("settings.js")],
221
    position: button,
222
    //width: 400,
223
    height: 700,
224
    onHide: handleHide
225
});
226

    
227

    
228

    
229

    
230

    
231
/*
232
 * Send all blickbrowsersettings to the settings panel on request
233
 */
234
panel.port.on('getAllSettings', function() {
235
    emitAllPrefs(panel.port);
236
    //panel.port.emit('blickBrowserSettings', settings.prefs);
237
});
238

    
239
/*
240
 *        Settings have changed from inside the settings panel - adjust them globally
241
 */
242
panel.port.on("writeSettings", function(settings) {
243
    writeSettings(settings);
244
});
245

    
246
/*
247
 *        Eyetracker calibration has been toggled from settings panel
248
 *        send request to eyetracker
249
 */
250
panel.port.on("toggleCalibrate", function(value) {
251
    if (settings.prefs.eyeTracker == "eyetribe") {
252
        activeWorker.port.emit('startCalibration', 'go');
253
    }
254
});
255

    
256
/*
257
 *        Calibration check is being called from settings panel - hide the panel and tell the pagemod
258
 */
259
panel.port.on("toggleCheckCalibration", function(value) {
260
    if (settings.prefs.eyeTracker == "eyetribe") {
261
        /*tabs.activeTab.reload();*/
262
        panel.hide();
263
        //handleChange();                                
264
        activeWorker.port.emit('checkCalibration', 'go');
265

    
266
    }
267
});
268

    
269
/*
270
 *        Emit blickbrowsersettings to the panel
271
 */
272
panel.port.emit('loadSettings', 'go');
273

    
274

    
275
/*
276
 *        Is called when the button's state has changed (is it checked or not)
277
 */
278
function handleChange(state) {
279
    if (state.checked) {
280
        panel.port.emit('loadSettings', 'go');
281
        panel.show();
282
    }
283
}
284

    
285
/*
286
 * update settings and send them to the active tab
287
 * @set: The settings array (e.g. blickBrowserSettings)
288
 */
289
function writeSettings(set) {
290
    //console.log("writeSettings()");
291
    for (var name in set) {
292
        settings.prefs[name] = set [name];
293
    }
294
    emitAllPrefs(activeWorker.port);
295
}
296

    
297
/*
298
 *        Update the panel settings button's state when settings panel is being hidden
299
 */
300
function handleHide() {
301
    button.state('window', {
302
        checked: false
303
    });
304
}
305

    
306
/*
307
 * send all settings to the given port
308
 * @port: The port the settings are sent to (e.g. )
309
 */
310
function emitAllPrefs(port) {
311
    port.emit("blickBrowserSettings", settings.prefs);
312
}