1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-03-02 14:45:47 +01:00

Fix :js context on Minefield.

This commit is contained in:
Kris Maglione
2011-09-17 00:08:02 -04:00
parent 423767238b
commit 057600d780
7 changed files with 66 additions and 20 deletions

View File

@@ -475,7 +475,8 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
userEval: function (str, context, fileName, lineNumber) { userEval: function (str, context, fileName, lineNumber) {
let ctxt; let ctxt;
if (jsmodules.__proto__ != window) if (jsmodules.__proto__ != window && jsmodules.__proto__ != XPCNativeWrapper(window) &&
jsmodules.isPrototypeOf(context))
str = "with (window) { with (modules) { (this.eval || eval)(" + str.quote() + ") } }"; str = "with (window) { with (modules) { (this.eval || eval)(" + str.quote() + ") } }";
let info = contexts.context; let info = contexts.context;
@@ -1218,8 +1219,10 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
util.reportError(error); util.reportError(error);
return; return;
} }
if (error.result == Cr.NS_BINDING_ABORTED) if (error.result == Cr.NS_BINDING_ABORTED)
return; return;
if (echo) if (echo)
dactyl.echoerr(error, commandline.FORCE_SINGLELINE); dactyl.echoerr(error, commandline.FORCE_SINGLELINE);
else else

View File

@@ -187,6 +187,9 @@ var Editor = Module("editor", {
return; return;
let textBox = config.isComposeWindow ? null : dactyl.focusedElement; let textBox = config.isComposeWindow ? null : dactyl.focusedElement;
if (!DOM(textBox).isInput)
textBox = null;
let line, column; let line, column;
let keepFocus = modes.stack.some(function (m) isinstance(m.main, modes.COMMAND_LINE)); let keepFocus = modes.stack.some(function (m) isinstance(m.main, modes.COMMAND_LINE));

View File

@@ -22,6 +22,18 @@ var EventHive = Class("EventHive", Contexts.Hive, {
this.unlisten(null); this.unlisten(null);
}, },
_events: function _events(event, callback) {
if (!isObject(event))
var [self, events] = [null, array.toObject([[event, callback]])];
else
[self, events] = [event, event[callback || "events"]];
if (Set.has(events, "input") && !Set.has(events, "dactyl-input"))
events["dactyl-input"] = events.input;
return [self, events];
},
/** /**
* Adds an event listener for this session and removes it on * Adds an event listener for this session and removes it on
* dactyl shutdown. * dactyl shutdown.
@@ -35,22 +47,17 @@ var EventHive = Class("EventHive", Contexts.Hive, {
* untrusted events. * untrusted events.
*/ */
listen: function (target, event, callback, capture, allowUntrusted) { listen: function (target, event, callback, capture, allowUntrusted) {
if (!isObject(event)) var [self, events] = this._events(event, callback);
var [self, events] = [null, array.toObject([[event, callback]])];
else
[self, events] = [event, event[callback || "events"]];
if (Set.has(events, "input") && !Set.has(events, "dactyl-input"))
events["dactyl-input"] = events.input;
for (let [event, callback] in Iterator(events)) { for (let [event, callback] in Iterator(events)) {
let args = [Cu.getWeakReference(target), let args = [Cu.getWeakReference(target),
self ? Cu.getWeakReference(self) : { get: function () null },
event, event,
this.wrapListener(callback, self), this.wrapListener(callback, self),
capture, capture,
allowUntrusted]; allowUntrusted];
target.addEventListener.apply(target, args.slice(1)); target.addEventListener.apply(target, args.slice(2));
this.sessionListeners.push(args); this.sessionListeners.push(args);
} }
}, },
@@ -65,12 +72,21 @@ var EventHive = Class("EventHive", Contexts.Hive, {
* phase, otherwise during the bubbling phase. * phase, otherwise during the bubbling phase.
*/ */
unlisten: function (target, event, callback, capture) { unlisten: function (target, event, callback, capture) {
if (target != null)
var [self, events] = this._events(event, callback);
this.sessionListeners = this.sessionListeners.filter(function (args) { this.sessionListeners = this.sessionListeners.filter(function (args) {
if (target == null || args[0].get() == target && args[1] == event && args[2].wrapped == callback && args[3] == capture) { let elem = args[0].get();
args[0].get().removeEventListener.apply(args[0].get(), args.slice(1)); if (target == null || elem == target
&& self == args[1].get()
&& Set.has(events, args[2])
&& args[3].wrapped == events[args[2]]
&& args[4] == capture) {
elem.removeEventListener.apply(elem, args.slice(2));
return false; return false;
} }
return !args[0].get(); return elem;
}); });
}, },
@@ -192,7 +208,8 @@ var Events = Module("events", {
*/ */
wrapListener: function wrapListener(method, self) { wrapListener: function wrapListener(method, self) {
self = self || this; self = self || this;
method.wrapped = wrappedListener; method.wrapper = wrappedListener;
wrappedListener.wrapped = method;
function wrappedListener(event) { function wrappedListener(event) {
try { try {
method.apply(self, arguments); method.apply(self, arguments);

View File

@@ -307,6 +307,17 @@ var Modes = Module("modes", {
dactyl.triggerObserver("modes.add", mode); dactyl.triggerObserver("modes.add", mode);
}, },
removeMode: function removeMode(mode) {
if (this[mode.name] == mode)
delete this[mode.name];
if (this._modeMap[mode.name] == mode)
delete this._modeMap[mode.name];
if (this._modeMap[mode.mode] == mode)
delete this._modeMap[mode.mode];
this._mainModes = this._mainModes.filter(function (m) m != mode);
},
dumpStack: function dumpStack() { dumpStack: function dumpStack() {
util.dump("Mode stack:"); util.dump("Mode stack:");
for (let [i, mode] in array.iterItems(this._modeStack)) for (let [i, mode] in array.iterItems(this._modeStack))

View File

@@ -1399,18 +1399,26 @@ var DOM = Class("DOM", {
* @param {Node} elem The context element. * @param {Node} elem The context element.
* @param {boolean} asIterator Whether to return the results as an * @param {boolean} asIterator Whether to return the results as an
* XPath iterator. * XPath iterator.
* @param {object} namespaces Additional namespaces to recognize.
* @optional
* @returns {Object} Iterable result of the evaluation. * @returns {Object} Iterable result of the evaluation.
*/ */
XPath: update( XPath: update(
function XPath(expression, elem, asIterator) { function XPath(expression, elem, asIterator, namespaces) {
try { try {
let doc = elem.ownerDocument || elem; let doc = elem.ownerDocument || elem;
if (isArray(expression)) if (isArray(expression))
expression = DOM.makeXPath(expression); expression = DOM.makeXPath(expression);
let resolver = XPath.resolver;
if (namespaces) {
namespaces = update({}, DOM.namespaces, namespaces);
resolver = function (prefix) namespaces[prefix] || null;
}
let result = doc.evaluate(expression, elem, let result = doc.evaluate(expression, elem,
XPath.resolver, resolver,
asIterator ? Ci.nsIDOMXPathResult.ORDERED_NODE_ITERATOR_TYPE : Ci.nsIDOMXPathResult.ORDERED_NODE_SNAPSHOT_TYPE, asIterator ? Ci.nsIDOMXPathResult.ORDERED_NODE_ITERATOR_TYPE : Ci.nsIDOMXPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null null
); );

View File

@@ -717,7 +717,7 @@ var JavaScript = Module("javascript", {
try { try {
var result = dactyl.userEval(js, this.context); var result = dactyl.userEval(js, this.context);
var xml = util.objectToString(result, true); var xml = result === undefined ? "" : util.objectToString(result, true);
} }
catch (e) { catch (e) {
util.reportError(e); util.reportError(e);

View File

@@ -823,11 +823,15 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
* @returns {nsIURI} * @returns {nsIURI}
*/ */
newURI: function newURI(uri, charset, base) { newURI: function newURI(uri, charset, base) {
let idx = uri.lastIndexOf(" -> "); if (uri instanceof Ci.nsIURI)
if (~idx) var res = uri.clone();
uri = uri.slice(idx + 4); else {
let idx = uri.lastIndexOf(" -> ");
if (~idx)
uri = uri.slice(idx + 4);
let res = this.withProperErrors("newURI", services.io, uri, charset, base); res = this.withProperErrors("newURI", services.io, uri, charset, base);
}
res instanceof Ci.nsIURL; res instanceof Ci.nsIURL;
return res; return res;
}, },