aboutsummaryrefslogtreecommitdiff
path: root/src/js/firefox/lib/main.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/firefox/lib/main.js')
-rw-r--r--src/js/firefox/lib/main.js216
1 files changed, 216 insertions, 0 deletions
diff --git a/src/js/firefox/lib/main.js b/src/js/firefox/lib/main.js
new file mode 100644
index 0000000..84619ea
--- /dev/null
+++ b/src/js/firefox/lib/main.js
@@ -0,0 +1,216 @@
+/*
+ * Module : firefox/main.js
+ * Copyright : (c) 2011-2012, Galois, Inc.
+ *
+ * Maintainer :
+ * Stability : Provisional
+ * Portability: Not Portable (Firefox only)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+_ = require('underscore');
+Backbone = require('backbone');
+StorageWrapper = require('storage-wrapper').StorageWrapper;
+TabIds = require('tabIds').TabIds;
+
+var fiveui = fiveui || {};
+
+fiveui.ajax = require('ajax');
+
+(function() {
+
+fiveui.firefox = fiveui.firefox || {};
+
+const widgets = require("widget");
+const tabs = require("tabs");
+const data = require("self").data;
+const pageMod = require("page-mod");
+
+fiveui.firefox.main = function() {
+ var settings = new fiveui.Settings(new StorageWrapper());
+ var activeId = 0;
+
+ // initialze the background functionality
+
+ // the FiveUI button:
+ var icon = widgets.Widget({
+ id: "FiveUI-Icon",
+ label: "FiveUI",
+ contentURL: data.url('icons/fiveui-icon.html'),
+ contentScriptFile: [
+ data.url('jquery/jquery-1.8.3.js'),
+ data.url('icons/fiveui-icon.js')
+ ],
+ onClick: function() {
+ background.showUI(activeId);
+ }
+ });
+
+ var optionsButton = widgets.Widget(
+ { id: "FiveUI-Options",
+ label: "FiveUI",
+ contentURL: data.url('icons/options-icon.html'),
+ contentScriptFile: [
+ data.url('jquery/jquery-1.8.3.js'),
+ data.url('icons/options-icon.js')
+ ]
+ }
+ );
+
+ /**
+ * @param {?fiveui.TabState} tabState
+ */
+ var updateWidget = function(tabState) {
+ if(null == tabState) {
+ icon.port.emit('setDisabled');
+ icon.width = 16;
+ } else {
+ var problems = getProblemCount(tabState);
+ icon.port.emit('setEnabled', problems);
+ if (problems == 0){
+ icon.width = 16;
+ } else {
+ icon.width = 24;
+ }
+ }
+ };
+
+ // store the contents of the injected css, so that we can inject it later
+ var injectedCSS = [
+ data.load('injected/injected.css'),
+ data.load('jquery/bundled.css')
+ ].join('\n');
+
+ /**
+ * Inject code and resources into the specified tab's web page.
+ *
+ * @param {!number} tabid The id of the tab to load scripts into.
+ * @param {!Array.<string>} inScripts The list of scripts to load in
+ * order.
+ * @param {!boolean} inFrames Whether or not to inject into iFrames.
+ * @return {void}
+ */
+ var loadScripts = function(tabId, inScripts, inFrames, tab) {
+
+ if(inFrames) {
+ var firefoxScripts = [dataLoader('injected/platform-compute.js')];
+ } else {
+ var firefoxScripts = [dataLoader('injected/platform-ui.js')];
+ }
+
+ // just scripts, css gets filtered out.
+ var scripts = _.filter(_.flatten([firefoxScripts, inScripts]),
+ function(script) {
+ return script.search(/\.css$/i) == -1;
+ });
+
+ if (tab) {
+ var worker = tab.attach({
+ contentScriptFile: scripts
+ });
+
+ background.connect(tabId, worker.port, tab.url, !inFrames);
+ worker.port.emit('injectCSS', injectedCSS);
+ }
+ };
+
+ var dataLoader = function(path) {
+ return data.url(path);
+ };
+
+ var background = new fiveui.Background(settings, updateWidget,
+ loadScripts, dataLoader);
+
+ var tabIds = new TabIds();
+
+ var handleNewTab = function(tab) {
+ var tabId = tabIds.allocate();
+
+ tab.on('activate', function() {
+ background.activate(tabId);
+ activeId = tabId;
+ });
+
+ tab.on('ready', function() {
+ background.pageLoad(tabId, tab.url, tab);
+ });
+
+ tab.on('close', function() {
+ tabIds.free(tabId);
+ background.removeTab(tabId);
+ });
+ };
+
+ // handle existing tabs
+ _.each(tabs, handleNewTab);
+
+ // manage new tab creation
+ tabs.on('open', handleNewTab);
+
+ /**
+ * @param {!fiveui.TabState} tabstate
+ * @return {void}
+ */
+ var getProblemCount = function(tabState){
+ var tabId = tabState.tabId;
+ var probs = tabState.problems.length;
+ var text = '';
+ if (probs > 0) {
+ if (probs > 99) {
+ text = '99+';
+ } else {
+ text = probs.toString();
+ }
+ }
+ return text;
+ };
+
+ var showOptions = function() {
+ // TODO does not make use of existing options tabs, if any are open:
+ tabs.open(data.url('options.html'));
+ };
+
+ // set up a page-mod to be active on the options page, so that
+ // page can communicate with the add-on:
+ pageMod.PageMod(
+ { include: data.url('options.html')
+ , contentScriptWhen: 'end'
+ , contentScriptFile:
+ [ data.url('jquery/jquery-1.8.3.js')
+ , data.url('underscore.js')
+ , data.url('backbone.js')
+ , data.url('js/settings.js')
+ , data.url('js/chan.js')
+ , data.url('js/messenger.js')
+ , data.url('js/options.js')
+ , data.url('js/update-manager.js')
+ , data.url('js/utils.js')
+ , data.url('js/entry.js')
+ , data.url('js/rules.js')
+ , data.url('js/url-pat.js')
+ , data.url('js/platform-ajax.js')
+ , data.url('js/platform-options.js')
+ ]
+ , contentScript: 'fiveui.firefox.options.init();'
+ , onAttach: function (worker) {
+ fiveui.Settings.manager(worker.port, settings);
+ }
+ });
+
+ optionsButton.port.on('showOptions', showOptions);
+};
+
+exports.main = fiveui.firefox.main;
+
+})();