From 254576e1f7f5ec610ddbd9de81005397191cf52f Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 6 May 2016 16:13:39 +0200 Subject: [PATCH] Do not encode slashes in "dir" URL param in files JS --- apps/files/js/app.js | 17 +++++++++++++++-- apps/files/tests/js/appSpec.js | 32 ++++++++++++++++++-------------- core/js/js.js | 7 ++++++- 3 files changed, 39 insertions(+), 17 deletions(-) diff --git a/apps/files/js/app.js b/apps/files/js/app.js index 60b5f1816a..7a3d78f966 100644 --- a/apps/files/js/app.js +++ b/apps/files/js/app.js @@ -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.} 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)); } } }; diff --git a/apps/files/tests/js/appSpec.js b/apps/files/tests/js/appSpec.js index 3070d687fc..b9c323e7c1 100644 --- a/apps/files/tests/js/appSpec.js +++ b/apps/files/tests/js/appSpec.js @@ -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() { diff --git a/core/js/js.js b/core/js/js.js index edee72ca3c..0d7207b7ab 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -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); }