diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc
index 07f825e661..12c3dc27ac 100644
--- a/src/objectliterals.jsdoc
+++ b/src/objectliterals.jsdoc
@@ -681,7 +681,14 @@
/**
* @typedef {Object} olx.source.ImageCanvasOptions
* @property {Array.
|undefined} attributions Attributions.
- * @property {ol.CanvasFunctionType} canvasFunction Canvas function.
+ * @property {ol.CanvasFunctionType} canvasFunction Canvas function. The function
+ * returning the canvas element used by the source as an image. The arguments
+ * passed to the function are: `{ol.Extent}` the image extent, `{number}` the
+ * image resolution, `{number}` the device pixel ratio, `{ol.Size}` the image
+ * size, and `{ol.proj.Projection}` the image projection. The canvas returned
+ * by this function is cached by the source. If the value returned by the
+ * function is later changed then `dispatchChangeEvent` should be called on
+ * the source for the source to invalidate the current cached image.
* @property {ol.Extent|undefined} extent Extent.
* @property {string|undefined} logo Logo.
* @property {ol.proj.ProjectionLike} projection Projection.
diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js
index f91af05f19..e34ada59f3 100644
--- a/src/ol/layer/vectorlayer.js
+++ b/src/ol/layer/vectorlayer.js
@@ -77,6 +77,9 @@ goog.exportProperty(
/**
+ * If the styles are changed by setting a new style function or by changing the
+ * value returned by the style function then `dispatchChangeEvent` should be
+ * called on the layer for the layer to be refreshed on the screen.
* @param {ol.feature.StyleFunction|undefined} styleFunction Style function.
*/
ol.layer.Vector.prototype.setStyleFunction = function(styleFunction) {
diff --git a/src/ol/observable.exports b/src/ol/observable.exports
index 1721abd5bd..cd9d88898b 100644
--- a/src/ol/observable.exports
+++ b/src/ol/observable.exports
@@ -1,4 +1,5 @@
@exportSymbol ol.Observable
+@exportProperty ol.Observable.prototype.dispatchChangeEvent
@exportProperty ol.Observable.prototype.on
@exportProperty ol.Observable.prototype.once
@exportProperty ol.Observable.prototype.un
diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
index 6e4a9e4edb..45fcf8b1fd 100644
--- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
+++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
@@ -189,10 +189,11 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
var frameStateExtent = frameState.extent;
var frameStateResolution = frameState.view2DState.resolution;
var pixelRatio = frameState.pixelRatio;
+ var vectorLayerRevision = vectorLayer.getRevision();
if (!this.dirty_ &&
this.renderedResolution_ == frameStateResolution &&
- this.renderedRevision_ == vectorSource.getRevision() &&
+ this.renderedRevision_ == vectorLayerRevision &&
ol.extent.containsExtent(this.renderedExtent_, frameStateExtent)) {
return;
}
@@ -230,7 +231,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
replayGroup.finish();
this.renderedResolution_ = frameStateResolution;
- this.renderedRevision_ = vectorSource.getRevision();
+ this.renderedRevision_ = vectorLayerRevision;
if (!replayGroup.isEmpty()) {
this.replayGroup_ = replayGroup;
}