Try to use base domain names when adding conditions. Fix #276.

This commit is contained in:
FelisCatus 2015-02-17 22:41:12 +08:00
parent 62133c2d7c
commit 806f3215e8
5 changed files with 80 additions and 29 deletions

View File

@ -38,3 +38,20 @@ class AttachedCache
obj[@prop] = value
exports.AttachedCache = AttachedCache
exports.getBaseDomain = (domain) ->
return domain if domain.indexOf(':') > 0 # IPv6
lastCharCode = domain.charCodeAt(domain.length - 1)
return domain if 48 <= lastCharCode <= 57 # IP address ending with number.
segments = domain.split('.')
if segments.length <= 2
return domain
if segments[0] == 'www'
segments.shift()
len = segments.length
if len <= 2
return segments.join('.')
if segments[len - 2].length <= 2
return segments[len - 3] + '.' + segments[len - 2] + '.' + segments[len - 1]
else
return segments[len - 2] + '.' + segments[len - 1]

View File

@ -0,0 +1,29 @@
chai = require 'chai'
should = chai.should()
Utils = require '../src/utils'
describe 'getBaseDomain', ->
{getBaseDomain} = Utils
it 'should return domains with zero level unchanged', ->
getBaseDomain('someinternaldomain').should.equal('someinternaldomain')
it 'should return domains with one level unchanged', ->
getBaseDomain('example.com').should.equal('example.com')
getBaseDomain('e.test').should.equal('e.test')
getBaseDomain('a.b').should.equal('a.b')
it 'should ignore the leading www with domains with two or more levels', ->
getBaseDomain('www.example.com').should.equal('example.com')
getBaseDomain('www.e.test').should.equal('e.test')
getBaseDomain('www.a.b').should.equal('a.b')
it 'should assume two-segment TLD if len(second segment from last) <= 2', ->
getBaseDomain('images.google.co.uk').should.equal('google.co.uk')
getBaseDomain('images.google.co.jp').should.equal('google.co.jp')
getBaseDomain('ab.de.ef.test').should.equal('de.ef.test')
it 'should assume one-segment TLD and keep two segments as base otherwise', ->
getBaseDomain('subdomain.example.com').should.equal('example.com')
getBaseDomain('some.site.example.net').should.equal('example.net')
getBaseDomain('some.site.abc.test').should.equal('abc.test')
getBaseDomain('ab.de.efg.test').should.equal('efg.test')
it 'should not try to modify IP address literals', ->
getBaseDomain('127.0.0.1').should.equal('127.0.0.1')
getBaseDomain('[::1]').should.equal('[::1]')
getBaseDomain('::f').should.equal('::f')

View File

@ -119,36 +119,19 @@ angular.module('omegaTarget', []).factory 'omegaTarget', ($q) ->
d = $q['defer']()
chrome.tabs.query {active: true, lastFocusedWindow: true}, (tabs) ->
if not tabs[0]?.url
d.resolve(undefined)
d.resolve(null)
return
args = {tabId: tabs[0].id, url: tabs[0].url}
if tabs[0].id and requestInfoCallback
connectBackground('tabRequestInfo', {tabId: tabs[0].id},
connectBackground('tabRequestInfo', args,
requestInfoCallback)
getBadge = $q['defer']()
chrome.browserAction.getBadgeText {tabId: tabs[0]?.id}, (result) ->
getBadge.resolve(result)
$q.all([getBadge.promise, omegaTarget.state('inspectUrl')
]).then ([badge, url]) ->
if badge != '#' || not url
d.resolve(tabs[0]?.url)
else
clearBadge = false
d.resolve(url)
return d.promise.then (url) ->
# First, try to clear badges on opening the popup.
callBackground('clearBadge') if clearBadge
return null if not url or isChromeUrl(url)
urlParser.href = url
domain = urlParser.hostname
callBackground('queryTempRule', domain).then (profileName) ->
url: url
domain: domain
tempRuleProfileName: profileName
d.resolve(callBackground('getPageInfo', args))
return d.promise
refreshActivePage: ->
d = $q['defer']()
chrome.tabs.query {active: true, lastFocusedWindow: true}, (tabs) ->
if tabs[0].url and not isChromeUrl(tabs[0].url)
chrome.tabs.reload(tabs[0].id)
chrome.tabs.reload(tabs[0].id, {bypassCache: true})
d.resolve()
return d.promise
openManage: ->

View File

@ -2,7 +2,7 @@ OmegaTarget = require('omega-target')
OmegaPac = OmegaTarget.OmegaPac
Promise = OmegaTarget.Promise
xhr = Promise.promisify(require('xhr'))
url = require('url')
Url = require('url')
chromeApiPromisifyAll = require('./chrome_api')
proxySettings = chromeApiPromisifyAll(chrome.proxy.settings)
parseExternalProfile = require('./parse_external_profile')
@ -16,10 +16,10 @@ class ChromeOptions extends OmegaTarget.Options
fetchUrl: (dest_url, opt_bypass_cache) ->
if opt_bypass_cache
parsed = url.parse(dest_url, true)
parsed = Url.parse(dest_url, true)
parsed.search = undefined
parsed.query['_'] = Date.now()
dest_url = url.format(parsed)
dest_url = Url.format(parsed)
xhr(dest_url).get(1)
updateProfile: (args...) ->
@ -209,7 +209,7 @@ class ChromeOptions extends OmegaTarget.Options
else
chrome.browserAction.setBadgeText(text: '', tabId: tabId)
@_tabRequestInfoPorts[tabId]?.postMessage(
@_requestMonitor.summarizeErrors(info))
@_requestMonitor.summarizeErrors(info, OmegaPac.getBaseDomain))
chrome.runtime.onConnect.addListener (port) =>
return unless port.name == 'tabRequestInfo'
@ -219,7 +219,9 @@ class ChromeOptions extends OmegaTarget.Options
tabId = msg.tabId
@_tabRequestInfoPorts[tabId] = port
info = @_requestMonitor.tabInfo[tabId]
port.postMessage(@_requestMonitor.summarizeErrors(info)) if info
if info
summ = @_requestMonitor.summarizeErrors info, OmegaPac.getBaseDomain
port.postMessage(summ)
port.onDisconnect.addListener =>
delete @_tabRequestInfoPorts[tabId] if tabId?
@ -299,5 +301,24 @@ class ChromeOptions extends OmegaTarget.Options
onFirstRun: (reason) ->
chrome.tabs.create url: chrome.extension.getURL('options.html')
getPageInfo: ({tabId, url}) ->
getBadge = new Promise (resolve, reject) ->
chrome.browserAction.getBadgeText {tabId: tabId}, (result) ->
resolve(result)
getInspectUrl = @_state.get({inspectUrl: ''})
Promise.join getBadge, getInspectUrl, (badge, {inspectUrl}) =>
if badge == '#' and inspectUrl
url = inspectUrl
else
@clearBadge()
return null if not url or url.substr(0, 6) == 'chrome'
domain = OmegaPac.getBaseDomain(Url.parse(url).hostname)
return {
url: url
domain: domain
tempRuleProfileName: @queryTempRule(domain)
}
module.exports = ChromeOptions

View File

@ -150,12 +150,13 @@ module.exports = class WebRequestMonitor
for callback in @_tabCallbacks
callback(req.tabId, info, req, status)
summarizeErrors: (info) ->
summarizeErrors: (info, domainOfHost) ->
domains = []
domainInfoByName = {}
for reqId, req of info.requests
if @eventCategory[info.requestStatus[reqId]] == 'error'
domain = Url.parse(req.url).hostname
domain = domainOfHost(domain) if domainOfHost
domainInfo = domainInfoByName[domain]
if not domainInfo
domainInfo = domainInfoByName[domain] = {