delegates.AbstractBrowser = function (options) { 'use strict'; var win = options.window; if (!win && typeof window === 'object') { win = window; } this.getDocument = function() { return win.document; }; this.getWindow = function() { return win; }; this.getHistory = function() { return win.history; }; this.getLocation = function() { return win.location; }; this.getLocalStorage = function() { return win.localStorage; }; this.getSessionStorage = function() { return win.sessionStorage; }; this.getNavigator = function() { return win.navigator; }; // constructor validations if (!win) throw new Error('AbstractBrowser requires a window object'); // complete the window object by assigning local and session storage if (!win.localStorage) win.localStorage = options.localStorage; if (!win.sessionStorage) win.sessionStorage = options.sessionStorage; }
n/a
mocks.MockBrowser = function (options) { 'use strict'; var win, opts; if (!options) { options = {}; } if (options.window) { // user has already created a jsdom window with document. win = options.window; } else { var doc = jsdom('<!DOCTYPE html><html><body></body></html>' ); win = doc.defaultView; } if (!win.localStorage) { (win).localStorage = options.localStorage || new MockStorage(); } if (!win.sessionStorage) { (win).sessionStorage = options.sessionStorage = new MockStorage(); } opts = dash.clone( options ); opts.window = win; AbstractBrowser.extend( this, opts ); }
n/a
AbstractBrowser = function (options) { 'use strict'; var win = options.window; if (!win && typeof window === 'object') { win = window; } this.getDocument = function() { return win.document; }; this.getWindow = function() { return win; }; this.getHistory = function() { return win.history; }; this.getLocation = function() { return win.location; }; this.getLocalStorage = function() { return win.localStorage; }; this.getSessionStorage = function() { return win.sessionStorage; }; this.getNavigator = function() { return win.navigator; }; // constructor validations if (!win) throw new Error('AbstractBrowser requires a window object'); // complete the window object by assigning local and session storage if (!win.localStorage) win.localStorage = options.localStorage; if (!win.sessionStorage) win.sessionStorage = options.sessionStorage; }
n/a
AbstractBrowser = function (options) { 'use strict'; var win = options.window; if (!win && typeof window === 'object') { win = window; } this.getDocument = function() { return win.document; }; this.getWindow = function() { return win; }; this.getHistory = function() { return win.history; }; this.getLocation = function() { return win.location; }; this.getLocalStorage = function() { return win.localStorage; }; this.getSessionStorage = function() { return win.sessionStorage; }; this.getNavigator = function() { return win.navigator; }; // constructor validations if (!win) throw new Error('AbstractBrowser requires a window object'); // complete the window object by assigning local and session storage if (!win.localStorage) win.localStorage = options.localStorage; if (!win.sessionStorage) win.sessionStorage = options.sessionStorage; }
n/a
extend = function (child, options) { 'use strict'; var parent = new AbstractBrowser( options ); dash.functionsIn( parent ).forEach(function(method) { child[ method ] = parent[ method ]; }); return parent; }
...
* getNavigator()
* getHistory()
* getLocalStorage()
* getSessionStorage()
Object Methods...
* AbstractBrowser.extend(child, options) <- extend the abstract object
These methods are inherited by MockBrowser to provide a consistent interface between test and run-time environments.
### Extending AbstractBrowser
For run-time use you can extend AbstractBrowser to inherit the API. This enables attaching other object to the browser object rather
than using globals.
...
MockBrowser = function (options) { 'use strict'; var win, opts; if (!options) { options = {}; } if (options.window) { // user has already created a jsdom window with document. win = options.window; } else { var doc = jsdom('<!DOCTYPE html><html><body></body></html>' ); win = doc.defaultView; } if (!win.localStorage) { (win).localStorage = options.localStorage || new MockStorage(); } if (!win.sessionStorage) { (win).sessionStorage = options.sessionStorage = new MockStorage(); } opts = dash.clone( options ); opts.window = win; AbstractBrowser.extend( this, opts ); }
n/a
MockStorage = function (data) { 'use strict'; var storage = this; if (!data) data = {}; var keylist = dash.keys(data); var nullOrValue = function(value) { return dash.isUndefined(value) ? null : value; }; this.key = function(index) { var key = keylist[index]; return nullOrValue(key); }; this.setItem = function(key, value) { if (!dash.includes(keylist, key)) keylist.push(key); data[ key ] = value; storage.length = dash.size( data ); }; this.getItem = function(key) { var value = data[ key ]; return nullOrValue(value); }; this.removeItem = function(key) { delete data [ key ]; keylist = dash.without( keylist, key ); storage.length = dash.size( data ); }; this.clear = function() { var keys = dash.keys( data ); var remove = this.removeItem; keys.forEach(function(key) { remove(key); }); }; this.length = dash.size( data ); this.__protected = function() { return { data:data }; }; }
n/a
MockBrowser = function (options) { 'use strict'; var win, opts; if (!options) { options = {}; } if (options.window) { // user has already created a jsdom window with document. win = options.window; } else { var doc = jsdom('<!DOCTYPE html><html><body></body></html>' ); win = doc.defaultView; } if (!win.localStorage) { (win).localStorage = options.localStorage || new MockStorage(); } if (!win.sessionStorage) { (win).sessionStorage = options.sessionStorage = new MockStorage(); } opts = dash.clone( options ); opts.window = win; AbstractBrowser.extend( this, opts ); }
n/a
createDocument = function () { 'use strict'; var browser = new MockBrowser(); return browser.getDocument(); }
...
assert storage.getItem('mykey') === 'my value';
~~~
### Mock Browser Object Methods
Two convenience methods are added to make it easy to get either a window or DOM document mock.
* MockBrowser.createDocument()
* MockBrowser.createWindow()
### Abstract Browser
The AbstractBrowser object can be used as an interface for run-time client apps to access browser window related objects. This
approach enables code to be used both in and outside the browser.
~~~
...
createWindow = function () { 'use strict'; var browser = new MockBrowser(); return browser.getWindow(); }
...
~~~
### Mock Browser Object Methods
Two convenience methods are added to make it easy to get either a window or DOM document mock.
* MockBrowser.createDocument()
* MockBrowser.createWindow()
### Abstract Browser
The AbstractBrowser object can be used as an interface for run-time client apps to access browser window related objects. This
approach enables code to be used both in and outside the browser.
~~~
var AbstractBrowser = require('mock-browser').delegates.AbstractBrowser;
...