diff --git a/src/extension/url-cache.js b/src/extension/url-cache.js index 880b6984..3197718b 100644 --- a/src/extension/url-cache.js +++ b/src/extension/url-cache.js @@ -34,6 +34,22 @@ export function isSharePointHost(url, projects = []) { }); } +/** + * Determines if a URL is a personal OneDrive folder. + * @param {string} url The tab URL + * @returns {boolean} {@code true} if personal OneDrive folder, else {@code false} + */ +export function isPersonalOneDriveFolder(url) { + const { pathname } = new URL(url); + return pathname.toLowerCase().endsWith('/onedrive.aspx') + || [ + '/my', + '/personal/', + '/:f:/r/personal/', + '/:f:/p/', + ].some((prefix) => pathname.startsWith(prefix)); +} + /** * Determines if a URL has a Google Drive host. * @param {string} url The tab URL @@ -219,7 +235,9 @@ class UrlCache { urlCache.push(entry); } } else { - const isSPHost = isSharePointHost(url, Array.isArray(config) ? config : [config]); + const isSPHost = isSharePointHost(url, Array.isArray(config) ? config : [config]) + && !isPersonalOneDriveFolder(url); // no lookup for personal folders + // lookup (for sharepoint and google drive only) if (!isSPHost && !isGoogleDriveHost(url)) { return; diff --git a/test/url-cache.test.js b/test/url-cache.test.js index 94e149b8..a3489f42 100644 --- a/test/url-cache.test.js +++ b/test/url-cache.test.js @@ -18,6 +18,7 @@ import sinon from 'sinon'; import chromeMock from './mocks/chrome.js'; import { isSharePointHost, + isPersonalOneDriveFolder, urlCache, } from '../src/extension/url-cache.js'; import { @@ -53,6 +54,23 @@ describe('Test url-cache', () => { )).to.be.true; }); + it('isPersonalOneDriveFolder', async () => { + // sharepoint folder + expect(isPersonalOneDriveFolder( + 'https://acme.sharepoint.com/sites/ACME/Shared%20Documents/Forms/AllItems.aspx?id=%2Fsites%2FACME%2FShared%20Documents%2Ffoo&viewid=07cb4d37%2D3ae2%2D4762%2D87ef%2D5ad0e1059258', + )).to.be.false; + // personal onedrive folders + expect(isPersonalOneDriveFolder( + 'https://acme-my.sharepoint.com/personal/someone_acme_com/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Fsomeone_acme_com2FDocuments&view=0', + )).to.be.true; + expect(isPersonalOneDriveFolder( + 'https://acme-my.sharepoint.com/:f:/r/personal/someone_acme_com/Documents/ACME', + )).to.be.true; + expect(isPersonalOneDriveFolder( + 'https://acme-my.sharepoint.com/:f:/p/someone/EoYJVIqcrKFHu1NVLXhq9c8BZx8zwWqfEtGZ1otwW9W0mQ?e=kuqPBr', + )).to.be.true; + }); + describe('set', () => { let fetchMock; let sessionSet;