From be0228be64967933321738313774047e0b14305e Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Sat, 14 Nov 2009 01:21:38 -0500 Subject: [PATCH] Deal with debuggerless cr^wapps in JS completion. --- common/content/base.js | 26 +++++++++++++++++++++---- common/content/completion.js | 37 +++++++++++++++++++++++++----------- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/common/content/base.js b/common/content/base.js index 00eb2b92..bd3e7d21 100644 --- a/common/content/base.js +++ b/common/content/base.js @@ -18,10 +18,28 @@ function array(obj) { function allkeys(obj) { let ret = {}; - for (; obj; obj = obj.__proto__) { - services.get("debugger").wrapValue(obj).getProperties(ret, {}); - for (let prop in values(ret.value)) - yield prop.name.stringValue; + try { + for (; obj; obj = obj.__proto__) { + services.get("debugger").wrapValue(obj).getProperties(ret, {}); + for (let prop in values(ret.value)) + yield prop.name.stringValue; + } + return; + } + catch (e) {} + + let __iterator__ = obj.__iterator__; + try { + if ('__iterator__' in obj) { + yield '__iterator__'; + delete obj.__iterator__; + } + for (let k in obj) + yield k; + } + finally { + if (__iterator__) + obj.__iterator__ = __iterator__; } } diff --git a/common/content/completion.js b/common/content/completion.js index 0377cd14..443d97db 100644 --- a/common/content/completion.js +++ b/common/content/completion.js @@ -783,20 +783,35 @@ const Completion = Module("completion", { } this.iter = function iter(obj, toplevel) { + toplevel = !!toplevel; let seen = {}; let ret = {}; - let top = services.get("debugger").wrapValue(obj); - if (!toplevel) - obj = obj.__proto__; - for (; obj; obj = !toplevel && obj.__proto__) { - services.get("debugger").wrapValue(obj).getProperties(ret, {}); - for (let prop in values(ret.value)) { - let name = '|' + prop.name.stringValue; - if (name in seen) - continue; - seen[name] = 1; - yield [prop.name.stringValue, top.getProperty(prop.name.stringValue).value.getWrappedValue()] + + try { + let top = services.get("debugger").wrapValue(obj); + + if (!toplevel) + obj = obj.__proto__; + + for (; obj; obj = !toplevel && obj.__proto__) { + services.get("debugger").wrapValue(obj).getProperties(ret, {}); + for (let prop in values(ret.value)) { + let name = '|' + prop.name.stringValue; + if (name in seen) + continue; + seen[name] = 1; + yield [prop.name.stringValue, top.getProperty(prop.name.stringValue).value.getWrappedValue()] + } } + for (let k in obj) { + if (k in obj && !(k in seen) && obj.hasOwnProperty(k) == toplevel) + yield [k, getKey(obj, k)] + } + } + catch(e) { + for (k in allkeys(obj)) + if (obj.hasOwnProperty(k) == toplevel) + yield [k, getKey(obj, k)]; } };