From 989ddb51341f6835331c8f5cb0ea080543e3888f Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 30 Jan 2019 20:37:16 +0000 Subject: [PATCH] Invalidate TileSource cache on property changes (#8594) * Invalidate TileSource cache on property changes * Add unit test --- bokehjs/src/lib/models/tiles/tile_renderer.ts | 1 + bokehjs/src/lib/models/tiles/tile_source.ts | 21 ++++++++++++++++++- .../test/models/tiles/tile_renderer.coffee | 9 ++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/bokehjs/src/lib/models/tiles/tile_renderer.ts b/bokehjs/src/lib/models/tiles/tile_renderer.ts index c2adb9c8d95..2e3e2de3257 100644 --- a/bokehjs/src/lib/models/tiles/tile_renderer.ts +++ b/bokehjs/src/lib/models/tiles/tile_renderer.ts @@ -52,6 +52,7 @@ export class TileRendererView extends RendererView { connect_signals(): void { super.connect_signals() this.connect(this.model.change, () => this.request_render()) + this.connect(this.model.tile_source.change, () => this.request_render()) } get_extent(): Extent { diff --git a/bokehjs/src/lib/models/tiles/tile_source.ts b/bokehjs/src/lib/models/tiles/tile_source.ts index cae075fa885..32ae0389fd9 100644 --- a/bokehjs/src/lib/models/tiles/tile_source.ts +++ b/bokehjs/src/lib/models/tiles/tile_source.ts @@ -20,7 +20,17 @@ export namespace TileSource { initial_resolution: number } - export interface Props extends Model.Props {} + export interface Props extends Model.Props { + url: p.Property + tile_size: p.Property + max_zoom: p.Property + min_zoom: p.Property + extra_url_vars: p.Property<{[key: string]: string}> + attribution: p.Property + x_origin_offset: p.Property + y_origin_offset: p.Property + initial_resolution: p.Property + } } export interface TileSource extends TileSource.Attrs {} @@ -60,6 +70,11 @@ export abstract class TileSource extends Model { this._normalize_case() } + connect_signals(): void { + super.connect_signals() + this.connect(this.change, () => this._clear_cache()) + } + string_lookup_replace(str: string, lookup: {[key: string]: string}): string { let result_str = str for (const key in lookup) { @@ -85,6 +100,10 @@ export abstract class TileSource extends Model { this.url = url } + protected _clear_cache(): void { + this.tiles = {} + } + tile_xyz_to_key(x: number, y: number, z: number): string { return `${x}:${y}:${z}` } diff --git a/bokehjs/test/models/tiles/tile_renderer.coffee b/bokehjs/test/models/tiles/tile_renderer.coffee index 9cb6908178d..ccef032bd42 100644 --- a/bokehjs/test/models/tiles/tile_renderer.coffee +++ b/bokehjs/test/models/tiles/tile_renderer.coffee @@ -131,6 +131,15 @@ describe "tile sources", -> expect(t[0]).to.be.within(3, 4) expect(t[1]).to.be.within(3, 4) + it "should invalidate cache on property change", -> + tile_options = + url : 'http://mock/{x}/{y}/{z}.png' + tile_source = new TileSource(tile_options) + tile = {tile_coords: [0, 1, 2]} + tile_source.tiles['mock_key'] = tile + tile_source.url = 'http://mock/{x}/{y}/{z}.png' + expect(tile_source.tiles).to.be.empty + describe "tms tile source", -> url = 'http://c.tiles.mapbox.com/v3/examples.map-szwdot65/{Z}/{X}/{Y}.png' source = new TMSTileSource({url: url})