@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Apply D5832 to Phabricator

Summary: Brings the Javelin change in D5832 into Phabricator.

Test Plan: Hit a `/?&x` URI without hanging Safari.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Differential Revision: https://secure.phabricator.com/D5833

+52 -30
+22 -22
src/__celerity_resource_map__.php
··· 2661 2661 ), 2662 2662 'javelin-uri' => 2663 2663 array( 2664 - 'uri' => '/res/0f8f2aef/rsrc/externals/javelin/lib/URI.js', 2664 + 'uri' => '/res/a1e5cbb3/rsrc/externals/javelin/lib/URI.js', 2665 2665 'type' => 'js', 2666 2666 'requires' => 2667 2667 array( ··· 4176 4176 'uri' => '/res/pkg/f96657b8/diffusion.pkg.js', 4177 4177 'type' => 'js', 4178 4178 ), 4179 - 'c9168ae3' => 4179 + '7d174323' => 4180 4180 array( 4181 4181 'name' => 'javelin.pkg.js', 4182 4182 'symbols' => ··· 4201 4201 17 => 'javelin-typeahead-ondemand-source', 4202 4202 18 => 'javelin-tokenizer', 4203 4203 ), 4204 - 'uri' => '/res/pkg/c9168ae3/javelin.pkg.js', 4204 + 'uri' => '/res/pkg/7d174323/javelin.pkg.js', 4205 4205 'type' => 'js', 4206 4206 ), 4207 4207 '6b1fccc6' => ··· 4261 4261 'global-drag-and-drop-css' => '55644450', 4262 4262 'inline-comment-summary-css' => '8aaacd1b', 4263 4263 'javelin-aphlict' => '26980a1c', 4264 - 'javelin-behavior' => 'c9168ae3', 4264 + 'javelin-behavior' => '7d174323', 4265 4265 'javelin-behavior-aphlict-dropdown' => '26980a1c', 4266 4266 'javelin-behavior-aphlict-listen' => '26980a1c', 4267 4267 'javelin-behavior-aphront-basic-tokenizer' => '26980a1c', ··· 4312 4312 'javelin-behavior-repository-crossreference' => '27c55b30', 4313 4313 'javelin-behavior-toggle-class' => '26980a1c', 4314 4314 'javelin-behavior-workflow' => '26980a1c', 4315 - 'javelin-dom' => 'c9168ae3', 4316 - 'javelin-event' => 'c9168ae3', 4317 - 'javelin-install' => 'c9168ae3', 4318 - 'javelin-json' => 'c9168ae3', 4319 - 'javelin-mask' => 'c9168ae3', 4320 - 'javelin-request' => 'c9168ae3', 4321 - 'javelin-resource' => 'c9168ae3', 4322 - 'javelin-stratcom' => 'c9168ae3', 4323 - 'javelin-tokenizer' => 'c9168ae3', 4324 - 'javelin-typeahead' => 'c9168ae3', 4325 - 'javelin-typeahead-normalizer' => 'c9168ae3', 4326 - 'javelin-typeahead-ondemand-source' => 'c9168ae3', 4327 - 'javelin-typeahead-preloaded-source' => 'c9168ae3', 4328 - 'javelin-typeahead-source' => 'c9168ae3', 4329 - 'javelin-uri' => 'c9168ae3', 4330 - 'javelin-util' => 'c9168ae3', 4331 - 'javelin-vector' => 'c9168ae3', 4332 - 'javelin-workflow' => 'c9168ae3', 4315 + 'javelin-dom' => '7d174323', 4316 + 'javelin-event' => '7d174323', 4317 + 'javelin-install' => '7d174323', 4318 + 'javelin-json' => '7d174323', 4319 + 'javelin-mask' => '7d174323', 4320 + 'javelin-request' => '7d174323', 4321 + 'javelin-resource' => '7d174323', 4322 + 'javelin-stratcom' => '7d174323', 4323 + 'javelin-tokenizer' => '7d174323', 4324 + 'javelin-typeahead' => '7d174323', 4325 + 'javelin-typeahead-normalizer' => '7d174323', 4326 + 'javelin-typeahead-ondemand-source' => '7d174323', 4327 + 'javelin-typeahead-preloaded-source' => '7d174323', 4328 + 'javelin-typeahead-source' => '7d174323', 4329 + 'javelin-uri' => '7d174323', 4330 + 'javelin-util' => '7d174323', 4331 + 'javelin-vector' => '7d174323', 4332 + 'javelin-workflow' => '7d174323', 4333 4333 'lightbox-attachment-css' => '55644450', 4334 4334 'maniphest-task-summary-css' => '6b1fccc6', 4335 4335 'maniphest-transaction-detail-css' => '6b1fccc6',
+20 -8
webroot/rsrc/externals/javelin/lib/URI.js
··· 44 44 JX.install('URI', { 45 45 statics : { 46 46 _uriPattern : /(?:([^:\/?#]+):)?(?:\/\/([^:\/?#]*)(?::(\d*))?)?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/, 47 - _queryPattern : /(?:^|&)([^&=]*)=?([^&]*)/g, 48 47 49 48 /** 50 49 * Convert a Javascript object into an HTTP query string. ··· 62 61 } 63 62 64 63 return kv_pairs.join('&'); 64 + }, 65 + 66 + _decode : function(str) { 67 + return decodeURIComponent(str.replace(/\+/g, ' ')); 65 68 } 66 69 }, 67 70 ··· 94 97 this.setPath(path.charAt(0) == '/' ? path : '/' + path); 95 98 96 99 // parse the query data 97 - if (query) { 98 - var queryData = {}; 99 - var data; 100 - while ((data = JX.URI._queryPattern.exec(query)) != null) { 101 - queryData[decodeURIComponent(data[1].replace(/\+/g, ' '))] = 102 - decodeURIComponent(data[2].replace(/\+/g, ' ')); 100 + if (query && query.length) { 101 + var dict = {}; 102 + var parts = query.split('&'); 103 + for (var ii = 0; ii < parts.length; ii++) { 104 + var part = parts[ii]; 105 + if (!part.length) { 106 + continue; 107 + } 108 + var pieces = part.split('='); 109 + var name = pieces[0]; 110 + if (!name.length) { 111 + continue; 112 + } 113 + var value = pieces.slice(1).join('=') || ''; 114 + dict[JX.URI._decode(name)] = JX.URI._decode(value); 103 115 } 104 - this.setQueryParams(queryData); 116 + this.setQueryParams(dict); 105 117 } 106 118 } 107 119 },
+10
webroot/rsrc/externals/javelin/lib/__tests__/URI.js
··· 289 289 expect(uri2.getQueryParams()).not.toEqual({'key' : 'value'}); 290 290 }); 291 291 292 + it('should not loop indefinitely when parsing empty params', function() { 293 + expect(JX.$U('/?&key=value').getQueryParams()).toEqual({'key' : 'value'}); 294 + expect(JX.$U('/?&&&key=value').getQueryParams()).toEqual({'key' : 'value'}); 295 + expect(JX.$U('/?&&').getQueryParams()).toEqual({}); 296 + }); 297 + 298 + it('should parse values with =', function() { 299 + expect(JX.$U('/?x=1=1').getQueryParams()).toEqual({'x' : '1=1'}); 300 + }); 301 + 292 302 }); 293 303