// Copyright 2017 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.

#include "services/data_decoder/public/cpp/test_data_decoder_service.h"

#include "services/data_decoder/data_decoder_service.h"
#include "services/data_decoder/public/mojom/constants.mojom.h"

namespace data_decoder {

TestDataDecoderService::TestDataDecoderService()
    : connector_(connector_factory_.CreateConnector()),
      service_(connector_factory_.RegisterInstance(
          data_decoder::mojom::kServiceName)) {}

TestDataDecoderService::~TestDataDecoderService() = default;

CrashyDataDecoderService::CrashyDataDecoderService(
    service_manager::mojom::ServiceRequest request,
    bool crash_json,
    bool crash_image)
    : binding_(this, std::move(request)),
      crash_json_(crash_json),
      crash_image_(crash_image) {}

CrashyDataDecoderService::~CrashyDataDecoderService() = default;

void CrashyDataDecoderService::OnStart() {
  real_service_.OnStart();
}

void CrashyDataDecoderService::OnBindInterface(
    const service_manager::BindSourceInfo& source_info,
    const std::string& interface_name,
    mojo::ScopedMessagePipeHandle interface_pipe) {
  DCHECK(interface_name == mojom::JsonParser::Name_ ||
         interface_name == mojom::ImageDecoder::Name_);
  if (interface_name == mojom::JsonParser::Name_ && crash_json_) {
    DCHECK(!json_parser_binding_);
    json_parser_binding_ = std::make_unique<mojo::Binding<mojom::JsonParser>>(
        this, mojom::JsonParserRequest(std::move(interface_pipe)));
    return;
  }
  if (interface_name == mojom::ImageDecoder::Name_ && crash_image_) {
    DCHECK(!image_decoder_binding_);
    image_decoder_binding_ =
        std::make_unique<mojo::Binding<mojom::ImageDecoder>>(
            this, mojom::ImageDecoderRequest(std::move(interface_pipe)));
    return;
  }
  real_service_.OnBindInterface(source_info, interface_name,
                                std::move(interface_pipe));
}

// Overridden from mojom::ImageDecoder:
void CrashyDataDecoderService::DecodeImage(
    const std::vector<uint8_t>& encoded_data,
    mojom::ImageCodec codec,
    bool shrink_to_fit,
    int64_t max_size_in_bytes,
    const gfx::Size& desired_image_frame_size,
    DecodeImageCallback callback) {
  image_decoder_binding_.reset();
}

void CrashyDataDecoderService::DecodeAnimation(
    const std::vector<uint8_t>& encoded_data,
    bool shrink_to_fit,
    int64_t max_size_in_bytes,
    DecodeAnimationCallback callback) {
  image_decoder_binding_.reset();
}

void CrashyDataDecoderService::Parse(const std::string& json,
                                     ParseCallback callback) {
  json_parser_binding_.reset();
}

}  // namespace data_decoder
