// Copyright (c) 2012 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 "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/common/frame_navigate_params.h"
#include "net/test/spawned_test_server/spawned_test_server.h"

class MultipartResponseTest : public InProcessBrowserTest,
                              public content::WebContentsObserver {
 public:
  MultipartResponseTest() : did_navigate_any_frame_count_(0),
                            update_history_count_(0) {}

  virtual void DidNavigateAnyFrame(
      const content::LoadCommittedDetails& details,
      const content::FrameNavigateParams& params) OVERRIDE {
    did_navigate_any_frame_count_++;
    if (params.should_update_history)
      update_history_count_++;
  }

  int did_navigate_any_frame_count_;
  int update_history_count_;
};

// Disabled:  http://crbug.com/136310
IN_PROC_BROWSER_TEST_F(MultipartResponseTest, DISABLED_SingleVisit) {
  // Make sure that visiting a multipart/x-mixed-replace site only
  // creates one entry in the visits table.
  ASSERT_TRUE(test_server()->Start());

  Observe(browser()->tab_strip_model()->GetActiveWebContents());
  ui_test_utils::NavigateToURL(browser(), test_server()->GetURL("multipart"));

  EXPECT_EQ(ASCIIToUTF16("page 9"),
            browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
  EXPECT_EQ(1, update_history_count_);
  EXPECT_GT(did_navigate_any_frame_count_, update_history_count_);
}
