Merge pull request #6368 from atom/ks-consolidate-selector-caches

Consolidate selector caches
This commit is contained in:
Kevin Sawicki
2015-04-14 10:09:21 -07:00
4 changed files with 6 additions and 38 deletions

View File

@@ -20,11 +20,11 @@
"atomShellVersion": "0.22.3",
"dependencies": {
"async": "0.2.6",
"atom-keymap": "^5.1",
"atom-keymap": "^5.1.2",
"atom-space-pen-views": "^2.0.4",
"babel-core": "^4.0.2",
"bootstrap": "git+https://github.com/atom/bootstrap.git#6af81906189f1747fd6c93479e3d998ebe041372",
"clear-cut": "0.4.0",
"clear-cut": "^2.0.1",
"coffee-cash": "0.8.0",
"coffee-script": "1.8.0",
"coffeestack": "^1.1.1",

View File

@@ -1,11 +1,9 @@
{Emitter, Disposable, CompositeDisposable} = require 'event-kit'
{specificity} = require 'clear-cut'
{calculateSpecificity, validateSelector} = require 'clear-cut'
_ = require 'underscore-plus'
{$} = require './space-pen-extensions'
{validateSelector} = require './selector-validator'
SequenceCount = 0
SpecificityCache = {}
# Public: Associates listener functions with commands in a
# context-sensitive way using CSS selectors. You can access a global instance of
@@ -241,7 +239,7 @@ class CommandRegistry
class SelectorBasedListener
constructor: (@selector, @callback) ->
@specificity = (SpecificityCache[@selector] ?= specificity(@selector))
@specificity = calculateSpecificity(@selector)
@sequenceNumber = SequenceCount++
compare: (other) ->

View File

@@ -2,14 +2,12 @@ _ = require 'underscore-plus'
path = require 'path'
CSON = require 'season'
fs = require 'fs-plus'
{specificity} = require 'clear-cut'
{calculateSpecificity, validateSelector} = require 'clear-cut'
{Disposable} = require 'event-kit'
Grim = require 'grim'
MenuHelpers = require './menu-helpers'
{validateSelector} = require './selector-validator'
platformContextMenu = require('../package.json')?._atomMenu?['context-menu']
SpecificityCache = {}
# Extended: Provides a registry for commands that you'd like to appear in the
# context menu.
@@ -208,4 +206,4 @@ class ContextMenuManager
class ContextMenuItemSet
constructor: (@selector, @items) ->
@specificity = (SpecificityCache[@selector] ?= specificity(@selector))
@specificity = calculateSpecificity(@selector)

View File

@@ -1,28 +0,0 @@
selectorCache = null
testElement = null
# Parses CSS selectors and memoizes their validity so each selector will only
# be parsed once.
exports.isSelectorValid = (selector) ->
selectorCache ?= {}
cachedValue = selectorCache[selector]
return cachedValue if cachedValue?
testElement ?= document.createElement('div')
try
# querySelector appears to be faster than webkitMatchesSelector
# http://jsperf.com/query-vs-matches
testElement.querySelector(selector)
selectorCache[selector] = true
true
catch selectorError
selectorCache[selector] = false
false
# Parse the given CSS selector and throw an error if it is invalid.
exports.validateSelector = (selector) ->
return if exports.isSelectorValid(selector)
error = new Error("'#{selector}' is not a valid selector")
error.code = 'EBADSELECTOR'
throw error