// Copyright 2016 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/permissions/permissions_browsertest.h"

#include "base/command_line.h"
#include "chrome/browser/permissions/permission_request_manager.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"

PermissionsBrowserTest::PermissionsBrowserTest(const std::string& test_url)
    : test_url_(test_url) {}

PermissionsBrowserTest::~PermissionsBrowserTest() {}

void PermissionsBrowserTest::SetUpOnMainThread() {
  PermissionRequestManager* manager = PermissionRequestManager::FromWebContents(
      browser()->tab_strip_model()->GetActiveWebContents());
  prompt_factory_.reset(new MockPermissionPromptFactory(manager));

  ASSERT_TRUE(embedded_test_server()->Start());

  ui_test_utils::NavigateToURL(browser(),
                               embedded_test_server()->GetURL(test_url()));
}

void PermissionsBrowserTest::TearDownOnMainThread() {
  prompt_factory_.reset();
}

bool PermissionsBrowserTest::RunScriptReturnBool(const std::string& script) {
  bool result;
  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
      GetWebContents()->GetMainFrame(), script, &result));
  return result;
}

content::WebContents* PermissionsBrowserTest::GetWebContents() {
  return browser()->tab_strip_model()->GetActiveWebContents();
}

void PermissionsBrowserTest::CommonFailsBeforeRequesting() {
  EXPECT_EQ(0, prompt_factory()->TotalRequestCount());
  // Dismiss any prompts if they are shown when using the feature.
  prompt_factory()->set_response_type(PermissionRequestManager::DISMISS);
  EXPECT_FALSE(FeatureUsageSucceeds());
}

void PermissionsBrowserTest::CommonFailsIfDismissed() {
  EXPECT_EQ(0, prompt_factory()->TotalRequestCount());
  prompt_factory()->set_response_type(PermissionRequestManager::DISMISS);
  TriggerPrompt();

  EXPECT_FALSE(FeatureUsageSucceeds());
  EXPECT_EQ(1, prompt_factory()->TotalRequestCount());
}

void PermissionsBrowserTest::CommonFailsIfBlocked() {
  EXPECT_EQ(0, prompt_factory()->TotalRequestCount());
  prompt_factory()->set_response_type(PermissionRequestManager::DENY_ALL);
  TriggerPrompt();

  EXPECT_FALSE(FeatureUsageSucceeds());
  EXPECT_EQ(1, prompt_factory()->TotalRequestCount());
}

void PermissionsBrowserTest::CommonSucceedsIfAllowed() {
  EXPECT_EQ(0, prompt_factory()->TotalRequestCount());
  prompt_factory()->set_response_type(PermissionRequestManager::ACCEPT_ALL);
  TriggerPrompt();

  EXPECT_TRUE(FeatureUsageSucceeds());
  EXPECT_EQ(1, prompt_factory()->TotalRequestCount());
}
