Skip to content

Commit

Permalink
Fix d3.select(document) and d3.select(object).
Browse files Browse the repository at this point in the history
Also add tests for d3_documentElement and d3_window so that they work for the
three cases we care about: a node, a document and a window. For anything else
they return undefined.
  • Loading branch information
mbostock committed Feb 10, 2015
1 parent df3fbea commit a40a611
Show file tree
Hide file tree
Showing 12 changed files with 95 additions and 14 deletions.
2 changes: 1 addition & 1 deletion bower.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "d3",
"version": "3.5.4",
"version": "3.5.5",
"main": "d3.js",
"scripts": [
"d3.js"
Expand Down
2 changes: 1 addition & 1 deletion component.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"animation",
"canvas"
],
"version": "3.5.4",
"version": "3.5.5",
"main": "d3.js",
"scripts": [
"d3.js"
Expand Down
6 changes: 3 additions & 3 deletions d3.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
!function() {
var d3 = {
version: "3.5.4"
version: "3.5.5"
};
var d3_arraySlice = [].slice, d3_array = function(list) {
return d3_arraySlice.call(list);
};
var d3_document = this.document;
function d3_documentElement(node) {
return node && (node.ownerDocument || node.document).documentElement;
return node && (node.ownerDocument || node.document || node).documentElement;
}
function d3_window(node) {
return node && node.ownerDocument ? node.ownerDocument.defaultView : node;
return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);
}
if (d3_document) {
try {
Expand Down
4 changes: 2 additions & 2 deletions d3.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Package.describe({
name: "d3js:d3", // http://atmospherejs.com/d3js/d3
summary: "D3 (official): A JavaScript visualization library for HTML and SVG.",
version: "3.5.4",
version: "3.5.5",
git: "https://github.com/mbostock/d3.git"
});

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "d3",
"version": "3.5.4",
"version": "3.5.5",
"description": "A JavaScript visualization library for HTML and SVG.",
"keywords": [
"dom",
Expand Down
10 changes: 8 additions & 2 deletions src/core/document.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
var d3_document = this.document;

function d3_documentElement(node) {
return node && (node.ownerDocument || node.document).documentElement;
return node
&& (node.ownerDocument // node is a Node
|| node.document // node is a Window
|| node).documentElement; // node is a Document
}

function d3_window(node) {
return node && node.ownerDocument ? node.ownerDocument.defaultView : node;
return node
&& ((node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
|| (node.document && node) // node is a Window
|| node.defaultView); // node is a Document
}
2 changes: 1 addition & 1 deletion src/start.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
!function(){
var d3 = {version: "3.5.4"}; // semver
var d3 = {version: "3.5.5"}; // semver
50 changes: 50 additions & 0 deletions test/core/document-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
var vows = require("vows"),
load = require("../load"),
assert = require("../assert");

var suite = vows.describe("document");

suite.addBatch({
"d3_documentElement": {
topic: load("core/document").document().expression("{document:document,window:window,d3_documentElement:d3_documentElement}"),
"the document element exists": function(_) {
assert.strictEqual(_.document.documentElement.nodeType, 1);
assert.strictEqual(_.document.documentElement.nodeName, "HTML");
assert.strictEqual(_.document.defaultView, _.window);
},
"given a node, returns the node’s document element": function(_) {
assert.strictEqual(_.d3_documentElement(_.document.body), _.document.documentElement);
},
"given a document, returns the document’s document element": function(_) {
assert.strictEqual(_.d3_documentElement(_.document), _.document.documentElement);
},
"given a window, returns the window’s document’s document element": function(_) {
assert.strictEqual(_.d3_documentElement(_.window), _.document.documentElement);
},
"returns undefined for anything else": function(_) {
assert.isUndefined(_.d3_documentElement({}));
}
},
"d3_window": {
topic: load("core/document").document().expression("{document:document,window:window,d3_window:d3_window}"),
"the document element exists": function(_) {
assert.strictEqual(_.document.documentElement.nodeType, 1);
assert.strictEqual(_.document.documentElement.nodeName, "HTML");
assert.strictEqual(_.document.defaultView, _.window);
},
"given a node, returns its owner document’s default view": function(_) {
assert.strictEqual(_.d3_window(_.document.body), _.window);
},
"given a document, returns its default view": function(_) {
assert.strictEqual(_.d3_window(_.document), _.window);
},
"given a window, returns the window": function(_) {
assert.strictEqual(_.d3_window(_.window), _.window);
},
"returns undefined for anything else": function(_) {
assert.isUndefined(_.d3_window({}));
}
}
});

suite.export(module);
3 changes: 1 addition & 2 deletions test/load.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ module.exports = function() {
expression = "d3",
sandbox = {console: console, Date: Date}; // so we can use deepEqual in tests

files.unshift("src/start");
files.push("src/end");
files.unshift("test/start");

function topic() {
var callback = this.callback;
Expand Down
25 changes: 25 additions & 0 deletions test/selection/select-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,34 @@ suite.addBatch({
var body = d3.select("body").node(),
div = d3.select(body.lastChild);
assert.isTrue(div[0][0] === body.lastChild);
assert.isTrue(div[0].parentNode === body.ownerDocument.documentElement);
assert.lengthOf(div, 1);
assert.lengthOf(div[0], 1);
},
"selects a document": function(d3) {
var document = d3.selection().node().ownerDocument,
selection = d3.select(document);
assert.isTrue(selection[0][0] === document);
assert.isTrue(selection[0].parentNode === document.documentElement);
assert.lengthOf(selection, 1);
assert.lengthOf(selection[0], 1);
},
"selects a window": function(d3) {
var window = d3.selection().node().ownerDocument.defaultView,
selection = d3.select(window);
assert.isTrue(selection[0][0] === window);
assert.isTrue(selection[0].parentNode === window.document.documentElement);
assert.lengthOf(selection, 1);
assert.lengthOf(selection[0], 1);
},
"selects an arbitrary object": function(d3) {
var object = {},
selection = d3.select(object);
assert.isTrue(selection[0][0] === object);
assert.isTrue(selection[0].parentNode === undefined);
assert.lengthOf(selection, 1);
assert.lengthOf(selection[0], 1);
},
"sets the parentNode to the document element": function(d3) {
var selection = d3.select("body"),
document = d3.selection().node().ownerDocument;
Expand Down
1 change: 1 addition & 0 deletions test/start.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
var d3 = {version: "0.0.1"}; // semver

0 comments on commit a40a611

Please sign in to comment.