Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a73335839 | ||
|
|
124badb961 | ||
|
|
8725b4fcf4 | ||
|
|
d12dce1c03 | ||
|
|
afb8efc0e9 | ||
|
|
bef31dc386 | ||
|
|
e8cd5e322f |
13
changelog/v3.14.2.md
Normal file
13
changelog/v3.14.2.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# v3.14.2
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
The v3.14.2 release is a patch release that addresses a few regressions in the v3.14.1 release. See the [v3.14.0 release notes](https://github.com/openlayers/ol3/releases/tag/v3.14.0) for details on upgrading from v3.13.x.
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* [#4963](https://github.com/openlayers/ol3/pull/4963) - Handle more XHR errors in the TileJSON source ([@tschaub](https://github.com/tschaub))
|
||||||
|
* [#4960](https://github.com/openlayers/ol3/pull/4960) - Simplify clipping of lower resolution regions ([@ahocevar](https://github.com/ahocevar))
|
||||||
|
* [#4958](https://github.com/openlayers/ol3/pull/4958) - Stop wheel events instead of DOMMouseScroll events ([@fredj](https://github.com/fredj))
|
||||||
|
* [#4956](https://github.com/openlayers/ol3/pull/4956) - Fix Examples layout page ([@jonataswalker](https://github.com/jonataswalker))
|
||||||
|
* [#4809](https://github.com/openlayers/ol3/pull/4809) - Fix multipolygon clone. ([@fperucic](https://github.com/fperucic))
|
||||||
@@ -18,8 +18,10 @@
|
|||||||
<body>
|
<body>
|
||||||
|
|
||||||
<header class="navbar" role="navigation">
|
<header class="navbar" role="navigation">
|
||||||
<div class="container" id="navbar-inner-container">
|
<div class="container">
|
||||||
<a class="navbar-brand" href="./"><img src="./resources/logo-70x70.png"> OpenLayers 3 Examples</a>
|
<div class="display-table pull-left" id="navbar-logo-container">
|
||||||
|
<a class="navbar-brand" href="./"><img src="./resources/logo-70x70.png"> OpenLayers 3 Examples</a>
|
||||||
|
</div>
|
||||||
<ul class="nav navbar-nav pull-right">
|
<ul class="nav navbar-nav pull-right">
|
||||||
<li><a href="../doc">Docs</a></li>
|
<li><a href="../doc">Docs</a></li>
|
||||||
<li><a class="active" href="index.html">Examples</a></li>
|
<li><a class="active" href="index.html">Examples</a></li>
|
||||||
|
|||||||
@@ -11,9 +11,6 @@
|
|||||||
body {
|
body {
|
||||||
padding-top: 70px;
|
padding-top: 70px;
|
||||||
}
|
}
|
||||||
.navbar-form {
|
|
||||||
margin-top: 12px;
|
|
||||||
}
|
|
||||||
input.search-query {
|
input.search-query {
|
||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
@@ -186,11 +183,13 @@
|
|||||||
|
|
||||||
<header class="navbar navbar-fixed-top" role="navigation">
|
<header class="navbar navbar-fixed-top" role="navigation">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<a class="navbar-brand" href="./"><img src="./resources/logo-70x70.png"> OpenLayers 3 Examples</a>
|
<div class="display-table pull-left">
|
||||||
<form class="navbar-form navbar-left search-form" role="search">
|
<a class="navbar-brand" href="./"><img src="./resources/logo-70x70.png"> OpenLayers 3 Examples</a>
|
||||||
<input name="q" type="text" id="keywords" class="search-query" placeholder="Search" autofocus>
|
<form class="navbar-form" role="search">
|
||||||
<span id="count"></span>
|
<input name="q" type="text" id="keywords" class="search-query" placeholder="Search" autofocus>
|
||||||
</form>
|
<span id="count"></span>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
<ul class="nav navbar-nav pull-right">
|
<ul class="nav navbar-nav pull-right">
|
||||||
<li><a href="../doc">Docs</a></li>
|
<li><a href="../doc">Docs</a></li>
|
||||||
<li><a class="active" href="index.html">Examples</a></li>
|
<li><a class="active" href="index.html">Examples</a></li>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var container = document.getElementById('navbar-inner-container');
|
var container = document.getElementById('navbar-logo-container');
|
||||||
if (!container) {
|
if (!container) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
|
|
||||||
select.className = 'input-medium';
|
select.className = 'input-medium';
|
||||||
|
|
||||||
form.className = 'navbar-form pull-right version-form';
|
form.className = 'navbar-form version-form';
|
||||||
form.appendChild(select);
|
form.appendChild(select);
|
||||||
|
|
||||||
container.appendChild(form);
|
container.appendChild(form);
|
||||||
|
|||||||
@@ -32,12 +32,15 @@ body {
|
|||||||
.navbar-nav>li>a {
|
.navbar-nav>li>a {
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
.search-form, .version-form {
|
.display-table {
|
||||||
position: absolute;
|
display: table;
|
||||||
left: 450px;
|
}
|
||||||
|
.version-form, .navbar-form {
|
||||||
|
display: table-cell;
|
||||||
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
.version-form {
|
.version-form {
|
||||||
top: 5px;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
#title {
|
#title {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "openlayers",
|
"name": "openlayers",
|
||||||
"version": "3.14.1",
|
"version": "3.14.2",
|
||||||
"description": "Build tools and sources for developing OpenLayers based mapping applications",
|
"description": "Build tools and sources for developing OpenLayers based mapping applications",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"map",
|
"map",
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ ol.geom.MultiPolygon.prototype.clone = function() {
|
|||||||
var len = this.endss_.length;
|
var len = this.endss_.length;
|
||||||
var newEndss = new Array(len);
|
var newEndss = new Array(len);
|
||||||
for (var i = 0; i < len; ++i) {
|
for (var i = 0; i < len; ++i) {
|
||||||
newEndss[i] = this.endss_.slice();
|
newEndss[i] = this.endss_[i].slice();
|
||||||
}
|
}
|
||||||
|
|
||||||
multiPolygon.setFlatCoordinates(
|
multiPolygon.setFlatCoordinates(
|
||||||
|
|||||||
@@ -291,7 +291,8 @@ ol.Map = function(options) {
|
|||||||
ol.events.EventType.TOUCHSTART,
|
ol.events.EventType.TOUCHSTART,
|
||||||
ol.events.EventType.MSPOINTERDOWN,
|
ol.events.EventType.MSPOINTERDOWN,
|
||||||
ol.MapBrowserEvent.EventType.POINTERDOWN,
|
ol.MapBrowserEvent.EventType.POINTERDOWN,
|
||||||
goog.userAgent.GECKO ? 'DOMMouseScroll' : ol.events.EventType.MOUSEWHEEL
|
ol.events.EventType.MOUSEWHEEL,
|
||||||
|
ol.events.EventType.WHEEL
|
||||||
];
|
];
|
||||||
for (var i = 0, ii = overlayEvents.length; i < ii; ++i) {
|
for (var i = 0, ii = overlayEvents.length; i < ii; ++i) {
|
||||||
ol.events.listen(this.overlayContainerStopEvent_, overlayEvents[i],
|
ol.events.listen(this.overlayContainerStopEvent_, overlayEvents[i],
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ goog.require('ol.array');
|
|||||||
goog.require('ol.dom');
|
goog.require('ol.dom');
|
||||||
goog.require('ol.extent');
|
goog.require('ol.extent');
|
||||||
goog.require('ol.layer.Tile');
|
goog.require('ol.layer.Tile');
|
||||||
goog.require('ol.object');
|
|
||||||
goog.require('ol.render.EventType');
|
goog.require('ol.render.EventType');
|
||||||
goog.require('ol.renderer.canvas.Layer');
|
goog.require('ol.renderer.canvas.Layer');
|
||||||
goog.require('ol.source.Tile');
|
goog.require('ol.source.Tile');
|
||||||
@@ -24,12 +23,6 @@ ol.renderer.canvas.TileLayer = function(tileLayer) {
|
|||||||
|
|
||||||
goog.base(this, tileLayer);
|
goog.base(this, tileLayer);
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @type {!Object.<string, Array.<ol.TileCoord>>}
|
|
||||||
*/
|
|
||||||
this.clipTileCoords_ = {};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {CanvasRenderingContext2D}
|
* @type {CanvasRenderingContext2D}
|
||||||
@@ -95,60 +88,56 @@ ol.renderer.canvas.TileLayer.prototype.composeFrame = function(
|
|||||||
var tileGrid = source.getTileGridForProjection(projection);
|
var tileGrid = source.getTileGridForProjection(projection);
|
||||||
var tilesToDraw = this.renderedTiles_;
|
var tilesToDraw = this.renderedTiles_;
|
||||||
|
|
||||||
var clipExtent, clipH, clipLeft, clipOrigin, clipTileCoord, clipTileCoords;
|
var pixelExtents;
|
||||||
var clipTop, clipW, currentZ, h, i, ii, j, jj, left, origin, tile, tileExtent;
|
var opaque = source.getOpaque(projection) && layerState.opacity == 1;
|
||||||
var tilePixelSize, top, w;
|
if (!opaque) {
|
||||||
for (i = 0, ii = tilesToDraw.length; i < ii; ++i) {
|
tilesToDraw.reverse();
|
||||||
tile = tilesToDraw[i];
|
pixelExtents = [];
|
||||||
tileExtent = tileGrid.getTileCoordExtent(
|
}
|
||||||
tile.getTileCoord(), this.tmpExtent_);
|
for (var i = 0, ii = tilesToDraw.length; i < ii; ++i) {
|
||||||
currentZ = tile.getTileCoord()[0];
|
var tile = tilesToDraw[i];
|
||||||
|
var tileCoord = tile.getTileCoord();
|
||||||
|
var tileExtent = tileGrid.getTileCoordExtent(tileCoord, this.tmpExtent_);
|
||||||
|
var currentZ = tileCoord[0];
|
||||||
// Calculate all insert points by tile widths from a common origin to avoid
|
// Calculate all insert points by tile widths from a common origin to avoid
|
||||||
// gaps caused by rounding
|
// gaps caused by rounding
|
||||||
origin = ol.extent.getBottomLeft(tileGrid.getTileCoordExtent(
|
var origin = ol.extent.getBottomLeft(tileGrid.getTileCoordExtent(
|
||||||
tileGrid.getTileCoordForCoordAndZ(center, currentZ)));
|
tileGrid.getTileCoordForCoordAndZ(center, currentZ)));
|
||||||
w = Math.round(ol.extent.getWidth(tileExtent) * pixelScale);
|
var w = Math.round(ol.extent.getWidth(tileExtent) * pixelScale);
|
||||||
h = Math.round(ol.extent.getHeight(tileExtent) * pixelScale);
|
var h = Math.round(ol.extent.getHeight(tileExtent) * pixelScale);
|
||||||
left = Math.round((tileExtent[0] - origin[0]) * pixelScale / w) * w +
|
var left = Math.round((tileExtent[0] - origin[0]) * pixelScale / w) * w +
|
||||||
offsetX + Math.round((origin[0] - center[0]) * pixelScale);
|
offsetX + Math.round((origin[0] - center[0]) * pixelScale);
|
||||||
top = Math.round((origin[1] - tileExtent[3]) * pixelScale / h) * h +
|
var top = Math.round((origin[1] - tileExtent[3]) * pixelScale / h) * h +
|
||||||
offsetY + Math.round((center[1] - origin[1]) * pixelScale);
|
offsetY + Math.round((center[1] - origin[1]) * pixelScale);
|
||||||
clipTileCoords = this.clipTileCoords_[tile.tileCoord.toString()];
|
if (!opaque) {
|
||||||
if (clipTileCoords) {
|
var pixelExtent = [left, top, left + w, top + h];
|
||||||
// Create a clip mask for regions in this low resolution tile that will be
|
// Create a clip mask for regions in this low resolution tile that are
|
||||||
// filled by a higher resolution tile
|
// already filled by a higher resolution tile
|
||||||
renderContext.save();
|
renderContext.save();
|
||||||
renderContext.beginPath();
|
for (var j = 0, jj = pixelExtents.length; j < jj; ++j) {
|
||||||
// counter-clockwise (outer ring) for current tile
|
var clipExtent = pixelExtents[j];
|
||||||
renderContext.moveTo(left + w, top);
|
if (ol.extent.intersects(pixelExtent, clipExtent)) {
|
||||||
renderContext.lineTo(left, top);
|
renderContext.beginPath();
|
||||||
renderContext.lineTo(left, top + h);
|
// counter-clockwise (outer ring) for current tile
|
||||||
renderContext.lineTo(left + w, top + h);
|
renderContext.moveTo(pixelExtent[0], pixelExtent[1]);
|
||||||
renderContext.closePath();
|
renderContext.lineTo(pixelExtent[0], pixelExtent[3]);
|
||||||
// clockwise (inner rings) for lower resolution tiles
|
renderContext.lineTo(pixelExtent[2], pixelExtent[3]);
|
||||||
for (j = 0, jj = clipTileCoords.length; j < jj; ++j) {
|
renderContext.lineTo(pixelExtent[2], pixelExtent[1]);
|
||||||
clipTileCoord = clipTileCoords[j];
|
// clockwise (inner ring) for higher resolution tile
|
||||||
clipExtent = tileGrid.getTileCoordExtent(clipTileCoord);
|
renderContext.moveTo(clipExtent[0], clipExtent[1]);
|
||||||
clipOrigin = ol.extent.getBottomLeft(tileGrid.getTileCoordExtent(
|
renderContext.lineTo(clipExtent[2], clipExtent[1]);
|
||||||
tileGrid.getTileCoordForCoordAndZ(center, clipTileCoord[0])));
|
renderContext.lineTo(clipExtent[2], clipExtent[3]);
|
||||||
clipW = Math.round(ol.extent.getWidth(clipExtent) * pixelScale);
|
renderContext.lineTo(clipExtent[0], clipExtent[3]);
|
||||||
clipH = Math.round(ol.extent.getHeight(clipExtent) * pixelScale);
|
renderContext.closePath();
|
||||||
clipLeft = Math.round((clipExtent[0] - clipOrigin[0]) * pixelScale / clipW) * clipW +
|
renderContext.clip();
|
||||||
offsetX + Math.round((clipOrigin[0] - center[0]) * pixelScale);
|
}
|
||||||
clipTop = Math.round((clipOrigin[1] - clipExtent[3]) * pixelScale / clipH) * clipH +
|
|
||||||
offsetY + Math.round((center[1] - clipOrigin[1]) * pixelScale);
|
|
||||||
renderContext.moveTo(clipLeft, clipTop + clipH);
|
|
||||||
renderContext.lineTo(clipLeft, clipTop);
|
|
||||||
renderContext.lineTo(clipLeft + clipW, clipTop);
|
|
||||||
renderContext.lineTo(clipLeft + clipW, clipTop + clipH);
|
|
||||||
renderContext.closePath();
|
|
||||||
}
|
}
|
||||||
renderContext.clip();
|
pixelExtents.push(pixelExtent);
|
||||||
}
|
}
|
||||||
tilePixelSize = source.getTilePixelSize(currentZ, pixelRatio, projection);
|
var tilePixelSize = source.getTilePixelSize(currentZ, pixelRatio, projection);
|
||||||
renderContext.drawImage(tile.getImage(), tileGutter, tileGutter,
|
renderContext.drawImage(tile.getImage(), tileGutter, tileGutter,
|
||||||
tilePixelSize[0], tilePixelSize[1], left, top, w, h);
|
tilePixelSize[0], tilePixelSize[1], left, top, w, h);
|
||||||
if (clipTileCoords) {
|
if (!opaque) {
|
||||||
renderContext.restore();
|
renderContext.restore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -266,33 +255,6 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame = function(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.renderedTiles_ = renderables;
|
this.renderedTiles_ = renderables;
|
||||||
ol.object.clear(this.clipTileCoords_);
|
|
||||||
if (!(tileSource.getOpaque(projection) && layerState.opacity == 1)) {
|
|
||||||
var clipTileCoords = this.clipTileCoords_;
|
|
||||||
var tileCoord;
|
|
||||||
for (i = renderables.length - 1; i >= 0; --i) {
|
|
||||||
tileCoord = renderables[i].getTileCoord();
|
|
||||||
tileGrid.forEachTileCoordParentTileRange(tileCoord,
|
|
||||||
function(z, tileRange) {
|
|
||||||
var tiles = tilesToDrawByZ[z];
|
|
||||||
if (tiles) {
|
|
||||||
var key, tile;
|
|
||||||
for (key in tiles) {
|
|
||||||
tile = tiles[key];
|
|
||||||
if (tileRange.contains(tile.getTileCoord()) &&
|
|
||||||
tile.getState() == ol.TileState.LOADED) {
|
|
||||||
if (!(key in clipTileCoords)) {
|
|
||||||
clipTileCoords[key] = [];
|
|
||||||
}
|
|
||||||
clipTileCoords[key].push(tileCoord);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}, this, tmpTileRange, tmpExtent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
|
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
|
||||||
this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio,
|
this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio,
|
||||||
|
|||||||
@@ -43,23 +43,47 @@ ol.source.TileJSON = function(options) {
|
|||||||
ol.net.jsonp(options.url, this.handleTileJSONResponse.bind(this),
|
ol.net.jsonp(options.url, this.handleTileJSONResponse.bind(this),
|
||||||
this.handleTileJSONError.bind(this));
|
this.handleTileJSONError.bind(this));
|
||||||
} else {
|
} else {
|
||||||
var xhr = new XMLHttpRequest();
|
var client = new XMLHttpRequest();
|
||||||
xhr.open('GET', options.url, true);
|
client.addEventListener('load', this.onXHRLoad_.bind(this));
|
||||||
xhr.onload = function(e) {
|
client.addEventListener('error', this.onXHRError_.bind(this));
|
||||||
if (xhr.status >= 200 && xhr.status < 300) {
|
client.open('GET', options.url);
|
||||||
var response = /** @type {TileJSON} */(JSON.parse(xhr.responseText));
|
client.send();
|
||||||
this.handleTileJSONResponse(response);
|
|
||||||
} else {
|
|
||||||
this.handleTileJSONError();
|
|
||||||
}
|
|
||||||
}.bind(this);
|
|
||||||
xhr.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
goog.inherits(ol.source.TileJSON, ol.source.TileImage);
|
goog.inherits(ol.source.TileJSON, ol.source.TileImage);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param {Event} event The load event.
|
||||||
|
*/
|
||||||
|
ol.source.TileJSON.prototype.onXHRLoad_ = function(event) {
|
||||||
|
var client = /** @type {XMLHttpRequest} */ (event.target);
|
||||||
|
if (client.status >= 200 && client.status < 300) {
|
||||||
|
var response;
|
||||||
|
try {
|
||||||
|
response = /** @type {TileJSON} */(JSON.parse(client.responseText));
|
||||||
|
} catch (err) {
|
||||||
|
this.handleTileJSONError();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.handleTileJSONResponse(response);
|
||||||
|
} else {
|
||||||
|
this.handleTileJSONError();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param {Event} event The error event.
|
||||||
|
*/
|
||||||
|
ol.source.TileJSON.prototype.onXHRError_ = function(event) {
|
||||||
|
this.handleTileJSONError();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
* @param {TileJSON} tileJSON Tile JSON.
|
* @param {TileJSON} tileJSON Tile JSON.
|
||||||
|
|||||||
@@ -88,6 +88,15 @@ describe('ol.geom.MultiPolygon', function() {
|
|||||||
[[[3, 0], [4, 1], [5, 2], [5, 0]]]);
|
[[[3, 0], [4, 1], [5, 2], [5, 0]]]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#clone()', function() {
|
||||||
|
|
||||||
|
it('has the expected endss_', function() {
|
||||||
|
var clone = multiPolygon.clone();
|
||||||
|
expect(multiPolygon.endss_).to.eql(clone.endss_);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
describe('#getCoordinates()', function() {
|
describe('#getCoordinates()', function() {
|
||||||
|
|
||||||
var cw = [[-180, -90], [-180, 90], [180, 90], [180, -90], [-180, -90]];
|
var cw = [[-180, -90], [-180, 90], [180, 90], [180, -90], [-180, -90]];
|
||||||
|
|||||||
@@ -4,14 +4,32 @@ goog.provide('ol.test.source.TileJSON');
|
|||||||
describe('ol.source.TileJSON', function() {
|
describe('ol.source.TileJSON', function() {
|
||||||
|
|
||||||
describe('#getState', function() {
|
describe('#getState', function() {
|
||||||
|
|
||||||
it('returns ol.source.State.ERROR on HTTP 404', function() {
|
it('returns ol.source.State.ERROR on HTTP 404', function() {
|
||||||
var changeSpy = sinon.spy(function(event) {
|
|
||||||
expect(event.target.getState()).to.eql('error');
|
|
||||||
});
|
|
||||||
var source = new ol.source.TileJSON({
|
var source = new ol.source.TileJSON({
|
||||||
url: 'invalid.jsonp'
|
url: 'invalid.jsonp'
|
||||||
});
|
});
|
||||||
ol.events.listen(source, 'change', changeSpy);
|
source.on('change', function() {
|
||||||
|
expect(source.getState()).to.eql('error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns ol.source.State.ERROR on CORS issues', function() {
|
||||||
|
var source = new ol.source.TileJSON({
|
||||||
|
url: 'http://example.com'
|
||||||
|
});
|
||||||
|
source.on('change', function() {
|
||||||
|
expect(source.getState()).to.eql('error');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns ol.source.State.ERROR on JSON parsing issues', function() {
|
||||||
|
var source = new ol.source.TileJSON({
|
||||||
|
url: '/'
|
||||||
|
});
|
||||||
|
source.on('change', function() {
|
||||||
|
expect(source.getState()).to.eql('error');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user