web_bundle_parser_factory.cc 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/web_package/web_bundle_parser_factory.h"
  5. #include "base/callback_helpers.h"
  6. #include "components/web_package/web_bundle_parser.h"
  7. #include "mojo/public/cpp/bindings/remote.h"
  8. #include "net/http/http_util.h"
  9. namespace web_package {
  10. namespace {
  11. class FileDataSource final : public mojom::BundleDataSource {
  12. public:
  13. FileDataSource(mojo::PendingReceiver<mojom::BundleDataSource> receiver,
  14. base::File file)
  15. : receiver_(this, std::move(receiver)), file_(std::move(file)) {
  16. receiver_.set_disconnect_handler(base::BindOnce(
  17. &base::DeletePointer<FileDataSource>, base::Unretained(this)));
  18. }
  19. FileDataSource(const FileDataSource&) = delete;
  20. FileDataSource& operator=(const FileDataSource&) = delete;
  21. private:
  22. // Implements mojom::BundleDataSource.
  23. void Read(uint64_t offset, uint64_t length, ReadCallback callback) override {
  24. std::vector<uint8_t> buf(length);
  25. int bytes = file_.Read(offset, reinterpret_cast<char*>(buf.data()), length);
  26. if (bytes > 0) {
  27. buf.resize(bytes);
  28. std::move(callback).Run(std::move(buf));
  29. } else {
  30. std::move(callback).Run(absl::nullopt);
  31. }
  32. }
  33. void Length(LengthCallback callback) override {
  34. const int64_t length = file_.GetLength();
  35. std::move(callback).Run(length);
  36. }
  37. void IsRandomAccessContext(IsRandomAccessContextCallback callback) override {
  38. std::move(callback).Run(true);
  39. }
  40. mojo::Receiver<mojom::BundleDataSource> receiver_;
  41. base::File file_;
  42. };
  43. } // namespace
  44. WebBundleParserFactory::WebBundleParserFactory() = default;
  45. WebBundleParserFactory::~WebBundleParserFactory() = default;
  46. std::unique_ptr<mojom::BundleDataSource>
  47. WebBundleParserFactory::CreateFileDataSourceForTesting(
  48. mojo::PendingReceiver<mojom::BundleDataSource> receiver,
  49. base::File file) {
  50. return std::make_unique<FileDataSource>(std::move(receiver), std::move(file));
  51. }
  52. void WebBundleParserFactory::GetParserForFile(
  53. mojo::PendingReceiver<mojom::WebBundleParser> receiver,
  54. base::File file) {
  55. mojo::PendingRemote<mojom::BundleDataSource> remote_data_source;
  56. auto data_source = std::make_unique<FileDataSource>(
  57. remote_data_source.InitWithNewPipeAndPassReceiver(), std::move(file));
  58. GetParserForDataSource(std::move(receiver), std::move(remote_data_source));
  59. // |data_source| will be destructed on |remote_data_source| destruction.
  60. data_source.release();
  61. }
  62. void WebBundleParserFactory::GetParserForDataSource(
  63. mojo::PendingReceiver<mojom::WebBundleParser> receiver,
  64. mojo::PendingRemote<mojom::BundleDataSource> data_source) {
  65. // TODO(crbug.com/1247939): WebBundleParserFactory doesn't support |base_url|.
  66. // For features::kWebBundlesFromNetwork should support |base_url|.
  67. auto parser = std::make_unique<WebBundleParser>(std::move(receiver),
  68. std::move(data_source),
  69. /*base_url=*/GURL());
  70. // |parser| will be destructed on remote mojo ends' disconnection.
  71. parser.release();
  72. }
  73. } // namespace web_package