// Copyright 2013 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 CONTENT_TEST_TEST_RENDER_FRAME_HOST_H_
#define CONTENT_TEST_TEST_RENDER_FRAME_HOST_H_

#include <vector>

#include "base/basictypes.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/test/test_renderer_host.h"
#include "content/test/test_render_view_host.h"
#include "ui/base/page_transition_types.h"

struct FrameHostMsg_DidCommitProvisionalLoad_Params;

namespace content {

class TestRenderFrameHostCreationObserver : public WebContentsObserver {
 public:
  explicit TestRenderFrameHostCreationObserver(WebContents* web_contents);
  virtual ~TestRenderFrameHostCreationObserver();

  // WebContentsObserver implementation.
  virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) OVERRIDE;

  RenderFrameHost* last_created_frame() const { return last_created_frame_; }

 private:
  RenderFrameHost* last_created_frame_;
};

class TestRenderFrameHost : public RenderFrameHostImpl,
                            public RenderFrameHostTester {
 public:
  TestRenderFrameHost(RenderViewHostImpl* render_view_host,
                      RenderFrameHostDelegate* delegate,
                      FrameTree* frame_tree,
                      FrameTreeNode* frame_tree_node,
                      int routing_id,
                      bool is_swapped_out);
  virtual ~TestRenderFrameHost();

  // RenderFrameHostImpl overrides (same values, but in Test* types)
  virtual TestRenderViewHost* GetRenderViewHost() OVERRIDE;

  // RenderFrameHostTester implementation.
  virtual TestRenderFrameHost* AppendChild(
      const std::string& frame_name) OVERRIDE;
  virtual void SendNavigateWithTransition(
      int page_id,
      const GURL& url,
      ui::PageTransition transition) OVERRIDE;

  void SendNavigate(int page_id, const GURL& url);
  void SendFailedNavigate(int page_id, const GURL& url);
  void SendNavigateWithTransitionAndResponseCode(
      int page_id,
      const GURL& url, ui::PageTransition transition,
      int response_code);
  void SendNavigateWithOriginalRequestURL(
      int page_id,
      const GURL& url,
      const GURL& original_request_url);
  void SendNavigateWithFile(
      int page_id,
      const GURL& url,
      const base::FilePath& file_path);
  void SendNavigateWithParams(
      FrameHostMsg_DidCommitProvisionalLoad_Params* params);
  void SendNavigateWithRedirects(
      int page_id,
      const GURL& url,
      const std::vector<GURL>& redirects);
  void SendNavigateWithParameters(
      int page_id,
      const GURL& url,
      ui::PageTransition transition,
      const GURL& original_request_url,
      int response_code,
      const base::FilePath* file_path_for_history_item,
      const std::vector<GURL>& redirects);
  void SendBeginNavigationWithURL(const GURL& url);

  void DidDisownOpener();

  void set_contents_mime_type(const std::string& mime_type) {
    contents_mime_type_ = mime_type;
  }

  // If set, navigations will appear to have cleared the history list in the
  // RenderFrame
  // (FrameHostMsg_DidCommitProvisionalLoad_Params::history_list_was_cleared).
  // False by default.
  void set_simulate_history_list_was_cleared(bool cleared) {
    simulate_history_list_was_cleared_ = cleared;
  }

  // TODO(nick): As necessary for testing, override behavior of RenderFrameHost
  // here.

 private:
  TestRenderFrameHostCreationObserver child_creation_observer_;

  std::string contents_mime_type_;

  // See set_simulate_history_list_was_cleared() above.
  bool simulate_history_list_was_cleared_;

  DISALLOW_COPY_AND_ASSIGN(TestRenderFrameHost);
};

}  // namespace content

#endif  // CONTENT_TEST_TEST_RENDER_FRAME_HOST_H_