aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--background_scripts/completion.coffee4
-rw-r--r--content_scripts/mode_find.coffee43
-rw-r--r--content_scripts/ui_component.coffee2
-rw-r--r--lib/utils.coffee6
-rw-r--r--manifest.json2
6 files changed, 31 insertions, 28 deletions
diff --git a/README.md b/README.md
index 9b871b04..b8558692 100644
--- a/README.md
+++ b/README.md
@@ -153,7 +153,7 @@ Please see [CONTRIBUTING.md](https://github.com/philc/vimium/blob/master/CONTRIB
Release Notes
-------------
-Updates since 1.52 (not yet released)
+1.53 (2015-09-25)
- Vimium now works on the new-tab page for Chrome 47.
- `g0` and `g$` now accept count prefixes; so `2g0` selects the second tab, and so on.
diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee
index fb5a6120..2427bad8 100644
--- a/background_scripts/completion.coffee
+++ b/background_scripts/completion.coffee
@@ -762,8 +762,6 @@ RegexpCache =
init: ->
@initialized = true
@clear()
- # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
- @escapeRegExp ||= /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g
clear: -> @cache = {}
@@ -777,7 +775,7 @@ RegexpCache =
# TODO: `prefix` and `suffix` might be useful in richer word-relevancy scoring.
get: (string, prefix="", suffix="") ->
@init() unless @initialized
- regexpString = string.replace(@escapeRegExp, "\\$&")
+ regexpString = Utils.escapeRegexSpecialCharacters string
# Avoid cost of constructing new strings if prefix/suffix are empty (which is expected to be a common case).
regexpString = prefix + regexpString if prefix
regexpString = regexpString + suffix if suffix
diff --git a/content_scripts/mode_find.coffee b/content_scripts/mode_find.coffee
index 9b47cfbd..e863b553 100644
--- a/content_scripts/mode_find.coffee
+++ b/content_scripts/mode_find.coffee
@@ -115,30 +115,27 @@ class FindMode extends Mode
# default to 'smartcase' mode, unless noIgnoreCase is explicitly specified
@query.ignoreCase = !hasNoIgnoreCaseFlag && !Utils.hasUpperCase(@query.parsedQuery)
- # if we are dealing with a regex, grep for all matches in the text, and then call window.find() on them
- # sequentially so the browser handles the scrolling / text selection.
- if @query.isRegex
- try
- pattern = new RegExp(@query.parsedQuery, "g" + (if @query.ignoreCase then "i" else ""))
- catch error
- # if we catch a SyntaxError, assume the user is not done typing yet and return quietly
- return
- # innerText will not return the text of hidden elements, and strip out tags while preserving newlines
- text = document.body.innerText
- @query.regexMatches = text.match(pattern)
- @query.activeRegexIndex = 0
- @query.matchCount = @query.regexMatches?.length
- # if we are doing a basic plain string match, we still want to grep for matches of the string, so we can
- # show a the number of results. We can grep on document.body.innerText, as it should be indistinguishable
- # from the internal representation used by window.find.
+ regexPattern = if @query.isRegex
+ @query.parsedQuery
else
- # escape all special characters, so RegExp just parses the string 'as is'.
- # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
- escapeRegExp = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g
- parsedNonRegexQuery = @query.parsedQuery.replace(escapeRegExp, (char) -> "\\" + char)
- pattern = new RegExp(parsedNonRegexQuery, "g" + (if @query.ignoreCase then "i" else ""))
- text = document.body.innerText
- @query.matchCount = text.match(pattern)?.length
+ Utils.escapeRegexSpecialCharacters @query.parsedQuery
+
+ # If we are dealing with a regex, grep for all matches in the text, and then call window.find() on them
+ # sequentially so the browser handles the scrolling / text selection.
+ # If we are doing a basic plain string match, we still want to grep for matches of the string, so we can
+ # show a the number of results.
+ try
+ pattern = new RegExp regexPattern, "g#{if @query.ignoreCase then "i" else ""}"
+ catch error
+ return # If we catch a SyntaxError, assume the user is not done typing yet and return quietly.
+
+ # innerText will not return the text of hidden elements, and strip out tags while preserving newlines.
+ # NOTE(mrmr1993): innerText doesn't include the text contents of <input>s and <textarea>s. See #1118.
+ text = document.body.innerText
+ regexMatches = text.match pattern
+ @query.regexMatches = regexMatches if @query.isRegex
+ @query.activeRegexIndex = 0 if @query.isRegex
+ @query.matchCount = regexMatches?.length
@getNextQueryFromRegexMatches: (stepSize) ->
# find()ing an empty query always returns false
diff --git a/content_scripts/ui_component.coffee b/content_scripts/ui_component.coffee
index 72627f69..74b58b82 100644
--- a/content_scripts/ui_component.coffee
+++ b/content_scripts/ui_component.coffee
@@ -12,6 +12,8 @@ class UIComponent
# Default to everything hidden while the stylesheet loads.
styleSheet.innerHTML = "iframe {display: none;}"
+ # Use an XMLHttpRequest, possibly via the background page, to fetch the stylesheet. This allows us to
+ # catch and recover from failures that we could not have caught when using CSS @include (eg. #1817).
UIComponent::styleSheetGetter ?= new AsyncDataFetcher @fetchFileContents "content_scripts/vimium.css"
@styleSheetGetter.use (styles) -> styleSheet.innerHTML = styles
diff --git a/lib/utils.coffee b/lib/utils.coffee
index 350b11a5..b69b926b 100644
--- a/lib/utils.coffee
+++ b/lib/utils.coffee
@@ -19,6 +19,12 @@ Utils =
func = obj[components.pop()]
func.apply(obj, argArray)
+ # Escape all special characters, so RegExp will parse the string 'as is'.
+ # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
+ escapeRegexSpecialCharacters: do ->
+ escapeRegex = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g
+ (str) -> str.replace escapeRegex, "\\$&"
+
escapeHtml: (string) -> string.replace(/</g, "&lt;").replace(/>/g, "&gt;")
# Generates a unique ID
diff --git a/manifest.json b/manifest.json
index 6d971db2..acd41d12 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Vimium",
- "version": "1.52",
+ "version": "1.53",
"description": "The Hacker's Browser. Vimium provides keyboard shortcuts for navigation and control in the spirit of Vim.",
"icons": { "16": "icons/icon16.png",
"48": "icons/icon48.png",