aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cakefile37
-rw-r--r--README.markdown8
-rw-r--r--background_scripts/main.coffee8
-rw-r--r--background_scripts/settings.coffee2
-rw-r--r--manifest.json2
-rw-r--r--tests/dom_tests/bind.js27
-rw-r--r--tests/dom_tests/chrome.coffee20
-rw-r--r--tests/dom_tests/dom_tests.coffee (renamed from test_harnesses/automated/automated.coffee)9
-rw-r--r--tests/dom_tests/dom_tests.html (renamed from test_harnesses/automated/automated.html)6
-rw-r--r--tests/dom_tests/phantom_runner.coffee32
-rw-r--r--tests/unit_tests/completion_test.coffee (renamed from tests/completion_test.coffee)4
-rw-r--r--tests/unit_tests/test_helper.coffee (renamed from tests/test_helper.coffee)4
-rw-r--r--tests/unit_tests/utils_test.coffee (renamed from tests/utils_test.coffee)2
-rw-r--r--vimium.css1
14 files changed, 132 insertions, 30 deletions
diff --git a/Cakefile b/Cakefile
index 697c03dc..92e62f33 100644
--- a/Cakefile
+++ b/Cakefile
@@ -8,20 +8,19 @@ spawn_with_opts = (proc_name, opts) ->
opt_array.push "--#{key}=#{value}"
spawn proc_name, opt_array
-src_directories = ["tests", "background_scripts", "content_scripts", "lib", "options",
- "test_harnesses/automated"]
-
task "build", "compile all coffeescript files to javascript", ->
- coffee = spawn "coffee", ["-c"].concat(src_directories)
+ coffee = spawn "coffee", ["-c", __dirname]
coffee.stdout.on "data", (data) -> console.log data.toString().trim()
coffee.stderr.on "data", (data) -> console.log data.toString().trim()
task "clean", "removes any js files which were compiled from coffeescript", ->
- src_directories.forEach (directory) ->
+ visit = (directory) ->
fs.readdirSync(directory).forEach (filename) ->
- return unless (path.extname filename) == ".js"
filepath = path.join directory, filename
- return unless (fs.statSync filepath).isFile()
+ if (fs.statSync filepath).isDirectory()
+ return visit filepath
+
+ return unless (path.extname filename) == ".js" and (fs.statSync filepath).isFile()
# Check if there exists a corresponding .coffee file
try
@@ -31,8 +30,10 @@ task "clean", "removes any js files which were compiled from coffeescript", ->
fs.unlinkSync filepath if coffeeFile.isFile()
+ visit __dirname
+
task "autobuild", "continually rebuild coffeescript files using coffee --watch", ->
- coffee = spawn "coffee", ["-cw"].concat(src_directories)
+ coffee = spawn "coffee", ["-cw", __dirname]
coffee.stdout.on "data", (data) -> console.log data.toString().trim()
coffee.stderr.on "data", (data) -> console.log data.toString().trim()
@@ -55,10 +56,20 @@ task "package", "build .crx file", ->
crxmake.stdout.on "data", (data) -> console.log data.toString().trim()
crxmake.on "exit", -> fs.writeFileSync "manifest.json", orig_manifest_text
-task "test", "run all unit tests", ->
- test_files = fs.readdirSync("tests/").filter((filename) -> filename.indexOf("_test.js") > 0)
- test_files = test_files.map((filename) -> "tests/" + filename)
+task "test", "run all tests", ->
+ console.log "Running unit tests..."
+ basedir = "tests/unit_tests/"
+ test_files = fs.readdirSync(basedir).filter((filename) -> filename.indexOf("_test.js") > 0)
+ test_files = test_files.map((filename) -> basedir + filename)
test_files.forEach (file) -> require "./" + file
Tests.run()
- if Tests.testsFailed > 0
- process.exit 1
+ returnCode = if Tests.testsFailed > 0 then 1 else 0
+
+ console.log "Running DOM tests..."
+ spawn = (require "child_process").spawn
+ phantom = spawn "phantomjs", ["./tests/dom_tests/phantom_runner.js"]
+ phantom.stdout.on 'data', (data) -> process.stdout.write data
+ phantom.stderr.on 'data', (data) -> process.stderr.write data
+ phantom.on 'exit', (code) ->
+ returnCode += code
+ process.exit returnCode
diff --git a/README.markdown b/README.markdown
index 4e42c062..38ae93ff 100644
--- a/README.markdown
+++ b/README.markdown
@@ -138,6 +138,12 @@ Vimium is written in Coffeescript, which compiles to Javascript. To build Vimium
1. Install [Coffeescript](http://coffeescript.org/#installation).
2. Run `cake autobuild` from within your vimium directory. Any coffeescript files you change will now be automatically compiled to Javascript.
+
+Our tests use [shoulda.js](https://github.com/philc/shoulda.js) and [PhantomJS](http://phantomjs.org/). To run
+the tests:
+
+1. `git submodule update --init --recursive` -- this pulls in shoulda.js.
+2. [Install PhantomJS.](http://phantomjs.org/download.html)
3. `cake test` to run the tests.
When you're done, send us a pull request on Github. Feel free to include a change to the CREDITS file with
@@ -149,7 +155,7 @@ don't exceed 110 characters.
Release Notes
-------------
-1.38 (Unreleased)
+1.38 (09/08/2012)
- `O` now opens Vomnibar results in a new tab. `B` does the same for bookmarks only.
- Add a browser icon to quickly add sites to Vimium's exclude list.
diff --git a/background_scripts/main.coffee b/background_scripts/main.coffee
index 5ae80235..a3857d61 100644
--- a/background_scripts/main.coffee
+++ b/background_scripts/main.coffee
@@ -143,9 +143,9 @@ fetchFileContents = (extensionFileName) ->
#
# Returns the keys that can complete a valid command given the current key queue.
#
-getCompletionKeysRequest = (request) ->
+getCompletionKeysRequest = (request, keysToCheck = "") ->
name: "refreshCompletionKeys"
- completionKeys: generateCompletionKeys()
+ completionKeys: generateCompletionKeys(keysToCheck)
validFirstKeys: validFirstKeys
#
@@ -472,7 +472,7 @@ checkKeyQueue = (keysToCheck, tabId, frameId) ->
# If we haven't sent the completion keys piggybacked on executePageCommand,
# send them by themselves.
unless refreshedCompletionKeys
- chrome.tabs.sendRequest(tabId, getCompletionKeysRequest(), null)
+ chrome.tabs.sendRequest(tabId, getCompletionKeysRequest(null, newKeyQueue), null)
newKeyQueue
@@ -553,7 +553,7 @@ sendRequestHandlers =
refreshCompleter: refreshCompleter
# Convenience function for development use.
-window.runTests = -> open(chrome.extension.getURL('test_harnesses/automated/automated.html'))
+window.runTests = -> open(chrome.extension.getURL('tests/dom_tests/dom_tests.html'))
#
# Begin initialization.
diff --git a/background_scripts/settings.coffee b/background_scripts/settings.coffee
index 865ab933..ec602cc0 100644
--- a/background_scripts/settings.coffee
+++ b/background_scripts/settings.coffee
@@ -27,7 +27,7 @@ root.Settings = Settings =
"""
div > .vimiumHintMarker {
/* linkhint boxes */
- background-color: yellow;
+ background: yellow;
border: 1px solid #E3BE23;
}
diff --git a/manifest.json b/manifest.json
index 2e8dac72..b5eb391e 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Vimium",
- "version": "1.37",
+ "version": "1.38",
"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",
diff --git a/tests/dom_tests/bind.js b/tests/dom_tests/bind.js
new file mode 100644
index 00000000..833f8006
--- /dev/null
+++ b/tests/dom_tests/bind.js
@@ -0,0 +1,27 @@
+/*
+ * Polyfill taken from https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind
+ * Necessary because the current version of PhantomJS doesn't yet support bind().
+ */
+if (!Function.prototype.bind) {
+ Function.prototype.bind = function (oThis) {
+ if (typeof this !== "function") {
+ // closest thing possible to the ECMAScript 5 internal IsCallable function
+ throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
+ }
+
+ var aArgs = Array.prototype.slice.call(arguments, 1),
+ fToBind = this,
+ fNOP = function () {},
+ fBound = function () {
+ return fToBind.apply(this instanceof fNOP && oThis
+ ? this
+ : oThis,
+ aArgs.concat(Array.prototype.slice.call(arguments)));
+ };
+
+ fNOP.prototype = this.prototype;
+ fBound.prototype = new fNOP();
+
+ return fBound;
+ };
+}
diff --git a/tests/dom_tests/chrome.coffee b/tests/dom_tests/chrome.coffee
new file mode 100644
index 00000000..ff7a53d0
--- /dev/null
+++ b/tests/dom_tests/chrome.coffee
@@ -0,0 +1,20 @@
+#
+# Mock the Chrome extension API.
+#
+
+root = exports ? window
+
+root.chrome = {
+ extension: {
+ connect: -> {
+ onMessage: {
+ addListener: ->
+ }
+ postMessage: ->
+ }
+ onRequest: {
+ addListener: ->
+ }
+ sendRequest: ->
+ }
+}
diff --git a/test_harnesses/automated/automated.coffee b/tests/dom_tests/dom_tests.coffee
index 283e8004..3d981ee5 100644
--- a/test_harnesses/automated/automated.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -30,6 +30,7 @@ createGeneralHintTests = (isFilteredMode) ->
testContent = "<a>test</a>" + "<a>tress</a>"
document.getElementById("test-div").innerHTML = testContent
stub settings.values, "filterLinkHints", false
+ stub settings.values, "linkHintCharacters", "ab"
tearDown ->
document.getElementById("test-div").innerHTML = ""
@@ -191,9 +192,11 @@ Tests.outputMethod = (args...) ->
document.getElementById("output-div").innerHTML += "<div class='output-section'>" + newOutput + "</div>"
console.log.apply console, args
-# ensure the extension has time to load before commencing the tests
-document.addEventListener "DOMContentLoaded", ->
- setTimeout Tests.run, 200
+# PhantomJS will call the tests manually
+unless navigator.userAgent == 'phantom'
+ # ensure the extension has time to load before commencing the tests
+ document.addEventListener "DOMContentLoaded", ->
+ setTimeout Tests.run, 200
createLinks = (n) ->
for i in [0...n] by 1
diff --git a/test_harnesses/automated/automated.html b/tests/dom_tests/dom_tests.html
index a0c8c7de..1dc45782 100644
--- a/test_harnesses/automated/automated.html
+++ b/tests/dom_tests/dom_tests.html
@@ -27,6 +27,8 @@
}
</style>
<link rel="stylesheet" type="text/css" href="../../vimium.css" />
+ <script type="text/javascript" src="bind.js"></script>
+ <script type="text/javascript" src="chrome.js"></script>
<script type="text/javascript" src="../../lib/utils.js"></script>
<script type="text/javascript" src="../../lib/keyboard_utils.js"></script>
<script type="text/javascript" src="../../lib/dom_utils.js"></script>
@@ -34,8 +36,8 @@
<script type="text/javascript" src="../../content_scripts/link_hints.js"></script>
<script type="text/javascript" src="../../content_scripts/vomnibar.js"></script>
<script type="text/javascript" src="../../content_scripts/vimium_frontend.js"></script>
- <script type="text/javascript" src="../../tests/shoulda.js/shoulda.js"></script>
- <script type="text/javascript" src="automated.js"></script>
+ <script type="text/javascript" src="../shoulda.js/shoulda.js"></script>
+ <script type="text/javascript" src="dom_tests.js"></script>
</head>
<body>
<!-- should always be the first element on the page -->
diff --git a/tests/dom_tests/phantom_runner.coffee b/tests/dom_tests/phantom_runner.coffee
new file mode 100644
index 00000000..9036b8f3
--- /dev/null
+++ b/tests/dom_tests/phantom_runner.coffee
@@ -0,0 +1,32 @@
+page = require('webpage').create()
+
+page.settings.userAgent = 'phantom'
+
+# ensure that the elements we test the link hints on are actually visible
+page.viewportSize =
+ width: 900
+ height: 600
+
+page.onConsoleMessage = (msg) ->
+ console.log msg
+
+system = require 'system'
+fs = require 'fs'
+
+pathParts = system.args[0].split(fs.separator)
+pathParts[pathParts.length - 1] = ''
+dirname = pathParts.join(fs.separator)
+
+page.open dirname + 'dom_tests.html', (status) ->
+ if status != 'success'
+ console.log 'Unable to load tests.'
+ phantom.exit 1
+
+ testsFailed = page.evaluate ->
+ Tests.run()
+ return Tests.testsFailed
+
+ if testsFailed > 0
+ phantom.exit 1
+ else
+ phantom.exit 0
diff --git a/tests/completion_test.coffee b/tests/unit_tests/completion_test.coffee
index 7094d720..d3369398 100644
--- a/tests/completion_test.coffee
+++ b/tests/unit_tests/completion_test.coffee
@@ -1,6 +1,6 @@
require "./test_helper.js"
-extend(global, require "../lib/utils.js")
-extend(global, require "../background_scripts/completion.js")
+extend(global, require "../../lib/utils.js")
+extend(global, require "../../background_scripts/completion.js")
global.chrome = {}
diff --git a/tests/test_helper.coffee b/tests/unit_tests/test_helper.coffee
index 237f8e24..bb73bf54 100644
--- a/tests/test_helper.coffee
+++ b/tests/unit_tests/test_helper.coffee
@@ -1,5 +1,5 @@
-require("./shoulda.js/shoulda.js")
+require("../shoulda.js/shoulda.js")
global.extend = (hash1, hash2) ->
for key of hash2
hash1[key] = hash2[key]
- hash1 \ No newline at end of file
+ hash1
diff --git a/tests/utils_test.coffee b/tests/unit_tests/utils_test.coffee
index f3810114..9da5ff65 100644
--- a/tests/utils_test.coffee
+++ b/tests/unit_tests/utils_test.coffee
@@ -1,5 +1,5 @@
require "./test_helper.js"
-extend(global, require "../lib/utils.js")
+extend(global, require "../../lib/utils.js")
context "isUrl",
should "accept valid URLs", ->
diff --git a/vimium.css b/vimium.css
index cf626efe..24619a30 100644
--- a/vimium.css
+++ b/vimium.css
@@ -115,6 +115,7 @@ div#vimiumHelpDialog {
border-radius:6px;
padding:8px 12px;
width:640px;
+ max-height: 85%;
left:50%;
/* This needs to be 1/2 width to horizontally center the help dialog */
margin-left:-320px;