| Index: chrome/renderer/render_view_unittest.cc
|
| ===================================================================
|
| --- chrome/renderer/render_view_unittest.cc (revision 0)
|
| +++ chrome/renderer/render_view_unittest.cc (revision 0)
|
| @@ -0,0 +1,128 @@
|
| +// Copyright (c) 2008 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/scoped_ptr.h"
|
| +#include "chrome/renderer/mock_render_process.h"
|
| +#include "chrome/renderer/mock_render_thread.h"
|
| +#include "chrome/renderer/render_view.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "webkit/glue/webframe.h"
|
| +#include "webkit/glue/weburlrequest.h"
|
| +#include "webkit/glue/webview.h"
|
| +
|
| +namespace {
|
| +
|
| +const int32 kRouteId = 5;
|
| +const int32 kOpenerId = 7;
|
| +
|
| +class RenderViewTest : public testing::Test {
|
| + public:
|
| + RenderViewTest() {}
|
| + ~RenderViewTest() {}
|
| +
|
| + protected:
|
| + // Spins the message loop to process all messages that are currently pending.
|
| + void ProcessPendingMessages() {
|
| + msg_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask());
|
| + msg_loop_.Run();
|
| + }
|
| +
|
| + // Returns a pointer to the main frame.
|
| + WebFrame* GetMainFrame() {
|
| + return view_->webview()->GetMainFrame();
|
| + }
|
| +
|
| + // Executes the given JavaScript in the context of the main frame. The input
|
| + // is a NULL-terminated UTF-8 string.
|
| + void ExecuteJavaScript(const char* js) {
|
| + GetMainFrame()->ExecuteJavaScript(js, GURL());
|
| + }
|
| +
|
| + // Loads the given HTML into the main frame as a data: URL.
|
| + void LoadHTML(const char* html) {
|
| + std::string url_str = "data:text/html;charset=utf-8,";
|
| + url_str.append(html);
|
| + GURL url(url_str);
|
| +
|
| + scoped_ptr<WebRequest> request(WebRequest::Create(url));
|
| + GetMainFrame()->LoadRequest(request.get());
|
| +
|
| + // The load actually happens asynchronously, so we pump messages to process
|
| + // the pending continuation.
|
| + ProcessPendingMessages();
|
| + }
|
| +
|
| + // testing::Test
|
| + virtual void SetUp() {
|
| + MockProcess::GlobalInit();
|
| +
|
| + render_thread_.set_routing_id(kRouteId);
|
| +
|
| + // This needs to pass the mock render thread to the view.
|
| + view_ = RenderView::Create(&render_thread_, NULL, NULL, kOpenerId,
|
| + WebPreferences(),
|
| + new SharedRenderViewCounter(0), kRouteId);
|
| + }
|
| + virtual void TearDown() {
|
| + render_thread_.SendCloseMessage();
|
| +
|
| + // Run the loop so the release task from the renderwidget executes.
|
| + ProcessPendingMessages();
|
| +
|
| + view_ = NULL;
|
| +
|
| + // There is a delayed task that the child process posts to terminate the
|
| + // message loop so we need to spin the message loop to delete the task.
|
| + MockProcess::GlobalCleanup();
|
| + msg_loop_.Run();
|
| + }
|
| +
|
| + MessageLoop msg_loop_;
|
| + MockRenderThread render_thread_;
|
| +
|
| + scoped_refptr<RenderView> view_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(RenderViewTest, OnLoadAlternateHTMLText) {
|
| + // Test a new navigation.
|
| + GURL test_url("http://www.google.com/some_test_url");
|
| + view_->OnLoadAlternateHTMLText("<html></html>", true, test_url,
|
| + std::string());
|
| +
|
| + // We should have gotten two different types of start messages in the
|
| + // following order.
|
| + ASSERT_EQ(2, render_thread_.message_count());
|
| + const IPC::Message* msg = render_thread_.GetMessageAt(0);
|
| + EXPECT_EQ(ViewHostMsg_DidStartLoading::ID, msg->type());
|
| +
|
| + msg = render_thread_.GetMessageAt(1);
|
| + EXPECT_EQ(ViewHostMsg_DidStartProvisionalLoadForFrame::ID, msg->type());
|
| + ViewHostMsg_DidStartProvisionalLoadForFrame::Param start_params;
|
| + ViewHostMsg_DidStartProvisionalLoadForFrame::Read(msg, &start_params);
|
| + EXPECT_EQ(GURL("chrome://chromewebdata/"), start_params.b);
|
| +}
|
| +
|
| +// Test that we get form state change notifications when input fields change.
|
| +TEST_F(RenderViewTest, OnNavStateChanged) {
|
| + // Don't want any delay for form state sync changes. This will still post a
|
| + // message so updates will get coalesced, but as soon as we spin the message
|
| + // loop, it will generate an update.
|
| + view_->set_delay_seconds_for_form_state_sync(0);
|
| +
|
| + LoadHTML("<input type=\"text\" id=\"elt_text\"></input>");
|
| +
|
| + // We should NOT have gotten a form state change notification yet.
|
| + EXPECT_FALSE(render_thread_.GetFirstMessageMatching(
|
| + ViewHostMsg_UpdateState::ID));
|
| + render_thread_.ClearMessages();
|
| +
|
| + // Change the value of the input. We should have gotten an update state
|
| + // notification. We need to spin the message loop to catch this update.
|
| + ExecuteJavaScript("document.getElementById('elt_text').value = 'foo';");
|
| + ProcessPendingMessages();
|
| + EXPECT_TRUE(render_thread_.GetUniqueMessageMatching(
|
| + ViewHostMsg_UpdateState::ID));
|
| +}
|
|
|
| Property changes on: chrome\renderer\render_view_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|