| var HtmlToDom = require('./htmltodom').HtmlToDom, |
| jsdom = require('../../jsdom'), |
| defineGetter = require('../utils').defineGetter, |
| defineSetter = require('../utils').defineSetter, |
| Window = require('./Window'); |
| |
| function windowAugmentation(document) { |
| var window = createWindow(document); |
| |
| if (document.addEventListener) { |
| if (document.readyState == 'complete') { |
| var ev = document.createEvent('HTMLEvents'); |
| ev.initEvent('load', false, false); |
| process.nextTick(function () { |
| window.dispatchEvent(ev); |
| }); |
| } |
| else { |
| document.addEventListener('load', function(ev) { |
| window.dispatchEvent(ev); |
| }); |
| } |
| } |
| |
| return window; |
| }; |
| |
| function createWindow(document) { |
| var window = new Window(document); |
| |
| // Set up the window as if it's a top level window. |
| // If it's not, then references will be corrected by frame/iframe code. |
| // Note: window.frames is maintained in the HTMLFrameElement init function. |
| window.window = window.frames |
| = window.self |
| = window.parent |
| = window.top = window; |
| |
| return window; |
| }; |
| |
| /** |
| * Augments the given DOM by adding browser-specific properties and methods (BOM). |
| * Returns the augmented DOM. |
| */ |
| // TODO: this function is HORIBBLE. It modifies the *shared* `dom` variable with document-specific stuff. |
| // We call it in `jsdom.jsdom`, i.e. per-document. The checks `if (dom._augment && ...)` just mean that it won't modify |
| // the global twice *for the same options*. Bad stuff. |
| // |
| // None of the properties set here should be on `dom`, really. |
| exports.browserAugmentation = function (dom, options) { |
| if (!options) { |
| options = {}; |
| } |
| |
| var parser = options.parser; |
| |
| if (dom._augmented && dom._parser === parser && dom._parsingMode === options.parsingMode) { |
| return dom; |
| } |
| |
| dom._parser = parser; |
| dom._parsingMode = options.parsingMode; |
| var htmltodom = new HtmlToDom(parser, options.parsingMode); |
| dom.Document.prototype._htmlToDom = htmltodom; |
| dom.Document.prototype._domImpl = dom.DOMImplementation; |
| |
| defineGetter(dom.Document.prototype, 'parentWindow', function() { |
| if (!this._parentWindow) { |
| this._parentWindow = windowAugmentation(this); |
| } |
| return this._parentWindow; |
| }); |
| |
| dom._augmented = true; |
| return dom; |
| }; |