// Copyright 2015 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/test/base/in_process_browser_test.h"

#include "base/mac/scoped_nsautorelease_pool.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "content/public/test/test_navigation_observer.h"

void InProcessBrowserTest::OpenDevToolsWindow(
    content::WebContents* web_contents) {
  // Opening a Devtools Window can cause AppKit to throw objects into the
  // autorelease pool. Flush the pool when this function returns.
  base::mac::ScopedNSAutoreleasePool pool;

  ASSERT_FALSE(content::DevToolsAgentHost::HasFor(web_contents));
  DevToolsWindow::OpenDevToolsWindow(web_contents);
  ASSERT_TRUE(content::DevToolsAgentHost::HasFor(web_contents));
}

Browser* InProcessBrowserTest::OpenURLOffTheRecord(Profile* profile,
                                                   const GURL& url) {
  // Opening an incognito window can cause AppKit to throw objects into the
  // autorelease pool. Flush the pool when this function returns.
  base::mac::ScopedNSAutoreleasePool pool;

  chrome::OpenURLOffTheRecord(profile, url);
  Browser* browser =
      chrome::FindTabbedBrowser(profile->GetOffTheRecordProfile(), false);
  content::TestNavigationObserver observer(
      browser->tab_strip_model()->GetActiveWebContents());
  observer.Wait();
  return browser;
}

// Creates a browser with a single tab (about:blank), waits for the tab to
// finish loading and shows the browser.
Browser* InProcessBrowserTest::CreateBrowser(Profile* profile) {
  // Making a browser window can cause AppKit to throw objects into the
  // autorelease pool. Flush the pool when this function returns.
  base::mac::ScopedNSAutoreleasePool pool;

  Browser* browser = new Browser(Browser::CreateParams(profile));
  AddBlankTabAndShow(browser);
  return browser;
}

Browser* InProcessBrowserTest::CreateIncognitoBrowser() {
  // Making a browser window can cause AppKit to throw objects into the
  // autorelease pool. Flush the pool when this function returns.
  base::mac::ScopedNSAutoreleasePool pool;

  // Create a new browser with using the incognito profile.
  Browser* incognito = new Browser(
      Browser::CreateParams(browser()->profile()->GetOffTheRecordProfile()));
  AddBlankTabAndShow(incognito);
  return incognito;
}

Browser* InProcessBrowserTest::CreateBrowserForPopup(Profile* profile) {
  // Making a browser window can cause AppKit to throw objects into the
  // autorelease pool. Flush the pool when this function returns.
  base::mac::ScopedNSAutoreleasePool pool;

  Browser* browser =
      new Browser(Browser::CreateParams(Browser::TYPE_POPUP, profile));
  AddBlankTabAndShow(browser);
  return browser;
}

Browser* InProcessBrowserTest::CreateBrowserForApp(
    const std::string& app_name,
    Profile* profile) {
  // Making a browser window can cause AppKit to throw objects into the
  // autorelease pool. Flush the pool when this function returns.
  base::mac::ScopedNSAutoreleasePool pool;

  Browser* browser = new Browser(Browser::CreateParams::CreateForApp(
      app_name, false /* trusted_source */, gfx::Rect(), profile));
  AddBlankTabAndShow(browser);
  return browser;
}
