// 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.

#ifndef CHROME_BROWSER_UI_PERMISSION_BUBBLE_MOCK_PERMISSION_PROMPT_FACTORY_H_
#define CHROME_BROWSER_UI_PERMISSION_BUBBLE_MOCK_PERMISSION_PROMPT_FACTORY_H_

#include <memory>
#include <vector>

#include "chrome/browser/permissions/permission_request.h"
#include "chrome/browser/permissions/permission_request_manager.h"
#include "chrome/browser/ui/permission_bubble/permission_prompt.h"
#include "url/gurl.h"

class MockPermissionPrompt;

namespace content {
class WebContents;
}

// Provides a skeleton class for both unit and browser testing when trying to
// test the bubble manager logic. Should not be used for anything that requires
// actual UI.
// See example usage in
// chrome/browser/permissions/permission_request_manager_unittest.cc
class MockPermissionPromptFactory {
 public:
  explicit MockPermissionPromptFactory(PermissionRequestManager* manager);
  ~MockPermissionPromptFactory();

  // Create method called by the PBM to show a bubble.
  std::unique_ptr<PermissionPrompt> Create(
      content::WebContents* web_contents,
      PermissionPrompt::Delegate* delegate);

  void ResetCounts();

  void DocumentOnLoadCompletedInMainFrame();

  void set_response_type(PermissionRequestManager::AutoResponseType type) {
    response_type_ = type;
  }

  PermissionRequestManager::AutoResponseType response_type() {
    return response_type_;
  }

  // If the current view is visible.
  bool is_visible();
  // Number of times |Show| was called on any bubble.
  int show_count() { return show_count_; }
  // Number of requests seen by the last |Show|.
  int request_count() { return requests_count_; }
  // Number of requests seen.
  int TotalRequestCount();
  // Whether the specified permission was shown in a prompt.
  bool RequestTypeSeen(PermissionRequestType type);
  // Whether a prompt with the given origin was shown.
  bool RequestOriginSeen(const GURL& origin);

  void WaitForPermissionBubble();

 private:
  friend class MockPermissionPrompt;

  // This shouldn't be called. Is here to fail tests that try to create a bubble
  // after the factory has been destroyed.
  static std::unique_ptr<PermissionPrompt> DoNotCreate(
      content::WebContents* web_contents,
      PermissionPrompt::Delegate* delegate);

  void HideView(MockPermissionPrompt* view);

  int show_count_;
  int requests_count_;
  std::vector<PermissionRequestType> request_types_seen_;
  std::vector<GURL> request_origins_seen_;

  std::vector<MockPermissionPrompt*> prompts_;
  PermissionRequestManager::AutoResponseType response_type_;

  base::Closure show_bubble_quit_closure_;

  // The bubble manager that will be associated with this factory.
  PermissionRequestManager* manager_;

  DISALLOW_COPY_AND_ASSIGN(MockPermissionPromptFactory);
};

#endif  // CHROME_BROWSER_UI_PERMISSION_BUBBLE_MOCK_PERMISSION_PROMPT_FACTORY_H_
