Index: src/mirror-debugger.js |
diff --git a/src/mirror-debugger.js b/src/mirror-debugger.js |
index d413b090b71a86e587329a410ae7bce46c2ae730..9cde02b8bc75f3e97ade2e92a2843346b0114d7d 100644 |
--- a/src/mirror-debugger.js |
+++ b/src/mirror-debugger.js |
@@ -42,6 +42,18 @@ function ClearMirrorCache() { |
} |
+// Wrapper to check whether an object is a Promise. The call may not work |
+// if promises are not enabled. |
+// TODO(yangguo): remove this wrapper once promises are enabled by default. |
+function ObjectIsPromise(value) { |
+ try { |
+ return %IsPromise(value); |
+ } catch (e) { |
+ return false; |
+ } |
+} |
+ |
+ |
/** |
* Returns the mirror for a specified value or object. |
* |
@@ -90,6 +102,8 @@ function MakeMirror(value, opt_transient) { |
mirror = new ErrorMirror(value); |
} else if (IS_SCRIPT(value)) { |
mirror = new ScriptMirror(value); |
+ } else if (ObjectIsPromise(value)) { |
+ mirror = new PromiseMirror(value); |
} else { |
mirror = new ObjectMirror(value, OBJECT_TYPE, opt_transient); |
} |
@@ -159,6 +173,7 @@ var FRAME_TYPE = 'frame'; |
var SCRIPT_TYPE = 'script'; |
var CONTEXT_TYPE = 'context'; |
var SCOPE_TYPE = 'scope'; |
+var PROMISE_TYPE = 'promise'; |
// Maximum length when sending strings through the JSON protocol. |
var kMaxProtocolStringLength = 80; |
@@ -212,6 +227,7 @@ var ScopeType = { Global: 0, |
// - DateMirror |
// - RegExpMirror |
// - ErrorMirror |
+// - PromiseMirror |
// - PropertyMirror |
// - InternalPropertyMirror |
// - FrameMirror |
@@ -351,6 +367,15 @@ Mirror.prototype.isError = function() { |
/** |
+ * Check whether the mirror reflects a promise. |
+ * @returns {boolean} True if the mirror reflects a promise |
+ */ |
+Mirror.prototype.isPromise = function() { |
+ return this instanceof PromiseMirror; |
+}; |
+ |
+ |
+/** |
* Check whether the mirror reflects a property. |
* @returns {boolean} True if the mirror reflects a property |
*/ |
@@ -637,9 +662,9 @@ ObjectMirror.prototype.propertyNames = function(kind, limit) { |
// Find all the named properties. |
if (kind & PropertyKind.Named) { |
- // Get all the local property names. |
+ // Get all the local property names except for private symbols. |
propertyNames = |
- %GetLocalPropertyNames(this.value_, PROPERTY_ATTRIBUTES_NONE); |
+ %GetLocalPropertyNames(this.value_, PROPERTY_ATTRIBUTES_PRIVATE_SYMBOL); |
total += propertyNames.length; |
// Get names for named interceptor properties if any. |
@@ -1172,6 +1197,26 @@ ErrorMirror.prototype.toText = function() { |
/** |
+ * Mirror object for a Promise object. |
+ * @param {Object} data The Promise object |
+ * @constructor |
+ * @extends Mirror |
+ */ |
+function PromiseMirror(value) { |
+ %_CallFunction(this, value, PROMISE_TYPE, ObjectMirror); |
+} |
+inherits(PromiseMirror, ObjectMirror); |
+ |
+ |
+PromiseMirror.prototype.status = function() { |
+ var status = %GetPromiseStatus(this.value_); |
+ if (status == 0) return "pending"; |
+ if (status == 1) return "resolved"; |
+ return "rejected"; |
+}; |
+ |
+ |
+/** |
* Base mirror object for properties. |
* @param {ObjectMirror} mirror The mirror object having this property |
* @param {string} name The name of the property |
@@ -2350,6 +2395,7 @@ JSONProtocolSerializer.prototype.serialize_ = function(mirror, reference, |
case FUNCTION_TYPE: |
case ERROR_TYPE: |
case REGEXP_TYPE: |
+ case PROMISE_TYPE: |
// Add object representation. |
this.serializeObject_(mirror, content, details); |
break; |
@@ -2452,7 +2498,6 @@ JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content, |
content.indexedInterceptor = true; |
} |
- // Add function specific properties. |
if (mirror.isFunction()) { |
// Add function specific properties. |
content.name = mirror.name(); |
@@ -2480,12 +2525,16 @@ JSONProtocolSerializer.prototype.serializeObject_ = function(mirror, content, |
} |
} |
- // Add date specific properties. |
if (mirror.isDate()) { |
// Add date specific properties. |
content.value = mirror.value(); |
} |
+ if (mirror.isPromise()) { |
+ // Add promise specific properties. |
+ content.status = mirror.status(); |
+ } |
+ |
// Add actual properties - named properties followed by indexed properties. |
var propertyNames = mirror.propertyNames(PropertyKind.Named); |
var propertyIndexes = mirror.propertyNames(PropertyKind.Indexed); |