提交 8f975399 编写于 作者: E Eric Seidel

Move image loading out of C++ into Dart

We already know how to talk to the network_service from Dart
via fetch.dart.  Might as well use that for Image loading
as well insetad of having ImageLoader do it.

As part of this I've renamed *ImageLoader to *ImageDecoder
and moved all the image loading logic into Dart.  This required
me to teach the idl system about mojo handles so that I could
pass the resulting MojoHandle from fetch.dart up through to
ImageDecoder.

R=abarth@chromium.org, jackson@google.com, hansmuller@google.com

Review URL: https://codereview.chromium.org/1173703002.
上级 ff13e9ae
......@@ -154,6 +154,10 @@ def cpp_value(interface, method, number_of_arguments):
if idl_type.is_typed_array_type:
return '%s.get()' % argument_name
# TODO(eseidel): This should check cpp_type.endswith('Handle')
if idl_type.name == 'MojoDataPipeConsumer':
return '%s.Pass()' % argument_name
if idl_type.name == 'EventListener':
if (interface.name == 'EventTarget' and
method.name == 'removeEventListener'):
......@@ -161,9 +165,7 @@ def cpp_value(interface, method, number_of_arguments):
# EventTarget::removeEventListener
return '%s.get()' % argument_name
return argument.name
if (idl_type.is_callback_interface or
idl_type.name in ['NodeFilter', 'XPathNSResolver']):
# FIXME: remove this special case
if idl_type.is_callback_interface:
return '%s.release()' % argument_name
return argument_name
......
......@@ -116,9 +116,13 @@ CPP_SPECIAL_CONVERSION_RULES = {
'unrestricted float': 'float',
# Pass these by value, not pointer.
'Color': 'SkColor',
# These direct conversions appear to be working around
# dart_value_to_cpp_value using CPP_SPECIAL_CONVERSION_RULES directly
# instead of calling cpp_type.
'Float32List': 'Float32List',
'Point': 'Point',
'Rect': 'Rect',
'MojoDataPipeConsumer': 'mojo::ScopedDataPipeConsumerHandle',
'TransferMode': 'SkXfermode::Mode',
'PaintingStyle': 'SkPaint::Style',
}
......@@ -256,6 +260,7 @@ INCLUDES_FOR_TYPE = {
'NodeList': set(['sky/engine/core/dom/NodeList.h',
'sky/engine/core/dom/StaticNodeList.h']),
'DartValue': set(['sky/engine/tonic/dart_value.h']),
'MojoDataPipeConsumer': set(['sky/engine/tonic/mojo_converter.h']),
}
......@@ -370,6 +375,7 @@ DART_TO_CPP_VALUE = {
'Rect': pass_by_value_format('Rect'),
'TransferMode': pass_by_value_format('TransferMode'),
'PaintingStyle': pass_by_value_format('PaintingStyle'),
'MojoDataPipeConsumer': pass_by_value_format('mojo::ScopedDataPipeConsumerHandle'),
}
def dart_value_to_cpp_value(idl_type, extended_attributes, variable_name,
......@@ -512,6 +518,7 @@ IDL_TO_DART_TYPE = {
'boolean': 'bool',
'void': 'void',
'unsigned long': 'int',
'MojoDataPipeConsumer': 'int',
}
def idl_type_to_dart_type(idl_type):
......
......@@ -798,8 +798,8 @@ sky_core_files = [
"inspector/ScriptAsyncCallStack.h",
"inspector/ScriptGCEventListener.h",
"layout/LayoutCallback.h",
"loader/CanvasImageLoader.cpp",
"loader/CanvasImageLoader.h",
"loader/CanvasImageDecoder.cpp",
"loader/CanvasImageDecoder.h",
"loader/DocumentLoadTiming.cpp",
"loader/DocumentLoadTiming.h",
"loader/EmptyClients.cpp",
......@@ -812,7 +812,7 @@ sky_core_files = [
"loader/FrameLoaderTypes.h",
"loader/ImageLoader.cpp",
"loader/ImageLoader.h",
"loader/ImageLoaderCallback.h",
"loader/ImageDecoderCallback.h",
"loader/MojoLoader.cpp",
"loader/MojoLoader.h",
"loader/NavigationPolicy.h",
......@@ -1142,8 +1142,8 @@ core_idl_files = get_path_info([
"html/TextMetrics.idl",
"html/VoidCallback.idl",
"layout/LayoutCallback.idl",
"loader/ImageLoader.idl",
"loader/ImageLoaderCallback.idl",
"loader/ImageDecoder.idl",
"loader/ImageDecoderCallback.idl",
"painting/Canvas.idl",
"painting/ColorFilter.idl",
"painting/DrawLooper.idl",
......
......@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "sky/engine/config.h"
#include "sky/engine/core/loader/CanvasImageLoader.h"
#include "sky/engine/core/loader/CanvasImageDecoder.h"
#include "sky/engine/core/painting/CanvasImage.h"
#include "sky/engine/core/script/dom_dart_state.h"
#include "sky/engine/platform/SharedBuffer.h"
......@@ -11,30 +11,27 @@
namespace blink {
CanvasImageLoader::CanvasImageLoader(const String& src, PassOwnPtr<ImageLoaderCallback> callback)
: callback_(callback) {
KURL url = KURL(DOMDartState::Current()->url(), src);
fetcher_ = adoptPtr(new MojoFetcher(this, url));
PassRefPtr<CanvasImageDecoder> CanvasImageDecoder::create(
mojo::ScopedDataPipeConsumerHandle handle,
PassOwnPtr<ImageDecoderCallback> callback)
{
return adoptRef(new CanvasImageDecoder(handle.Pass(), callback));
}
CanvasImageLoader::~CanvasImageLoader() {
CanvasImageDecoder::CanvasImageDecoder(mojo::ScopedDataPipeConsumerHandle handle, PassOwnPtr<ImageDecoderCallback> callback)
: callback_(callback) {
buffer_ = SharedBuffer::create();
drainer_ = adoptPtr(new mojo::common::DataPipeDrainer(this, handle.Pass()));
}
void CanvasImageLoader::OnReceivedResponse(mojo::URLResponsePtr response) {
if (response->status_code != 200) {
callback_->handleEvent(nullptr);
return;
}
buffer_ = SharedBuffer::create();
drainer_ =
adoptPtr(new mojo::common::DataPipeDrainer(this, response->body.Pass()));
CanvasImageDecoder::~CanvasImageDecoder() {
}
void CanvasImageLoader::OnDataAvailable(const void* data, size_t num_bytes) {
void CanvasImageDecoder::OnDataAvailable(const void* data, size_t num_bytes) {
buffer_->append(static_cast<const char*>(data), num_bytes);
}
void CanvasImageLoader::OnDataComplete() {
void CanvasImageDecoder::OnDataComplete() {
OwnPtr<ImageDecoder> decoder =
ImageDecoder::create(*buffer_.get(), ImageSource::AlphaPremultiplied,
ImageSource::GammaAndColorProfileIgnored);
......
......@@ -7,41 +7,32 @@
#define SKY_ENGINE_CORE_LOADER_CANVASIMAGELOADER_H_
#include "mojo/common/data_pipe_drainer.h"
#include "sky/engine/core/loader/ImageLoaderCallback.h"
#include "sky/engine/core/loader/ImageDecoderCallback.h"
#include "sky/engine/platform/SharedBuffer.h"
#include "sky/engine/platform/fetcher/MojoFetcher.h"
#include "sky/engine/tonic/dart_wrappable.h"
#include "sky/engine/wtf/OwnPtr.h"
#include "sky/engine/wtf/text/AtomicString.h"
namespace blink {
class CanvasImageLoader : public MojoFetcher::Client,
public mojo::common::DataPipeDrainer::Client,
public RefCounted<CanvasImageLoader>,
public DartWrappable {
class CanvasImageDecoder : public mojo::common::DataPipeDrainer::Client,
public RefCounted<CanvasImageDecoder>,
public DartWrappable {
DEFINE_WRAPPERTYPEINFO();
public:
static PassRefPtr<CanvasImageLoader> create(const String& src, PassOwnPtr<ImageLoaderCallback> callback)
{
return adoptRef(new CanvasImageLoader(src, callback));
}
virtual ~CanvasImageLoader();
// MojoFetcher::Client
void OnReceivedResponse(mojo::URLResponsePtr) override;
static PassRefPtr<CanvasImageDecoder> create(mojo::ScopedDataPipeConsumerHandle handle, PassOwnPtr<ImageDecoderCallback> callback);
virtual ~CanvasImageDecoder();
// mojo::common::DataPipeDrainer::Client
void OnDataAvailable(const void*, size_t) override;
void OnDataComplete() override;
private:
explicit CanvasImageLoader(const String& src, PassOwnPtr<ImageLoaderCallback> callback);
CanvasImageDecoder(mojo::ScopedDataPipeConsumerHandle handle, PassOwnPtr<ImageDecoderCallback> callback);
OwnPtr<MojoFetcher> fetcher_;
OwnPtr<mojo::common::DataPipeDrainer> drainer_;
RefPtr<SharedBuffer> buffer_;
OwnPtr<ImageLoaderCallback> callback_;
OwnPtr<ImageDecoderCallback> callback_;
};
} // namespace blink
......
......@@ -3,7 +3,7 @@
// found in the LICENSE file.
[
Constructor(DOMString src, ImageLoaderCallback callback),
ImplementedAs=CanvasImageLoader,
] interface ImageLoader {
Constructor(MojoDataPipeConsumer consumer, ImageDecoderCallback callback),
ImplementedAs=CanvasImageDecoder,
] interface ImageDecoder {
};
......@@ -9,9 +9,9 @@
namespace blink {
class ImageLoaderCallback {
class ImageDecoderCallback {
public:
virtual ~ImageLoaderCallback() {}
virtual ~ImageDecoderCallback() {}
virtual void handleEvent(CanvasImage* result) = 0;
};
......
......@@ -2,6 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
callback interface ImageLoaderCallback {
callback interface ImageDecoderCallback {
void handleEvent(Image result);
};
......@@ -25,6 +25,20 @@ struct DartConverter<mojo::ScopedHandleBase<HandleType>> {
static Dart_Handle ToDart(mojo::ScopedHandleBase<HandleType> mojo_handle) {
return Dart_NewInteger(static_cast<int64_t>(mojo_handle.release().value()));
}
static mojo::ScopedHandleBase<HandleType> FromArgumentsWithNullCheck(
Dart_NativeArguments args,
int index,
Dart_Handle& exception,
bool auto_scope = true) {
int64_t mojo_handle64 = 0;
Dart_Handle result = Dart_GetNativeIntegerArgument(args, index, &mojo_handle64);
if (Dart_IsError(result) || !mojo_handle64)
return mojo::ScopedHandleBase<HandleType>();
HandleType mojo_handle(static_cast<MojoHandle>(mojo_handle64));
return mojo::MakeScopedHandle(mojo_handle);
}
};
} // namespace blink
......
......@@ -59,7 +59,7 @@ class StockDataFetcher {
}
void _fetchNextChunk() {
fetch('data/stock_data_${_currentChunk++}.json').then((Response response) {
fetchBody('data/stock_data_${_currentChunk++}.json').then((Response response) {
String json = response.bodyAsString();
JsonDecoder decoder = new JsonDecoder();
......
......@@ -59,7 +59,7 @@ class StockDataFetcher {
}
void _fetchNextChunk() {
fetch('../data/stock_data_${_currentChunk++}.json').then((Response response) {
fetchBody('../data/stock_data_${_currentChunk++}.json').then((Response response) {
String json = response.bodyAsString();
JsonDecoder decoder = new JsonDecoder();
......
......@@ -109,7 +109,7 @@ ergonomic interface:
import 'package:sky/framework/net/fetch.dart';
main() async {
Response response = await fetch('example.txt');
Response response = await fetchBody('example.txt');
print(response.bodyAsString());
}
```
......
......@@ -9,6 +9,7 @@ import 'package:mojo/core.dart' as core;
import 'package:mojom/mojo/network_service.mojom.dart';
import 'package:mojom/mojo/url_loader.mojom.dart';
import 'package:mojom/mojo/url_request.mojom.dart';
import 'package:mojom/mojo/url_response.mojom.dart';
class Response {
ByteData body;
......@@ -20,23 +21,30 @@ class Response {
}
}
Future<Response> fetch(String relativeUrl) async {
String url = Uri.base.resolve(relativeUrl).toString();
var net = new NetworkServiceProxy.unbound();
Future<UrlResponse> fetch(UrlRequest request) async {
NetworkServiceProxy net = new NetworkServiceProxy.unbound();
shell.requestService("mojo:authenticated_network_service", net);
var loader = new UrlLoaderProxy.unbound();
UrlLoaderProxy loader = new UrlLoaderProxy.unbound();
net.ptr.createUrlLoader(loader);
var request = new UrlRequest()
..url = url
..autoFollowRedirects = true;
var response = (await loader.ptr.start(request)).response;
UrlResponse response = (await loader.ptr.start(request)).response;
loader.close();
net.close();
return response;
}
Future<UrlResponse> fetchUrl(String relativeUrl) async {
String url = Uri.base.resolve(relativeUrl).toString();
UrlRequest request = new UrlRequest()
..url = url
..autoFollowRedirects = true;
return fetch(request);
}
Future<Response> fetchBody(String relativeUrl) async {
UrlResponse response = await fetchMojo(relativeUrl);
if (response.body == null) return new Response(null);
ByteData data = await core.DataPipeDrainer.drainHandle(response.body);
......
......@@ -2,17 +2,19 @@
// 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:sky';
import 'dart:collection';
import 'fetch.dart';
import 'package:mojom/mojo/url_response.mojom.dart';
final HashMap<String, List<sky.ImageLoaderCallback>> _pendingRequests =
new HashMap<String, List<sky.ImageLoaderCallback>>();
final HashMap<String, List<ImageDecoderCallback>> _pendingRequests =
new HashMap<String, List<ImageDecoderCallback>>();
final HashMap<String, sky.Image> _completedRequests =
new HashMap<String, sky.Image>();
final HashMap<String, Image> _completedRequests =
new HashMap<String, Image>();
void load(String url, sky.ImageLoaderCallback callback) {
sky.Image result = _completedRequests[url];
void load(String url, ImageDecoderCallback callback) {
Image result = _completedRequests[url];
if (result != null) {
callback(_completedRequests[url]);
return;
......@@ -21,13 +23,15 @@ void load(String url, sky.ImageLoaderCallback callback) {
bool newRequest = false;
_pendingRequests.putIfAbsent(url, () {
newRequest = true;
return new List<sky.ImageLoaderCallback>();
return new List<ImageDecoderCallback>();
}).add(callback);
if (newRequest) {
new sky.ImageLoader(url, (image) {
_completedRequests[url] = image;
_pendingRequests[url].forEach((c) => c(image));
_pendingRequests.remove(url);
fetchUrl(url).then((UrlResponse response) {
new ImageDecoder(response.body.handle.h, (image) {
_completedRequests[url] = image;
_pendingRequests[url].forEach((c) => c(image));
_pendingRequests.remove(url);
});
});
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册