Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 /** @suppress {duplicate} */ | 6 /** @suppress {duplicate} */ |
| 7 var remoting = remoting || {}; | 7 var remoting = remoting || {}; |
| 8 | 8 |
| 9 (function() { | 9 (function() { |
| 10 | 10 |
| 11 'use strict'; | 11 'use strict'; |
| 12 | 12 |
| 13 /** | 13 /** |
| 14 * This class monitors incoming XMPP stanza and records the first | 14 * This class monitors incoming XMPP stanza and records the first |
| 15 * error encountered. It also strips all PII from the error stanza, | 15 * error encountered. It also strips all PII from the error stanza, |
| 16 * so that it can be uploaded to the cloud for error analysis. | 16 * so that it can be uploaded to the cloud for error analysis. |
| 17 * | 17 * |
| 18 * @constructor | 18 * @constructor |
| 19 */ | 19 */ |
| 20 | 20 |
| 21 remoting.XmppErrorCache = function() { | 21 remoting.XmppErrorCache = function() { |
| 22 /** @private {remoting.ChromotingEvent.XmppError} */ | 22 /** @private {string} */ |
| 23 this.firstError_ = null; | 23 this.firstErrorStanza_ = ''; |
|
kelvinp
2015/11/07 04:44:11
convert to a string so that it can fit in the erro
| |
| 24 }; | 24 }; |
| 25 | 25 |
| 26 /** | 26 /** |
| 27 * @return {remoting.ChromotingEvent.XmppError} The first XMPP error that the | 27 * @return {string} The first XMPP error stanza that the monitor encountered. |
| 28 * monitor encountered. Returns null if no errors have been encountered so | 28 * Returns an empty string if no errors have been encountered so far. |
| 29 * far. | |
| 30 */ | 29 */ |
| 31 remoting.XmppErrorCache.prototype.getFirstError = function() { | 30 remoting.XmppErrorCache.prototype.getFirstErrorStanza = function() { |
| 32 return this.firstError_; | 31 return this.firstErrorStanza_; |
| 33 }; | 32 }; |
| 34 | 33 |
| 35 /** | 34 /** |
| 36 * Monitor the incoming stanza for error. | 35 * Monitor the incoming stanza for error. |
| 37 * | 36 * |
| 38 * @param {Element} iqNode | 37 * @param {Element} iqNode |
| 39 */ | 38 */ |
| 40 remoting.XmppErrorCache.prototype.processStanza = function(iqNode) { | 39 remoting.XmppErrorCache.prototype.processStanza = function(iqNode) { |
| 41 if (this.firstError_ != null) { | 40 if (this.firstErrorStanza_ != '') { |
| 42 return; | 41 return; |
| 43 } | 42 } |
| 44 // The XML structure is as follows: | 43 // The XML structure is as follows: |
| 45 // <iq type='error'> | 44 // <iq type='error'> |
| 46 // <jingle action='session-accept'/> | 45 // <jingle action='session-accept'/> |
| 47 // <error type='modify' code=''/> | 46 // <error type='modify' code=''/> |
| 48 // </iq> | 47 // </iq> |
| 49 if (iqNode.getAttribute('type') != 'error') { | 48 if (iqNode.getAttribute('type') != 'error') { |
| 50 return; | 49 return; |
| 51 } | 50 } |
| 52 | 51 |
| 53 var strippedStanza = this.stripPII_(iqNode); | 52 var strippedStanza = this.stripPII_(iqNode); |
| 54 this.firstError_ = new remoting.ChromotingEvent.XmppError(strippedStanza); | 53 this.firstErrorStanza_ = strippedStanza; |
| 55 }; | 54 }; |
| 56 | 55 |
| 57 /** | 56 /** |
| 58 * @param {Element} iqNode | 57 * @param {Element} iqNode |
| 59 * @return {string} Return a string representation of |iqNode| with all PII | 58 * @return {string} Return a string representation of |iqNode| with all PII |
| 60 * removed. | 59 * removed. |
| 61 * @private | 60 * @private |
| 62 */ | 61 */ |
| 63 remoting.XmppErrorCache.prototype.stripPII_ = function(iqNode) { | 62 remoting.XmppErrorCache.prototype.stripPII_ = function(iqNode) { |
| 64 var parser = new DOMParser(); | 63 var parser = new DOMParser(); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 var children = node.children; | 130 var children = node.children; |
| 132 for (i = 0; i < children.length; i++) { | 131 for (i = 0; i < children.length; i++) { |
| 133 var child = /** @type{Element}*/ (children[i]); | 132 var child = /** @type{Element}*/ (children[i]); |
| 134 var childCopy = outNode.ownerDocument.createElement(child.tagName); | 133 var childCopy = outNode.ownerDocument.createElement(child.tagName); |
| 135 outNode.appendChild(childCopy); | 134 outNode.appendChild(childCopy); |
| 136 stripPII(child, childCopy); | 135 stripPII(child, childCopy); |
| 137 } | 136 } |
| 138 } | 137 } |
| 139 | 138 |
| 140 })(); | 139 })(); |
| OLD | NEW |