// 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 "sky/tools/debugger/debugger.h"

#include "services/window_manager/basic_focus_rules.h"

namespace sky {
namespace debugger {

SkyDebugger::SkyDebugger()
    : window_manager_app_(new window_manager::WindowManagerApp(this, nullptr)),
      view_manager_(nullptr),
      root_(nullptr),
      content_(nullptr),
      navigator_host_factory_(this),
      weak_factory_(this) {
}

SkyDebugger::~SkyDebugger() {
}

base::WeakPtr<SkyDebugger> SkyDebugger::GetWeakPtr() {
  return weak_factory_.GetWeakPtr();
}

void SkyDebugger::Initialize(mojo::ApplicationImpl* app) {
  window_manager_app_->Initialize(app);
  app->ConnectToApplication("mojo:sky_debugger_prompt");
}

bool SkyDebugger::ConfigureIncomingConnection(
    mojo::ApplicationConnection* connection) {
  window_manager_app_->ConfigureIncomingConnection(connection);
  connection->AddService(this);
  return true;
}

bool SkyDebugger::ConfigureOutgoingConnection(
    mojo::ApplicationConnection* connection) {
  window_manager_app_->ConfigureOutgoingConnection(connection);
  connection->AddService(this);
  return true;
}

void SkyDebugger::OnEmbed(
    mojo::ViewManager* view_manager,
    mojo::View* root,
    mojo::ServiceProviderImpl* exported_services,
    scoped_ptr<mojo::ServiceProvider> imported_services) {
  view_manager_ = view_manager;

  root_ = root;
  root_->AddObserver(this);

  window_manager_app_->SetViewportSize(gfx::Size(320, 640));

  content_ = mojo::View::Create(view_manager_);
  content_->SetBounds(root_->bounds());
  root_->AddChild(content_);
  content_->SetVisible(true);

  window_manager_app_->InitFocus(
      make_scoped_ptr(new window_manager::BasicFocusRules(content_)));

  if (!pending_url_.empty())
    NavigateToURL(pending_url_);
}

void SkyDebugger::OnViewManagerDisconnected(mojo::ViewManager* view_manager) {
  view_manager_ = nullptr;
  root_ = nullptr;
}

void SkyDebugger::OnViewDestroyed(mojo::View* view) {
  view->RemoveObserver(this);
}

void SkyDebugger::OnViewBoundsChanged(mojo::View* view,
                                      const mojo::Rect& old_bounds,
                                      const mojo::Rect& new_bounds) {
  content_->SetBounds(new_bounds);
}

void SkyDebugger::Create(mojo::ApplicationConnection* connection,
                         mojo::InterfaceRequest<Debugger> request) {
  mojo::WeakBindToRequest(this, &request);
}

void SkyDebugger::NavigateToURL(const mojo::String& url) {
  // We can get Navigate commands before we've actually been
  // embedded into the view and content_ created.
  // Just save the last one.
  if (content_) {
    scoped_ptr<mojo::ServiceProviderImpl> exported_services(
      new mojo::ServiceProviderImpl());
    exported_services->AddService(&navigator_host_factory_);
    viewer_services_ = content_->Embed(url, exported_services.Pass());
  } else {
    pending_url_ = url;
  }
}

void SkyDebugger::Shutdown() {
  // Make sure we shut down mojo before quitting the message loop or things
  // like blink::shutdown() may try to talk to the message loop and crash.
  window_manager_app_.reset();

  // TODO(eseidel): This still hits an X11 error which I don't understand
  // "X Error of failed request:  GLXBadDrawable", crbug.com/430581
  mojo::ApplicationImpl::Terminate();
  // TODO(eseidel): REMOVE THIS, temporarily fast-exit now to stop confusing
  // folks with exit-time crashes due to GLXBadDrawable above.
  exit(0);
}

void SkyDebugger::InjectInspector() {
  InspectorServicePtr inspector_service;
  mojo::ConnectToService(viewer_services_.get(), &inspector_service);
  inspector_service->Inject();
}

}  // namespace debugger
}  // namespace sky
