Add maxStrinLength argument to debugger requests
authoryurys@chromium.org <yurys@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 19 Feb 2010 14:33:08 +0000 (14:33 +0000)
committeryurys@chromium.org <yurys@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 19 Feb 2010 14:33:08 +0000 (14:33 +0000)
Review URL: http://codereview.chromium.org/647022

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3919 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/debug-delay.js
src/mirror-delay.js
test/mjsunit/debug-evaluate.js

index 754ac5d0480b1f3e249204edfc42244638e8ec44..55c25a926cbe754c1655e31e6e55aa1a48b161e7 100644 (file)
@@ -1202,11 +1202,16 @@ DebugCommandProcessor.prototype.processDebugJSONRequest = function(json_request)
         throw new Error('Command not specified');
       }
 
-      // TODO(yurys): remove request.arguments.compactFormat check once
-      // ChromeDevTools are switched to 'inlineRefs'
-      if (request.arguments && (request.arguments.inlineRefs ||
-                                request.arguments.compactFormat)) {
-        response.setOption('inlineRefs', true);
+      if (request.arguments) {
+        var args = request.arguments;
+        // TODO(yurys): remove request.arguments.compactFormat check once
+        // ChromeDevTools are switched to 'inlineRefs'
+        if (args.inlineRefs || args.compactFormat) {
+          response.setOption('inlineRefs', true);
+        }
+        if (!IS_UNDEFINED(args.maxStringLength)) {
+          response.setOption('maxStringLength', args.maxStringLength);
+        }
       }
 
       if (request.command == 'continue') {
index e1bedfdff17d958fdeeb60fa93bf74f7c3b46c84..7c743ec2cd1812bcaf86378e414236900b920ffe 100644 (file)
@@ -553,14 +553,16 @@ StringMirror.prototype.length = function() {
   return this.value_.length;
 };
 
-
-StringMirror.prototype.toText = function() {
-  if (this.length() > kMaxProtocolStringLength) {
-    return this.value_.substring(0, kMaxProtocolStringLength) +
+StringMirror.prototype.getTruncatedValue = function(maxLength) {
+  if (maxLength != -1 && this.length() > maxLength) {
+    return this.value_.substring(0, maxLength) +
            '... (length: ' + this.length() + ')';
-  } else {
-    return this.value_;
   }
+  return this.value_;
+}
+
+StringMirror.prototype.toText = function() {
+  return this.getTruncatedValue(kMaxProtocolStringLength);
 }
 
 
@@ -1955,6 +1957,15 @@ JSONProtocolSerializer.prototype.inlineRefs_ = function() {
 }
 
 
+JSONProtocolSerializer.prototype.maxStringLength_ = function() {
+  if (IS_UNDEFINED(this.options_) ||
+      IS_UNDEFINED(this.options_.maxStringLength)) {
+    return kMaxProtocolStringLength;
+  }
+  return this.options_.maxStringLength;
+}
+
+
 JSONProtocolSerializer.prototype.add_ = function(mirror) {
   // If this mirror is already in the list just return.
   for (var i = 0; i < this.mirrors_.length; i++) {
@@ -1987,8 +1998,7 @@ JSONProtocolSerializer.prototype.serializeReferenceWithDisplayData_ =
       o.value = mirror.value();
       break;
     case STRING_TYPE:
-      // Limit string length.
-      o.value = mirror.toText();
+      o.value = mirror.getTruncatedValue(this.maxStringLength_());
       break;
     case FUNCTION_TYPE:
       o.name = mirror.name();
@@ -2052,11 +2062,12 @@ JSONProtocolSerializer.prototype.serialize_ = function(mirror, reference,
 
     case STRING_TYPE:
       // String values might have their value cropped to keep down size.
-      if (mirror.length() > kMaxProtocolStringLength) {
-        var str = mirror.value().substring(0, kMaxProtocolStringLength);
+      if (this.maxStringLength_() != -1 &&
+          mirror.length() > this.maxStringLength_()) {
+        var str = mirror.getTruncatedValue(this.maxStringLength_());
         content.value = str;
         content.fromIndex = 0;
-        content.toIndex = kMaxProtocolStringLength;
+        content.toIndex = this.maxStringLength_();
       } else {
         content.value = mirror.value();
       }
index c4779072ac7f8208ee7ff87fd2f452554521745e..182e2ac96d3932021ddfb8381fc4b1b1b1691f5f 100644 (file)
@@ -87,6 +87,37 @@ function listener(event, exec_state, event_data, data) {
       testRequest(dcp, '{"expression":"a","global":true}', true, 1);
       testRequest(dcp, '{"expression":"this.a","global":true}', true, 1);
 
+      // Test that the whole string text is returned if maxStringLength
+      // parameter is passed.
+      testRequest(
+          dcp,
+          '{"expression":"this.longString","global":true,maxStringLength:-1}',
+          true,
+          longString);
+      testRequest(
+          dcp,
+          '{"expression":"this.longString","global":true,maxStringLength:' +
+              longString.length + '}',
+          true,
+          longString);
+      var truncatedStringSuffix = '... (length: ' + longString.length + ')';
+      testRequest(
+          dcp,
+          '{"expression":"this.longString","global":true,maxStringLength:0}',
+          true,
+          truncatedStringSuffix);
+      testRequest(
+          dcp,
+          '{"expression":"this.longString","global":true,maxStringLength:1}',
+          true,
+          longString.charAt(0) + truncatedStringSuffix);
+      // Test that by default string is truncated to first 80 chars.
+      testRequest(
+          dcp,
+          '{"expression":"this.longString","global":true}',
+          true,
+          longString.substring(0, 80) + truncatedStringSuffix);
+
       // Indicate that all was processed.
       listenerComplete = true;
     }
@@ -109,6 +140,12 @@ function g() {
 
 a = 1;
 
+// String which is longer than 80 chars.
+var longString = "1234567890_";
+for (var i = 0; i < 4; i++) {
+  longString += longString;
+}
+
 // Set a break point at return in f and invoke g to hit the breakpoint.
 Debug.setBreakPoint(f, 2, 0);
 g();