// Copyright (c) 2012 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 "content/browser/media/media_internals_handler.h"

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/values.h"
#include "content/browser/media/media_internals_proxy.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"

namespace content {

MediaInternalsMessageHandler::MediaInternalsMessageHandler()
    : proxy_(new MediaInternalsProxy()),
      page_load_complete_(false) {}

MediaInternalsMessageHandler::~MediaInternalsMessageHandler() {
  proxy_->Detach();
}

void MediaInternalsMessageHandler::RegisterMessages() {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  proxy_->Attach(this);

  web_ui()->RegisterMessageCallback("getEverything",
      base::Bind(&MediaInternalsMessageHandler::OnGetEverything,
                 base::Unretained(this)));
}

void MediaInternalsMessageHandler::OnGetEverything(
    const base::ListValue* list) {
  page_load_complete_ = true;
  proxy_->GetEverything();
}

void MediaInternalsMessageHandler::OnUpdate(const base::string16& update) {
  // Don't try to execute JavaScript in a RenderView that no longer exists nor
  // if the chrome://media-internals page hasn't finished loading.
  RenderViewHost* host = web_ui()->GetWebContents()->GetRenderViewHost();
  if (host && page_load_complete_)
    host->ExecuteJavascriptInWebFrame(base::string16(), update);
}

}  // namespace content
