Implement a simple image cache for Sky in Dart. This doesn't yet do any eviction from the cache.

R=abarth@chromium.org, abarth

Review URL: https://codereview.chromium.org/1165753004
This commit is contained in:
Collin Jackson 2015-06-02 10:44:48 -07:00
parent 568b39c889
commit f396442e0a
7 changed files with 67 additions and 21 deletions

View File

@ -13,16 +13,13 @@ namespace blink {
CanvasImageLoader::CanvasImageLoader(const String& src, PassOwnPtr<ImageLoaderCallback> callback)
: callback_(callback) {
// TODO(jackson): Figure out how to determine the proper base URL here
url_ = KURL(KURL(), src);
KURL url = KURL(KURL(), src);
fetcher_ = adoptPtr(new MojoFetcher(this, url));
}
CanvasImageLoader::~CanvasImageLoader() {
}
void CanvasImageLoader::load() {
fetcher_ = adoptPtr(new MojoFetcher(this, url_));
}
void CanvasImageLoader::OnReceivedResponse(mojo::URLResponsePtr response) {
if (response->status_code != 200) {
callback_->handleEvent(nullptr);

View File

@ -28,8 +28,6 @@ class CanvasImageLoader : public MojoFetcher::Client,
}
virtual ~CanvasImageLoader();
void load();
// MojoFetcher::Client
void OnReceivedResponse(mojo::URLResponsePtr) override;
@ -43,8 +41,6 @@ class CanvasImageLoader : public MojoFetcher::Client,
OwnPtr<MojoFetcher> fetcher_;
OwnPtr<mojo::common::DataPipeDrainer> drainer_;
RefPtr<SharedBuffer> buffer_;
KURL url_;
OwnPtr<ImageLoaderCallback> callback_;
};

View File

@ -6,5 +6,4 @@
Constructor(DOMString src, ImageLoaderCallback callback),
ImplementedAs=CanvasImageLoader,
] interface ImageLoader {
void load();
};

View File

@ -6,6 +6,6 @@
Constructor(),
ImplementedAs=CanvasImage,
] interface Image {
readonly attribute long width;
readonly attribute long height;
readonly attribute long width; // width in number of image pixels
readonly attribute long height; // height in number of image pixels
};

View File

@ -3,10 +3,13 @@
// found in the LICENSE file.
import 'dart:sky';
import 'package:sky/framework/net/image_cache.dart' as image_cache;
double timeBase = null;
Image image = null;
String url1 = "https://www.dartlang.org/logos/dart-logo.png";
String url2 = "http://i2.kym-cdn.com/photos/images/facebook/000/581/296/c09.jpg";
void beginFrame(double timeStamp) {
if (timeBase == null) timeBase = timeStamp;
@ -22,15 +25,32 @@ void beginFrame(double timeStamp) {
view.scheduleFrame();
}
void handleImageLoad(result) {
if (result != image) {
print("${result.width}x${result.width} image loaded!");
image = result;
view.scheduleFrame();
} else {
print("Existing image was loaded again");
}
}
bool handleEvent(Event event) {
if (event.type == "pointerdown") {
return true;
}
if (event.type == "pointerup") {
image_cache.load(url2, handleImageLoad);
return true;
}
return false;
}
void main() {
new ImageLoader("https://www.dartlang.org/logos/dart-logo.png", (result) {
if (result != null) {
print("${result.width}x${result.width} image loaded!");
image = result;
view.scheduleFrame();
} else {
print("Image failed to load");
}
}).load();
image_cache.load(url1, handleImageLoad);
image_cache.load(url1, handleImageLoad);
view.setEventCallback(handleEvent);
view.setBeginFrameCallback(beginFrame);
}

View File

@ -93,6 +93,7 @@ dart_pkg("sdk") {
"lib/framework/fn2.dart",
"lib/framework/layout.dart",
"lib/framework/net/fetch.dart",
"lib/framework/net/image_cache.dart",
"lib/framework/node.dart",
"lib/framework/reflect.dart",
"lib/framework/rendering/render_block.dart",

View File

@ -0,0 +1,33 @@
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:sky' as sky;
import 'dart:collection';
final HashMap<String, List<sky.ImageLoaderCallback>> _pendingRequests =
new HashMap<String, List<sky.ImageLoaderCallback>>();
final HashMap<String, sky.Image> _completedRequests =
new HashMap<String, sky.Image>();
void load(String url, sky.ImageLoaderCallback callback) {
sky.Image result = _completedRequests[url];
if (result != null) {
callback(_completedRequests[url]);
return;
}
bool newRequest = false;
_pendingRequests.putIfAbsent(url, () {
newRequest = true;
return new List<sky.ImageLoaderCallback>();
}).add(callback);
if (newRequest) {
new sky.ImageLoader(url, (image) {
_completedRequests[url] = image;
_pendingRequests[url].forEach((c) => c(image));
_pendingRequests.remove(url);
});
}
}