Compare commits

...

3 Commits

Author SHA1 Message Date
Bauke 1fbe1efb90
Don't check redirects in subframes. 2022-11-02 12:16:46 +01:00
Bauke 089a27ab9d
Add regex redirect usage information and an example. 2022-11-02 11:30:02 +01:00
Bauke 2665ee3298
Add a regex redirect. 2022-11-02 11:10:29 +01:00
9 changed files with 86 additions and 5 deletions

View File

@ -19,7 +19,7 @@ browser.runtime.onInstalled.addListener(async () => {
}); });
browser.webNavigation.onBeforeNavigate.addListener(async (details) => { browser.webNavigation.onBeforeNavigate.addListener(async (details) => {
if (!details.url.startsWith('http')) { if (!details.url.startsWith('http') || details.frameId > 0) {
return; return;
} }

View File

@ -95,7 +95,7 @@ export default class Usage extends Component {
<td>https://<b>tildes.net</b>/~creative.timasomo</td> <td>https://<b>tildes.net</b>/~creative.timasomo</td>
</tr> </tr>
<tr class="alt"> <tr class="alt">
<td class="bold center-text" rowspan="2">Regex</td> <td class="bold center-text" rowspan="3">Regex</td>
<td class="center-text">HOL{3}O</td> <td class="center-text">HOL{3}O</td>
<td>https://git.bauke.xyz/<b>holllo</b><sup>2</sup></td> <td>https://git.bauke.xyz/<b>holllo</b><sup>2</sup></td>
</tr> </tr>
@ -103,6 +103,12 @@ export default class Usage extends Component {
<td class="center-text">^https?://www\\.holllo\\.org/?$</td> <td class="center-text">^https?://www\\.holllo\\.org/?$</td>
<td><b>https://www.holllo.org/</b></td> <td><b>https://www.holllo.org/</b></td>
</tr> </tr>
<tr>
<td class="center-text">
${'^(?<base>https://holllo\\.org)/(?<one>1)-(?<two>2)$'}
</td>
<td><b>https://holllo.org/1-2</b></td>
</tr>
</tbody> </tbody>
</table> </table>
@ -149,11 +155,21 @@ export default class Usage extends Component {
<td>https://holllo.org/home</td> <td>https://holllo.org/home</td>
<td><b>https://holllo.org</b></td> <td><b>https://holllo.org</b></td>
</tr> </tr>
<tr>
<td class="bold center-text">Regex<sup>2</sup></td>
<td>${'$<base>/$<two>-$<one>'}</td>
<td>https://holllo.org/1-2</td>
<td><b>https://holllo.org/2-1</b></td>
</tr>
</tbody> </tbody>
</table> </table>
<ol class="footnotes"> <ol class="footnotes">
<li>The bold highlighted text shows what will be changed.</li> <li>The bold highlighted text shows what will be changed.</li>
<li>
The regex redirect only works in combination with the regex matcher,
as the regex matcher will be used for the capturing groups.
</li>
</ol> </ol>
</details> </details>
`; `;

View File

@ -28,6 +28,14 @@ const examples: RedirectParameters[] = [
redirectType: 'simple', redirectType: 'simple',
redirectValue: 'https://holllo.org/re-nav', redirectValue: 'https://holllo.org/re-nav',
}, },
{
enabled: true,
id: -1,
matcherType: 'regex',
matcherValue: '^(?<base>https://holllo\\.org)/(?<one>1)-(?<two>2)$',
redirectType: 'regex',
redirectValue: '$<base>/$<two>-$<one>',
},
]; ];
export async function generateExamples(): Promise< export async function generateExamples(): Promise<

View File

@ -1,5 +1,5 @@
export const matcherTypes = ['hostname', 'regex'] as const; export const matcherTypes = ['hostname', 'regex'] as const;
export const redirectTypes = ['hostname', 'simple'] as const; export const redirectTypes = ['hostname', 'regex', 'simple'] as const;
export type MatcherType = typeof matcherTypes[number]; export type MatcherType = typeof matcherTypes[number];
export type RedirectType = typeof redirectTypes[number]; export type RedirectType = typeof redirectTypes[number];

View File

@ -1,9 +1,11 @@
import {RedirectParameters} from './base.js'; import {RedirectParameters} from './base.js';
import {HostnameRedirect} from './hostname.js'; import {HostnameRedirect} from './hostname.js';
import {RegexRedirect} from './regex.js';
import {SimpleRedirect} from './simple.js'; import {SimpleRedirect} from './simple.js';
export * from './base.js'; export * from './base.js';
export * from './hostname.js'; export * from './hostname.js';
export * from './regex.js';
export * from './simple.js'; export * from './simple.js';
export type Redirects = HostnameRedirect | SimpleRedirect; export type Redirects = HostnameRedirect | SimpleRedirect;
@ -11,6 +13,7 @@ export type Redirects = HostnameRedirect | SimpleRedirect;
export function parseRedirect( export function parseRedirect(
parameters: RedirectParameters, parameters: RedirectParameters,
): Redirects | undefined { ): Redirects | undefined {
const matcherType = parameters?.matcherType;
const redirectType = parameters?.redirectType; const redirectType = parameters?.redirectType;
if (redirectType === 'hostname') { if (redirectType === 'hostname') {
@ -20,4 +23,8 @@ export function parseRedirect(
if (redirectType === 'simple') { if (redirectType === 'simple') {
return new SimpleRedirect(parameters); return new SimpleRedirect(parameters);
} }
if (matcherType === 'regex' && redirectType === 'regex') {
return new RegexRedirect(parameters);
}
} }

9
source/redirect/regex.ts Normal file
View File

@ -0,0 +1,9 @@
import {Redirect} from './base.js';
export class RegexRedirect extends Redirect {
public redirect(redirect: URL | string): URL {
const url = redirect instanceof URL ? redirect.href : redirect;
const regex = new RegExp(this.parameters.matcherValue, 'gi');
return new URL(url.replace(regex, this.parameters.redirectValue));
}
}

View File

@ -12,6 +12,7 @@ import {
Redirect, Redirect,
Redirects, Redirects,
RedirectParameters, RedirectParameters,
RegexRedirect,
SimpleRedirect, SimpleRedirect,
} from '../source/redirect/exports.js'; } from '../source/redirect/exports.js';
@ -33,6 +34,15 @@ const simpleParameters: RedirectParameters = {
redirectValue: 'https://example.org/simple', redirectValue: 'https://example.org/simple',
}; };
const regexParameters: RedirectParameters = {
enabled: true,
id: 3,
matcherType: 'regex',
matcherValue: '(.+)\\.com',
redirectType: 'regex',
redirectValue: '$1.org',
};
test('parseRedirect', (t) => { test('parseRedirect', (t) => {
const samples: RedirectParameters[] = [ const samples: RedirectParameters[] = [
{ {
@ -41,6 +51,7 @@ test('parseRedirect', (t) => {
undefined as unknown as RedirectParameters, undefined as unknown as RedirectParameters,
hostnameParameters, hostnameParameters,
simpleParameters, simpleParameters,
regexParameters,
]; ];
for (const sample of samples) { for (const sample of samples) {
@ -58,18 +69,21 @@ test('parseRedirect', (t) => {
test('Redirect.redirect', (t) => { test('Redirect.redirect', (t) => {
const hostnameRedirect = new HostnameRedirect(hostnameParameters); const hostnameRedirect = new HostnameRedirect(hostnameParameters);
const simpleRedirect = new SimpleRedirect(simpleParameters); const simpleRedirect = new SimpleRedirect(simpleParameters);
const regexRedirect = new RegexRedirect(regexParameters);
const samples: Array<[string, Redirect]> = [ const samples: Array<[string | URL, Redirect]> = [
['https://example.com', hostnameRedirect], ['https://example.com', hostnameRedirect],
['https://example.com/path#hash?query=test', hostnameRedirect], ['https://example.com/path#hash?query=test', hostnameRedirect],
['https://example.com', simpleRedirect], ['https://example.com', simpleRedirect],
['https://example.com/path', simpleRedirect], ['https://example.com/path', simpleRedirect],
['https://example.com', regexRedirect],
[new URL('https://example.com'), regexRedirect],
]; ];
for (const [index, [url, redirect]] of samples.entries()) { for (const [index, [url, redirect]] of samples.entries()) {
t.snapshot( t.snapshot(
{ {
original: url, original: url instanceof URL ? url.href : url,
redirected: redirect.redirect(url).href, redirected: redirect.redirect(url).href,
}, },
`${index} ${redirect.constructor.name}`, `${index} ${redirect.constructor.name}`,

View File

@ -32,6 +32,19 @@ Generated by [AVA](https://avajs.dev).
}, },
} }
> Class RegexRedirect
RegexRedirect {
parameters: {
enabled: true,
id: 3,
matcherType: 'regex',
matcherValue: '(.+)\\.com',
redirectType: 'regex',
redirectValue: '$1.org',
},
}
## Redirect.redirect ## Redirect.redirect
> 0 HostnameRedirect > 0 HostnameRedirect
@ -61,3 +74,17 @@ Generated by [AVA](https://avajs.dev).
original: 'https://example.com/path', original: 'https://example.com/path',
redirected: 'https://example.org/simple', redirected: 'https://example.org/simple',
} }
> 4 RegexRedirect
{
original: 'https://example.com',
redirected: 'https://example.org/',
}
> 5 RegexRedirect
{
original: 'https://example.com/',
redirected: 'https://example.org/',
}