Skip to content

Commit 8058a54

Browse files
Merge pull request #2476 from mrmr1993/firefox
Improve firefox support
2 parents 84723d7 + b0fc681 commit 8058a54

14 files changed

+148
-46
lines changed

background_scripts/main.coffee

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,13 @@ TabOperations =
101101
index: request.tab.index + 1
102102
active: true
103103
windowId: request.tab.windowId
104-
openerTabId: request.tab.id
105-
chrome.tabs.create tabConfig, callback
104+
chrome.tabs.create tabConfig, (tab) ->
105+
# NOTE(mrmr1993, 2017-02-08): Firefox currently doesn't support openerTabId (issue 1238314) and throws
106+
# a type error if it is present. We work around this by attempting to set it separately from creating
107+
# the tab.
108+
try chrome.tabs.update tab.id, { openerTabId : request.tab.id }, callback
109+
catch
110+
callback.apply this, arguments
106111

107112
toggleMuteTab = do ->
108113
muteTab = (tab) -> chrome.tabs.update tab.id, {muted: !tab.mutedInfo.muted}

background_scripts/marks.coffee

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Marks =
3030
saveMark: (markInfo) ->
3131
item = {}
3232
item[@getLocationKey markInfo.markName] = markInfo
33-
chrome.storage.sync.set item
33+
Settings.storage.set item
3434

3535
# Goto a global mark. We try to find the original tab. If we can't find that, then we try to find another
3636
# tab with the original URL, and use that. And if we can't find such an existing tab, then we create a new
@@ -39,7 +39,7 @@ Marks =
3939
chrome.storage.local.get "vimiumSecret", (items) =>
4040
vimiumSecret = items.vimiumSecret
4141
key = @getLocationKey req.markName
42-
chrome.storage.sync.get key, (items) =>
42+
Settings.storage.get key, (items) =>
4343
markInfo = items[key]
4444
if markInfo.vimiumSecret != vimiumSecret
4545
# This is a different Vimium instantiation, so markInfo.tabId is definitely out of date.

content_scripts/hud.coffee

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ HUD =
3535
@tween.fade 1.0, 150
3636

3737
search: (data) ->
38-
@findMode.findInPlace data.query
38+
# NOTE(mrmr1993): On Firefox, window.find moves the window focus away from the HUD. We use postFindFocus
39+
# to put it back, so the user can continue typing.
40+
@findMode.findInPlace data.query, {"postFindFocus": @hudUI.iframeElement.contentWindow}
3941

4042
# Show the number of matches in the HUD UI.
4143
matchCount = if FindMode.query.parsedQuery.length > 0 then FindMode.query.matchCount else 0

content_scripts/marks.coffee

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Marks =
6464
if @isGlobalMark event, markName
6565
# This key must match @getLocationKey() in the back end.
6666
key = "vimiumGlobalMark|#{markName}"
67-
chrome.storage.sync.get key, (items) ->
67+
Settings.storage.get key, (items) ->
6868
if key of items
6969
chrome.runtime.sendMessage handler: 'gotoMark', markName: markName
7070
HUD.showForDuration "Jumped to global mark '#{markName}'", 1000

content_scripts/mode_find.coffee

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ class FindMode extends Mode
8787
selection.removeAllRanges()
8888
selection.addRange range
8989

90-
findInPlace: (query) ->
90+
findInPlace: (query, options) ->
9191
# If requested, restore the scroll position (so that failed searches leave the scroll position unchanged).
9292
@checkReturnToViewPort()
9393
FindMode.updateQuery query
9494
# Restore the selection. That way, we're always searching forward from the same place, so we find the right
9595
# match as the user adds matching characters, or removes previously-matched characters. See #1434.
9696
@restoreSelection()
9797
query = if FindMode.query.isRegex then FindMode.getNextQueryFromRegexMatches(0) else FindMode.query.parsedQuery
98-
FindMode.query.hasResults = FindMode.execute query
98+
FindMode.query.hasResults = FindMode.execute query, options
9999

100100
@updateQuery: (query) ->
101101
@query.rawQuery = query
@@ -178,7 +178,13 @@ class FindMode extends Mode
178178
# ignore the selectionchange event generated by find()
179179
document.removeEventListener("selectionchange", @restoreDefaultSelectionHighlight, true)
180180

181-
result = window.find(query, options.caseSensitive, options.backwards, true, false, true, false)
181+
try
182+
result = window.find(query, options.caseSensitive, options.backwards, true, false, true, false)
183+
catch # Failed searches throw on Firefox.
184+
185+
# window.find focuses the |window| that it is called on. This gives us an opportunity to (re-)focus
186+
# another element/window, if that isn't the behaviour we want.
187+
options.postFindFocus?.focus()
182188

183189
if options.colorSelection
184190
setTimeout(

lib/settings.coffee

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
#
1111
# In all cases except Settings.defaults, values are stored as jsonified strings.
1212

13+
storageArea = if chrome.storage.sync? then "sync" else "local"
14+
1315
Settings =
1416
debug: false
15-
storage: chrome.storage.sync
17+
storage: chrome.storage[storageArea]
1618
cache: {}
1719
isLoaded: false
1820
onLoadedCallbacks: []
@@ -25,14 +27,22 @@ Settings =
2527
@cache = if Utils.isBackgroundPage() then localStorage else extend {}, localStorage
2628
@runOnLoadedCallbacks()
2729

30+
# Test chrome.storage.sync to see if it is enabled.
31+
# NOTE(mrmr1993, 2017-04-18): currently the API is defined in FF, but it is disabled behind a flag in
32+
# about:config. Every use sets chrome.runtime.lastError, so we use that to check whether we can use it.
33+
chrome.storage.sync.get null, =>
34+
if chrome.runtime.lastError
35+
storageArea = "local"
36+
@storage = chrome.storage[storageArea]
37+
2838
chrome.storage.local.get null, (localItems) =>
2939
localItems = {} if chrome.runtime.lastError
3040
@storage.get null, (syncedItems) =>
3141
unless chrome.runtime.lastError
3242
@handleUpdateFromChromeStorage key, value for own key, value of extend localItems, syncedItems
3343

3444
chrome.storage.onChanged.addListener (changes, area) =>
35-
@propagateChangesFromChromeStorage changes if area == "sync"
45+
@propagateChangesFromChromeStorage changes if area == storageArea
3646

3747
@runOnLoadedCallbacks()
3848

@@ -71,9 +81,9 @@ Settings =
7181
if @shouldSyncKey key
7282
if shouldSetInSyncedStorage
7383
setting = {}; setting[key] = @cache[key]
74-
@log " chrome.storage.sync.set(#{key})"
84+
@log " chrome.storage.#{storageArea}.set(#{key})"
7585
@storage.set setting
76-
if Utils.isBackgroundPage()
86+
if Utils.isBackgroundPage() and storageArea == "sync"
7787
# Remove options installed by the "copyNonDefaultsToChromeStorage-20150717" migration; see below.
7888
@log " chrome.storage.local.remove(#{key})"
7989
chrome.storage.local.remove key
@@ -98,7 +108,7 @@ Settings =
98108
nuke: (key) ->
99109
delete localStorage[key]
100110
chrome.storage.local.remove key
101-
chrome.storage.sync.remove key
111+
chrome.storage.sync?.remove key
102112

103113
# For development only.
104114
log: (args...) ->
@@ -169,7 +179,7 @@ Settings =
169179
# az: http://www.amazon.com/s/?field-keywords=%s Amazon
170180
# qw: https://www.qwant.com/?q=%s Qwant
171181
"""
172-
newTabUrl: "chrome://newtab"
182+
newTabUrl: "about:newtab"
173183
grabBackFocus: false
174184
regexFindMode: false
175185
waitForEnterForFilteredHints: false # Note: this defaults to true for new users; see below.

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"content_scripts": [
3737
{
3838
"_comment":
39-
"IMPORTANT: All resources listed here must also be listed in ./pages/vimium_resources.html.",
39+
"IMPORTANT: All resources listed here must also be listed with the others -- in order -- in ./pages/*.html",
4040
"matches": ["<all_urls>"],
4141
"js": ["lib/utils.js",
4242
"lib/keyboard_utils.js",

pages/blank.html

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11
<html>
22
<head>
33
<title>New Tab</title>
4-
<link rel="import" href="vimium_resources.html">
4+
<script src="../lib/utils.js"></script>
5+
<script src="../lib/keyboard_utils.js"></script>
6+
<script src="../lib/dom_utils.js"></script>
7+
<script src="../lib/rect.js"></script>
8+
<script src="../lib/handler_stack.js"></script>
9+
<script src="../lib/settings.js"></script>
10+
<script src="../lib/find_mode_history.js"></script>
11+
<script src="../content_scripts/mode.js"></script>
12+
<script src="../content_scripts/ui_component.js"></script>
13+
<script src="../content_scripts/link_hints.js"></script>
14+
<script src="../content_scripts/vomnibar.js"></script>
15+
<script src="../content_scripts/scroller.js"></script>
16+
<script src="../content_scripts/marks.js"></script>
17+
<script src="../content_scripts/mode_insert.js"></script>
18+
<script src="../content_scripts/mode_find.js"></script>
19+
<script src="../content_scripts/mode_key_handler.js"></script>
20+
<script src="../content_scripts/mode_visual.js"></script>
21+
<script src="../content_scripts/hud.js"></script>
22+
<script src="../content_scripts/vimium_frontend.js"></script>
23+
<link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" />
24+
525
</head>
626
<body>
727
</body>

pages/completion_engines.html

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,27 @@
44
<!-- We re-use some styling from the options page, so that the look and feel here is similar -->
55
<link rel="stylesheet" type="text/css" href="options.css">
66
<link rel="stylesheet" type="text/css" href="completion_engines.css">
7-
<link rel="import" href="vimium_resources.html">
7+
<script src="../lib/utils.js"></script>
8+
<script src="../lib/keyboard_utils.js"></script>
9+
<script src="../lib/dom_utils.js"></script>
10+
<script src="../lib/rect.js"></script>
11+
<script src="../lib/handler_stack.js"></script>
12+
<script src="../lib/settings.js"></script>
13+
<script src="../lib/find_mode_history.js"></script>
14+
<script src="../content_scripts/mode.js"></script>
15+
<script src="../content_scripts/ui_component.js"></script>
16+
<script src="../content_scripts/link_hints.js"></script>
17+
<script src="../content_scripts/vomnibar.js"></script>
18+
<script src="../content_scripts/scroller.js"></script>
19+
<script src="../content_scripts/marks.js"></script>
20+
<script src="../content_scripts/mode_insert.js"></script>
21+
<script src="../content_scripts/mode_find.js"></script>
22+
<script src="../content_scripts/mode_key_handler.js"></script>
23+
<script src="../content_scripts/mode_visual.js"></script>
24+
<script src="../content_scripts/hud.js"></script>
25+
<script src="../content_scripts/vimium_frontend.js"></script>
26+
<link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" />
27+
828
<script src="../background_scripts/completion_engines.js"></script>
929
<script src="completion_engines.js"></script>
1030
</head>

pages/help_dialog.html

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11
<html>
22
<head>
33
<title>Vimium Help</title>
4-
<link rel="import" href="vimium_resources.html">
4+
<script src="../lib/utils.js"></script>
5+
<script src="../lib/keyboard_utils.js"></script>
6+
<script src="../lib/dom_utils.js"></script>
7+
<script src="../lib/rect.js"></script>
8+
<script src="../lib/handler_stack.js"></script>
9+
<script src="../lib/settings.js"></script>
10+
<script src="../lib/find_mode_history.js"></script>
11+
<script src="../content_scripts/mode.js"></script>
12+
<script src="../content_scripts/ui_component.js"></script>
13+
<script src="../content_scripts/link_hints.js"></script>
14+
<script src="../content_scripts/vomnibar.js"></script>
15+
<script src="../content_scripts/scroller.js"></script>
16+
<script src="../content_scripts/marks.js"></script>
17+
<script src="../content_scripts/mode_insert.js"></script>
18+
<script src="../content_scripts/mode_find.js"></script>
19+
<script src="../content_scripts/mode_key_handler.js"></script>
20+
<script src="../content_scripts/mode_visual.js"></script>
21+
<script src="../content_scripts/hud.js"></script>
22+
<script src="../content_scripts/vimium_frontend.js"></script>
23+
<link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" />
24+
525
<script type="text/javascript" src="ui_component_server.js"></script>
626
<script type="text/javascript" src="help_dialog.js"></script>
727
</head>

pages/hud.coffee

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ handlers =
5858
hud.innerText = "/\u200A" # \u200A is a "hair space", to leave enough space before the caret/first char.
5959

6060
inputElement = document.createElement "span"
61-
inputElement.contentEditable = "plaintext-only"
61+
try # NOTE(mrmr1993): Chrome supports non-standard "plaintext-only", which is what we *really* want.
62+
inputElement.contentEditable = "plaintext-only"
63+
catch # Fallback to standard-compliant version.
64+
inputElement.contentEditable = "true"
6265
inputElement.id = "hud-find-input"
6366
hud.appendChild inputElement
6467

pages/logging.html

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11
<html>
22
<head>
33
<title>Vimium Logging</title>
4-
<link rel="import" href="vimium_resources.html">
4+
<script src="../lib/utils.js"></script>
5+
<script src="../lib/keyboard_utils.js"></script>
6+
<script src="../lib/dom_utils.js"></script>
7+
<script src="../lib/rect.js"></script>
8+
<script src="../lib/handler_stack.js"></script>
9+
<script src="../lib/settings.js"></script>
10+
<script src="../lib/find_mode_history.js"></script>
11+
<script src="../content_scripts/mode.js"></script>
12+
<script src="../content_scripts/ui_component.js"></script>
13+
<script src="../content_scripts/link_hints.js"></script>
14+
<script src="../content_scripts/vomnibar.js"></script>
15+
<script src="../content_scripts/scroller.js"></script>
16+
<script src="../content_scripts/marks.js"></script>
17+
<script src="../content_scripts/mode_insert.js"></script>
18+
<script src="../content_scripts/mode_find.js"></script>
19+
<script src="../content_scripts/mode_key_handler.js"></script>
20+
<script src="../content_scripts/mode_visual.js"></script>
21+
<script src="../content_scripts/hud.js"></script>
22+
<script src="../content_scripts/vimium_frontend.js"></script>
23+
<link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" />
24+
525
<script src="logging.js"></script>
626
<style type="text/css">
727
body {

pages/options.html

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,27 @@
22
<head>
33
<title>Vimium Options</title>
44
<link rel="stylesheet" type="text/css" href="options.css">
5-
<link rel="import" href="vimium_resources.html">
5+
<script src="../lib/utils.js"></script>
6+
<script src="../lib/keyboard_utils.js"></script>
7+
<script src="../lib/dom_utils.js"></script>
8+
<script src="../lib/rect.js"></script>
9+
<script src="../lib/handler_stack.js"></script>
10+
<script src="../lib/settings.js"></script>
11+
<script src="../lib/find_mode_history.js"></script>
12+
<script src="../content_scripts/mode.js"></script>
13+
<script src="../content_scripts/ui_component.js"></script>
14+
<script src="../content_scripts/link_hints.js"></script>
15+
<script src="../content_scripts/vomnibar.js"></script>
16+
<script src="../content_scripts/scroller.js"></script>
17+
<script src="../content_scripts/marks.js"></script>
18+
<script src="../content_scripts/mode_insert.js"></script>
19+
<script src="../content_scripts/mode_find.js"></script>
20+
<script src="../content_scripts/mode_key_handler.js"></script>
21+
<script src="../content_scripts/mode_visual.js"></script>
22+
<script src="../content_scripts/hud.js"></script>
23+
<script src="../content_scripts/vimium_frontend.js"></script>
24+
<link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" />
25+
626
<script type="text/javascript" src="options.js"></script>
727
</head>
828

pages/vimium_resources.html

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)