// 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 "chrome/browser/extensions/webstore_install_with_prompt.h"

#include "chrome/browser/extensions/webstore_installer.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#include "content/public/browser/web_contents.h"

using content::WebContents;

namespace extensions {

WebstoreInstallWithPrompt::WebstoreInstallWithPrompt(
    const std::string& webstore_item_id,
    Profile* profile,
    const Callback& callback)
    : WebstoreStandaloneInstaller(webstore_item_id, profile, callback),
      dummy_web_contents_(
          WebContents::Create(WebContents::CreateParams(profile))),
      parent_window_(NULL) {
  set_install_source(WebstoreInstaller::INSTALL_SOURCE_OTHER);
}

WebstoreInstallWithPrompt::WebstoreInstallWithPrompt(
    const std::string& webstore_item_id,
    Profile* profile,
    gfx::NativeWindow parent_window,
    const Callback& callback)
    : WebstoreStandaloneInstaller(webstore_item_id, profile, callback),
      dummy_web_contents_(
          WebContents::Create(WebContents::CreateParams(profile))),
      parent_window_(parent_window) {
  DCHECK(parent_window);
  set_install_source(WebstoreInstaller::INSTALL_SOURCE_OTHER);
}

WebstoreInstallWithPrompt::~WebstoreInstallWithPrompt() {
}

bool WebstoreInstallWithPrompt::CheckRequestorAlive() const {
  // Assume the requestor is always alive.
  return true;
}

const GURL& WebstoreInstallWithPrompt::GetRequestorURL() const {
  return dummy_requestor_url_;
}

scoped_refptr<ExtensionInstallPrompt::Prompt>
WebstoreInstallWithPrompt::CreateInstallPrompt() const {
  return new ExtensionInstallPrompt::Prompt(
      ExtensionInstallPrompt::INSTALL_PROMPT);
}

scoped_ptr<ExtensionInstallPrompt>
WebstoreInstallWithPrompt::CreateInstallUI() {
  // Create an ExtensionInstallPrompt. If the parent window is NULL, the dialog
  // will be placed in the middle of the screen.
  return make_scoped_ptr(
      new ExtensionInstallPrompt(profile(), parent_window_, this));
}

bool WebstoreInstallWithPrompt::ShouldShowPostInstallUI() const {
  return false;
}

bool WebstoreInstallWithPrompt::ShouldShowAppInstalledBubble() const {
  return false;
}

WebContents* WebstoreInstallWithPrompt::GetWebContents() const {
  return dummy_web_contents_.get();
}

bool WebstoreInstallWithPrompt::CheckInlineInstallPermitted(
    const base::DictionaryValue& webstore_data,
    std::string* error) const {
  // Assume the requestor is trusted.
  *error = std::string();
  return true;
}

bool WebstoreInstallWithPrompt::CheckRequestorPermitted(
    const base::DictionaryValue& webstore_data,
    std::string* error) const {
  // Assume the requestor is trusted.
  *error = std::string();
  return true;
}

content::WebContents* WebstoreInstallWithPrompt::OpenURL(
    const content::OpenURLParams& params) {
  chrome::ScopedTabbedBrowserDisplayer displayer(profile(),
                                                 chrome::GetActiveDesktop());
  return displayer.browser()->OpenURL(params);
}

}  // namespace extensions
