(pattern, url)
| 45 | |
| 46 | /* ===================== 匹配引擎(与 background 对齐) ===================== */ |
| 47 | const matchOnePattern = (pattern, url) => { |
| 48 | if (!pattern) return false; |
| 49 | let m = String(pattern).match(/^\/(.*)\/([gimsuy]*)$/); |
| 50 | if (m) { try { return new RegExp(m[1], m[2] || '').test(url); } catch (e) { return false; } } |
| 51 | if (pattern.indexOf('*') > -1) { |
| 52 | let p = pattern; |
| 53 | if (p.startsWith('*://')) p = p.replace('*://', '(http|https|file)://'); |
| 54 | else if (p.indexOf('://') < 0) p = '(http|https|file)://' + p; |
| 55 | try { |
| 56 | return new RegExp('^' + p.replace(/\./g, '\\.').replace(/\//g, '\\/').replace(/\*/g, '.*').replace(/\?/g, '\\?') + '$').test(url); |
| 57 | } catch (e) { return false; } |
| 58 | } |
| 59 | let arr = [pattern, `${pattern}/`]; |
| 60 | if (!pattern.startsWith('http://') && !pattern.startsWith('https://') && !pattern.startsWith('file://')) { |
| 61 | arr = arr.concat([`http://${pattern}`, `http://${pattern}/`, `https://${pattern}`, `https://${pattern}/`]); |
| 62 | } |
| 63 | return arr.includes(url); |
| 64 | }; |
| 65 | |
| 66 | const isMatchAll = (cm, url) => { |
| 67 | let inc = cm.mIncludes && cm.mIncludes.length ? cm.mIncludes : (cm.mPattern ? [cm.mPattern] : []); |
no outgoing calls
no test coverage detected