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

#include "extensions/browser/test_image_loader.h"

#include "base/bind.h"
#include "extensions/browser/image_loader.h"
#include "extensions/common/extension.h"
#include "third_party/skia/include/core/SkBitmap.h"

namespace extensions {

TestImageLoader::TestImageLoader() : waiting_(false), image_loaded_(false) {}

TestImageLoader::~TestImageLoader() {}

// static
SkBitmap TestImageLoader::LoadAndGetExtensionBitmap(
    const Extension* extension,
    const std::string& image_path,
    int size) {
  TestImageLoader image_loader;
  return image_loader.LoadAndGetBitmap(extension, image_path, size);
}

void TestImageLoader::OnImageLoaded(const gfx::Image& image) {
  image_ = image;
  image_loaded_ = true;
  if (waiting_)
    loader_message_loop_quit_.Run();
}

SkBitmap TestImageLoader::LoadAndGetBitmap(const Extension* extension,
                                           const std::string& path,
                                           int size) {
  image_loaded_ = false;

  ImageLoader image_loader;
  image_loader.LoadImageAsync(
      extension, extension->GetResource(path), gfx::Size(size, size),
      base::Bind(&TestImageLoader::OnImageLoaded, base::Unretained(this)));

  // If |image_| still hasn't been loaded (i.e. it is being loaded
  // asynchronously), wait for it.
  if (!image_loaded_) {
    waiting_ = true;
    base::RunLoop run_loop;
    loader_message_loop_quit_ = run_loop.QuitClosure();
    run_loop.Run();
    waiting_ = false;
  }

  DCHECK(image_loaded_);

  return image_.IsEmpty() ? SkBitmap() : *image_.ToSkBitmap();
}

}  // namespace extensions
