Browse Source

Do not encode slashes in "dir" URL param in files JS

tags/v9.1.0beta1
Vincent Petry 8 years ago
parent
commit
254576e1f7
No account linked to committer's email address
3 changed files with 39 additions and 17 deletions
  1. 15
    2
      apps/files/js/app.js
  2. 18
    14
      apps/files/tests/js/appSpec.js
  3. 6
    1
      core/js/js.js

+ 15
- 2
apps/files/js/app.js View File

@@ -270,6 +270,19 @@
this.navigation.getActiveContainer().trigger(new $.Event('urlChanged', params));
},

/**
* Encode URL params into a string, except for the "dir" attribute
* that gets encoded as path where "/" is not encoded
*
* @param {Object.<string>} params
* @return {string} encoded params
*/
_makeUrlParams: function(params) {
var dir = params.dir;
delete params.dir;
return 'dir=' + OC.encodePath(dir) + '&' + OC.buildQueryString(params);
},

/**
* Change the URL to point to the given dir and view
*/
@@ -283,9 +296,9 @@
var currentParams = OC.Util.History.parseUrlQuery();
if (currentParams.dir === params.dir && currentParams.view === params.view && currentParams.fileid !== params.fileid) {
// if only fileid changed or was added, replace instead of push
OC.Util.History.replaceState(params);
OC.Util.History.replaceState(this._makeUrlParams(params));
} else {
OC.Util.History.pushState(params);
OC.Util.History.pushState(this._makeUrlParams(params));
}
}
};

+ 18
- 14
apps/files/tests/js/appSpec.js View File

@@ -122,35 +122,39 @@ describe('OCA.Files.App tests', function() {

describe('URL handling', function() {
it('pushes the state to the URL when current app changed directory', function() {
$('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'subdir'}));
$('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
expect(pushStateStub.calledOnce).toEqual(true);
expect(pushStateStub.getCall(0).args[0].dir).toEqual('subdir');
expect(pushStateStub.getCall(0).args[0].view).not.toBeDefined();
var params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
expect(params.dir).toEqual('sub dir');
expect(params.view).not.toBeDefined();

$('li[data-id=other]>a').click();
pushStateStub.reset();

$('#app-content-other').trigger(new $.Event('changeDirectory', {dir: 'subdir'}));
$('#app-content-other').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
expect(pushStateStub.calledOnce).toEqual(true);
expect(pushStateStub.getCall(0).args[0].dir).toEqual('subdir');
expect(pushStateStub.getCall(0).args[0].view).toEqual('other');
params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
expect(params.dir).toEqual('sub dir');
expect(params.view).toEqual('other');
});
it('replaces the state to the URL when fileid is known', function() {
$('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'subdir'}));
$('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
expect(pushStateStub.calledOnce).toEqual(true);
expect(pushStateStub.getCall(0).args[0].dir).toEqual('subdir');
expect(pushStateStub.getCall(0).args[0].view).not.toBeDefined();
var params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
expect(params.dir).toEqual('sub dir');
expect(params.view).not.toBeDefined();
expect(replaceStateStub.notCalled).toEqual(true);

parseUrlQueryStub.returns({dir: 'subdir'});
parseUrlQueryStub.returns({dir: 'sub dir'});

$('#app-content-files').trigger(new $.Event('afterChangeDirectory', {dir: 'subdir', fileId: 123}));
$('#app-content-files').trigger(new $.Event('afterChangeDirectory', {dir: 'sub dir', fileId: 123}));

expect(pushStateStub.calledOnce).toEqual(true);
expect(replaceStateStub.calledOnce).toEqual(true);
expect(replaceStateStub.getCall(0).args[0].dir).toEqual('subdir');
expect(replaceStateStub.getCall(0).args[0].view).not.toBeDefined();
expect(replaceStateStub.getCall(0).args[0].fileid).toEqual(123);
params = OC.parseQueryString(replaceStateStub.getCall(0).args[0]);
expect(params.dir).toEqual('sub dir');
expect(params.view).not.toBeDefined();
expect(params.fileid).toEqual('123');
});
describe('onpopstate', function() {
it('sends "urlChanged" event to current app', function() {

+ 6
- 1
core/js/js.js View File

@@ -2160,7 +2160,12 @@ OC.Util.History = {
if (!this._handlers.length) {
return;
}
params = (e && e.state) || this.parseUrlQuery() || {};
params = (e && e.state);
if (_.isString(params)) {
params = OC.parseQueryString(params);
} else if (!params) {
params = this.parseUrlQuery() || {};
}
for (var i = 0; i < this._handlers.length; i++) {
this._handlers[i](params);
}

Loading…
Cancel
Save