From 6c8d5291349b68759b2bc8e3e9009c52dd60decb Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Wed, 2 Mar 2011 05:31:35 +0900 Subject: [PATCH 1/7] bindToContent --- binding/jetpack.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/binding/jetpack.js b/binding/jetpack.js index 90761af..9518b3f 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -99,6 +99,24 @@ Deferred.postie = function (constructor, opts) { next(callback); }; + ret.bindToContent = function (selector, event, callback) { + callback = (typeof callback == 'function') ? + callback.toSource() : + 'function () {' + callback + '}'; + return ret.post(selector, event, callback, function(selector, event, callback) { + eval('callback = '+callback); + var deferred = new Deferred(); + var nodes = document.querySelectorAll(selector); + for (var i = 0, it; it = nodes[i]; i++) { + it.addEventListener(event, function (e) { + deferred.call(e); + }, false); + } + return deferred. + next(callback); + }); + }; + if (contentScript) ret.post(contentScript).error(function (e) { console.log(e) }); return ret; From f1dc2d20b2771688f00ff53ffa97555c5734047b Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Wed, 2 Mar 2011 23:56:43 +0900 Subject: [PATCH 2/7] define wrapped versions of Jetpack addon-kit --- binding/jetpack.js | 191 ++++++++++++++++++++++++++++++++------------- 1 file changed, 137 insertions(+), 54 deletions(-) diff --git a/binding/jetpack.js b/binding/jetpack.js index 9518b3f..191f40e 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -16,51 +16,60 @@ const Deferred = D(); const {Cc,Ci,components} = require("chrome"); var {setTimeout,clearTimeout} = require("timer"); -Deferred.postie = function (constructor, opts) { +Deferred.postie = function (target, opts) { var ret; var id = 0; var cb = {}; var mm = []; - var onMessage = opts.onMessage; - var contentScript = opts.contentScript; - - opts.onMessage = function (message) { - if (message.init) { - for (var i = 0, it; it = mm[i]; i++) { - ret.postMessage(it); - } - mm = null; - return; - } else { - var c = cb[message.id]; - if (c) { - c(message.value, message.error); + var contentScript; + + var messageListener = function (message) { + if (message.init) { + for (var i = 0, it; it = mm[i]; i++) { + ret.postMessage(it); + } + mm = null; return; + } else { + var c = cb[message.id]; + if (c) { + c(message.value, message.error); + return; + } } - } - onMessage.apply(this, arguments); - }; + onMessage.apply(this, arguments); + }; - opts.contentScriptWhen = "ready"; - opts.contentScript = [ - 'Deferred = ' + D.toSource() + '();Deferred.define(this);', - (function () { - on('message', function (message) { - next(function () { - return eval(message.code); - }). - next(function (v) { - postMessage({ id : message.id, value : v }); - }). - error(function (e) { - postMessage({ id : message.id, error : e }); + if (typeof target == 'function') { // it is a constructor. + let onMessage = opts.onMessage; + contentScript = opts.contentScript; + + opts.onMessage = messageListener; + opts.contentScriptWhen = "ready"; + opts.contentScript = [ + 'Deferred = ' + D.toSource() + '();Deferred.define(this);', + (function () { + on('message', function (message) { + next(function () { + return eval(message.code); + }). + next(function (v) { + postMessage({ id : message.id, value : v }); + }). + error(function (e) { + postMessage({ id : message.id, error : e }); + }); }); - }); - postMessage({ id : -1, init : true }); - }).toSource() + '()' - ]; + postMessage({ id : -1, init : true }); + }).toSource() + '()' + ]; - ret = constructor(opts); + ret = target(opts); + } + else { + target.on('message', messageListener); + ret = target; + } ret.post = function (args, code) { var deferred = new Deferred(); @@ -99,27 +108,101 @@ Deferred.postie = function (constructor, opts) { next(callback); }; - ret.bindToContent = function (selector, event, callback) { - callback = (typeof callback == 'function') ? - callback.toSource() : - 'function () {' + callback + '}'; - return ret.post(selector, event, callback, function(selector, event, callback) { - eval('callback = '+callback); - var deferred = new Deferred(); - var nodes = document.querySelectorAll(selector); - for (var i = 0, it; it = nodes[i]; i++) { - it.addEventListener(event, function (e) { - deferred.call(e); - }, false); - } - return deferred. - next(callback); - }); - }; - if (contentScript) ret.post(contentScript).error(function (e) { console.log(e) }); return ret; }; exports.Deferred = Deferred; + +exports.__defineGetter__('Item', function() { + delete this.Item; + var Item = require('context-menu').Item; + return this.Item = function(options) { + return Deferred.postie(Item, options); + }; +}); + +exports.__defineGetter__('PageMod', function() { + delete this.PageMod; + var PageMod = require('page-mod').PageMod; + return this.PageMod = function(options) { + var deferred = new Deferred(); + var wrappedOptions = {}; + for (let i in options) { wrappedOptions[i] = options[i]; } + wrappedOptions.onAttach = function(worker) { + deferred.call(Deferred.postie(worker)); + }; + var instance = Deferred.postie(PageMod, wrappedOptions); + deferred.destroy = function() { + instance.destroy.apply(instance, arguments); + }; + deferred.__defineGetter__('include', function() { + return instance.include; + }); + return deferred + .next(function(worker) { + if (options.onAttach) + options.onAttach(worker); + return worker; + }); + }; +}); + +exports.__defineGetter__('Page', function() { + delete this.Page; + var Page = require('page-worker').Page; + return this.Page = function(options) { + return Deferred.postie(Page, options); + }; +}); + +exports.__defineGetter__('Panel', function() { + delete this.Panel; + var Panel = require('panel').Panel; + return this.Panel = function(options) { + return Deferred.postie(Panel, options); + }; +}); + +exports.__defineGetter__('Request', function() { + delete this.Request; + var Request = require('request').Request; + return this.Request = function(options) { + var deferred; + var wrappedOptions = {}; + for (let i in options) { wrappedOptions[i] = options[i]; } + wrappedOptions.onComplete = function(response) { + deferred.call(response); + }; + request.get = function() { + deferred = new Deferred(); + Request.prototype.get.apply(request, arguments); + return deferred + .next(function(response) { + if (options.onComplete) + options.onComplete(response); + return response; + }); + }; + request.post = function() { + deferred = new Deferred(); + Request.prototype.post.apply(request, arguments); + return deferred + .next(function(response) { + if (options.onComplete) + options.onComplete(response); + return response; + }); + }; + return Request(wrappedOptions); + }; +}); + +exports.__defineGetter__('Widget', function() { + delete this.Widget; + var Widget = require('widget').Widget; + return this.Widget = function(options) { + return Deferred.postie(Widget, options); + }; +}); From 1545d8eb7bd60d72d8709060b626057f933e5384 Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Thu, 3 Mar 2011 00:11:00 +0900 Subject: [PATCH 3/7] Request doesn't work --- binding/jetpack.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/binding/jetpack.js b/binding/jetpack.js index 191f40e..6ae3c2c 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -175,9 +175,11 @@ exports.__defineGetter__('Request', function() { wrappedOptions.onComplete = function(response) { deferred.call(response); }; + var request = Request(wrappedOptions); + var originalGet = request.get; request.get = function() { deferred = new Deferred(); - Request.prototype.get.apply(request, arguments); + originalGet.apply(request, arguments); return deferred .next(function(response) { if (options.onComplete) @@ -185,9 +187,10 @@ exports.__defineGetter__('Request', function() { return response; }); }; + var originalPost = request.post; request.post = function() { deferred = new Deferred(); - Request.prototype.post.apply(request, arguments); + originalPost.apply(request, arguments); return deferred .next(function(response) { if (options.onComplete) @@ -195,7 +198,7 @@ exports.__defineGetter__('Request', function() { return response; }); }; - return Request(wrappedOptions); + return request; }; }); From 0a919bd0a7f75f3e9375bc502e50335948d33597 Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Thu, 3 Mar 2011 00:16:34 +0900 Subject: [PATCH 4/7] remove bind() --- binding/jetpack.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/binding/jetpack.js b/binding/jetpack.js index 6ae3c2c..23fbf3e 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -94,20 +94,6 @@ Deferred.postie = function (target, opts) { return deferred; }; - ret.bind = function (selector, event, callback) { - return ret.post(selector, event, function (selector, event) { - var deferred = new Deferred(); - var nodes = document.querySelectorAll(selector); - for (var i = 0, it; it = nodes[i]; i++) { - it.addEventListener(event, function (e) { - deferred.call(e); - }, false); - } - return deferred; - }). - next(callback); - }; - if (contentScript) ret.post(contentScript).error(function (e) { console.log(e) }); return ret; From 03a8e3b23ce08acd9fde554257ef35301f476968 Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Thu, 3 Mar 2011 01:01:27 +0900 Subject: [PATCH 5/7] remove custom "Item" --- binding/jetpack.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/binding/jetpack.js b/binding/jetpack.js index 23fbf3e..ec4bced 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -17,11 +17,13 @@ const {Cc,Ci,components} = require("chrome"); var {setTimeout,clearTimeout} = require("timer"); Deferred.postie = function (target, opts) { + opts = opts || {}; var ret; var id = 0; var cb = {}; var mm = []; - var contentScript; + var onMessage = opts.onMessage; + var contentScript = opts.contentScript; var messageListener = function (message) { if (message.init) { @@ -41,9 +43,6 @@ Deferred.postie = function (target, opts) { }; if (typeof target == 'function') { // it is a constructor. - let onMessage = opts.onMessage; - contentScript = opts.contentScript; - opts.onMessage = messageListener; opts.contentScriptWhen = "ready"; opts.contentScript = [ @@ -101,14 +100,6 @@ Deferred.postie = function (target, opts) { exports.Deferred = Deferred; -exports.__defineGetter__('Item', function() { - delete this.Item; - var Item = require('context-menu').Item; - return this.Item = function(options) { - return Deferred.postie(Item, options); - }; -}); - exports.__defineGetter__('PageMod', function() { delete this.PageMod; var PageMod = require('page-mod').PageMod; From f1eaeb40d14ad7be5187235c27fa6e75d3d071a9 Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Thu, 3 Mar 2011 01:05:06 +0900 Subject: [PATCH 6/7] add a comment --- binding/jetpack.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/binding/jetpack.js b/binding/jetpack.js index ec4bced..25ae6f5 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -42,7 +42,7 @@ Deferred.postie = function (target, opts) { onMessage.apply(this, arguments); }; - if (typeof target == 'function') { // it is a constructor. + if (typeof target == 'function') { // it maybe a constructor. opts.onMessage = messageListener; opts.contentScriptWhen = "ready"; opts.contentScript = [ @@ -65,8 +65,9 @@ Deferred.postie = function (target, opts) { ret = target(opts); } - else { - target.on('message', messageListener); + else { // it maybe a worker. + if (target.on) + target.on('message', messageListener); ret = target; } From ba7bdc8c63b7ad7ed79e8b454cee97898858f720 Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Thu, 3 Mar 2011 21:42:27 +0900 Subject: [PATCH 7/7] clone() --- binding/jetpack.js | 49 ++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/binding/jetpack.js b/binding/jetpack.js index 25ae6f5..1962463 100644 --- a/binding/jetpack.js +++ b/binding/jetpack.js @@ -13,7 +13,6 @@ return Deferred; const Deferred = D(); -const {Cc,Ci,components} = require("chrome"); var {setTimeout,clearTimeout} = require("timer"); Deferred.postie = function (target, opts) { @@ -101,23 +100,34 @@ Deferred.postie = function (target, opts) { exports.Deferred = Deferred; +function clone(source) { + var cloned = {}; + for (var i in source) { cloned[i] = source[i]; } + return cloned; +} + exports.__defineGetter__('PageMod', function() { delete this.PageMod; var PageMod = require('page-mod').PageMod; return this.PageMod = function(options) { + options = clone(options || {}); + var deferred = new Deferred(); - var wrappedOptions = {}; - for (let i in options) { wrappedOptions[i] = options[i]; } - wrappedOptions.onAttach = function(worker) { + + options.onAttach = function(worker) { deferred.call(Deferred.postie(worker)); }; - var instance = Deferred.postie(PageMod, wrappedOptions); + + var instance = Deferred.postie(PageMod, options); + deferred.destroy = function() { - instance.destroy.apply(instance, arguments); + instance.destroy.apply(null, arguments); }; + deferred.__defineGetter__('include', function() { return instance.include; }); + return deferred .next(function(worker) { if (options.onAttach) @@ -147,17 +157,20 @@ exports.__defineGetter__('Request', function() { delete this.Request; var Request = require('request').Request; return this.Request = function(options) { + options = clone(options || {}); + var deferred; - var wrappedOptions = {}; - for (let i in options) { wrappedOptions[i] = options[i]; } - wrappedOptions.onComplete = function(response) { + + options.onComplete = function(response) { deferred.call(response); }; - var request = Request(wrappedOptions); - var originalGet = request.get; - request.get = function() { + + var instance = Request(options); + + var originalGet = instance.get; + instance.get = function() { deferred = new Deferred(); - originalGet.apply(request, arguments); + originalGet.apply(instance, arguments); return deferred .next(function(response) { if (options.onComplete) @@ -165,10 +178,11 @@ exports.__defineGetter__('Request', function() { return response; }); }; - var originalPost = request.post; - request.post = function() { + + var originalPost = instance.post; + instance.post = function() { deferred = new Deferred(); - originalPost.apply(request, arguments); + originalPost.apply(instance, arguments); return deferred .next(function(response) { if (options.onComplete) @@ -176,7 +190,8 @@ exports.__defineGetter__('Request', function() { return response; }); }; - return request; + + return instance; }; });