MOBILE-3674 core: Improve url singleton

Make url comparison case insensitive
main
Noel De Martin 2021-05-25 12:09:54 +02:00
parent acf464fbe2
commit 3f050064d8
6 changed files with 70 additions and 18 deletions

View File

@ -78,6 +78,7 @@ import { Md5 } from 'ts-md5/dist/md5';
// Import core classes that can be useful for site plugins. // Import core classes that can be useful for site plugins.
import { CoreSyncBaseProvider } from '@classes/base-sync'; import { CoreSyncBaseProvider } from '@classes/base-sync';
import { CoreArray } from '@singletons/array'; import { CoreArray } from '@singletons/array';
import { CoreText } from '@singletons/text';
import { CoreUrl } from '@singletons/url'; import { CoreUrl } from '@singletons/url';
import { CoreWindow } from '@singletons/window'; import { CoreWindow } from '@singletons/window';
import { CoreCache } from '@classes/cache'; import { CoreCache } from '@classes/cache';
@ -340,6 +341,7 @@ export class CoreCompileProvider {
instance['Md5'] = Md5; instance['Md5'] = Md5;
instance['CoreSyncBaseProvider'] = CoreSyncBaseProvider; instance['CoreSyncBaseProvider'] = CoreSyncBaseProvider;
instance['CoreArray'] = CoreArray; instance['CoreArray'] = CoreArray;
instance['CoreText'] = CoreText;
instance['CoreUrl'] = CoreUrl; instance['CoreUrl'] = CoreUrl;
instance['CoreWindow'] = CoreWindow; instance['CoreWindow'] = CoreWindow;
instance['CoreCache'] = CoreCache; instance['CoreCache'] = CoreCache;

View File

@ -52,6 +52,7 @@ import { CoreArray } from '../singletons/array';
import { CoreNetworkError } from '@classes/errors/network-error'; import { CoreNetworkError } from '@classes/errors/network-error';
import { CoreNavigationOptions } from './navigator'; import { CoreNavigationOptions } from './navigator';
import { CoreSitesFactory } from './sites-factory'; import { CoreSitesFactory } from './sites-factory';
import { CoreText } from '@singletons/text';
export const CORE_SITE_SCHEMAS = new InjectionToken<CoreSiteSchema[]>('CORE_SITE_SCHEMAS'); export const CORE_SITE_SCHEMAS = new InjectionToken<CoreSiteSchema[]>('CORE_SITE_SCHEMAS');
@ -1635,10 +1636,10 @@ export class CoreSitesProvider {
// If more than one site is returned it usually means there are different users stored. Use any of them. // If more than one site is returned it usually means there are different users stored. Use any of them.
const site = await this.getSite(siteIds[0]); const site = await this.getSite(siteIds[0]);
const siteUrl = CoreTextUtils.removeEndingSlash( const siteUrl = CoreText.removeEndingSlash(
CoreUrlUtils.removeProtocolAndWWW(site.getURL()), CoreUrlUtils.removeProtocolAndWWW(site.getURL()),
); );
const treatedUrl = CoreTextUtils.removeEndingSlash(CoreUrlUtils.removeProtocolAndWWW(url)); const treatedUrl = CoreText.removeEndingSlash(CoreUrlUtils.removeProtocolAndWWW(url));
if (siteUrl == treatedUrl) { if (siteUrl == treatedUrl) {
result.site = site; result.site = site;

View File

@ -25,6 +25,7 @@ import { Locutus } from '@singletons/locutus';
import { CoreViewerTextComponent } from '@features/viewer/components/text/text'; import { CoreViewerTextComponent } from '@features/viewer/components/text/text';
import { CoreFileHelper } from '@services/file-helper'; import { CoreFileHelper } from '@services/file-helper';
import { CoreDomUtils } from './dom'; import { CoreDomUtils } from './dom';
import { CoreText } from '@singletons/text';
/** /**
* Different type of errors the app can treat. * Different type of errors the app can treat.
@ -710,21 +711,10 @@ export class CoreTextUtilsProvider {
} }
/** /**
* Remove ending slash from a path or URL. * @deprecated Use CoreText instead.
*
* @param text Text to treat.
* @return Treated text.
*/ */
removeEndingSlash(text?: string): string { removeEndingSlash(text?: string): string {
if (!text) { return CoreText.removeEndingSlash(text);
return '';
}
if (text.slice(-1) == '/') {
return text.substr(0, text.length - 1);
}
return text;
} }
/** /**

View File

@ -43,4 +43,17 @@ describe('CoreUrl singleton', () => {
}); });
}); });
it('compares domains and paths', () => {
expect(CoreUrl.sameDomainAndPath('https://school.edu', 'https://school.edu')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu', 'HTTPS://SCHOOL.EDU')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'https://school.edu/moodle')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'https://school.edu/moodle/')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'https://school.edu/moodle#about')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'HTTPS://SCHOOL.EDU/MOODLE')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'HTTPS://SCHOOL.EDU/MOODLE/')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'HTTPS://SCHOOL.EDU/MOODLE#ABOUT')).toBe(true);
expect(CoreUrl.sameDomainAndPath('https://school.edu/moodle', 'https://school.edu/moodle/about')).toBe(false);
});
}); });

View File

@ -0,0 +1,43 @@
// (C) Copyright 2015 Moodle Pty Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* Singleton with helper functions for text manipulation.
*/
export class CoreText {
// Avoid creating singleton instances.
private constructor() {
// Nothing to do.
}
/**
* Remove ending slash from a path or URL.
*
* @param text Text to treat.
* @return Treated text.
*/
static removeEndingSlash(text?: string): string {
if (!text) {
return '';
}
if (text.slice(-1) == '/') {
return text.substr(0, text.length - 1);
}
return text;
}
}

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import { CoreTextUtils } from '@services/utils/text'; import { CoreText } from './text';
/** /**
* Parts contained within a url. * Parts contained within a url.
@ -196,8 +196,11 @@ export class CoreUrl {
const partsA = CoreUrl.parse(urlA); const partsA = CoreUrl.parse(urlA);
const partsB = CoreUrl.parse(urlB); const partsB = CoreUrl.parse(urlB);
return partsA?.domain == partsB?.domain && partsA && Object.entries(partsA).forEach(([part, value]) => partsA[part] = value?.toLowerCase());
CoreTextUtils.removeEndingSlash(partsA?.path) == CoreTextUtils.removeEndingSlash(partsB?.path); partsB && Object.entries(partsB).forEach(([part, value]) => partsB[part] = value?.toLowerCase());
return partsA?.domain === partsB?.domain
&& CoreText.removeEndingSlash(partsA?.path) === CoreText.removeEndingSlash(partsB?.path);
} }
} }