// Copyright 2014 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 "config.h"
#include "core/app/ModuleLoader.h"

#include "base/bind.h"
#include "core/app/Application.h"
#include "core/app/Module.h"
#include "core/dom/Document.h"
#include "core/dom/DocumentParser.h"
#include "core/html/HTMLDocument.h"
#include "wtf/text/WTFString.h"

namespace blink {

ModuleLoader::Client::~Client() {
}

ModuleLoader::ModuleLoader(Client* client,
                           Application* application,
                           const KURL& url)
    : state_(LOADING),
      client_(client),
      application_(application),
      fetcher_(adoptPtr(new MojoFetcher(this, url))),
      weak_factory_(this) {
}

ModuleLoader::~ModuleLoader() {
}

void ModuleLoader::OnReceivedResponse(mojo::URLResponsePtr response) {
  if (response->error || response->status_code >= 400) {
    String message = String::format(
        "Failed to load resource: Server responded with a status of %d (%s)",
        response->status_code, response->status_line.data());
    RefPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(
        NetworkMessageSource, ErrorMessageLevel, message, response->url.data());
    application_->document()->addMessage(consoleMessage);
    state_ = COMPLETE;
    client_->OnModuleLoadComplete(this, nullptr);
    return;
  }

  WeakPtr<Document> context = application_->document()->contextDocument();
  ASSERT(context.get());
  KURL url(ParsedURLString, String::fromUTF8(response->url));
  DocumentInit init = DocumentInit(url, 0, context, 0)
      .withRegistrationContext(context->registrationContext());

  RefPtr<Document> document = HTMLDocument::create(init);
  document->startParsing()->parse(response->body.Pass(),
      base::Bind(&ModuleLoader::OnParsingComplete, weak_factory_.GetWeakPtr()));

  module_ = Module::create(
      context.get(), application_, document.release(), url.string());
}

void ModuleLoader::OnParsingComplete() {
  state_ = COMPLETE;
  client_->OnModuleLoadComplete(this, module_.get());
}

} // namespace blink
