1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebData.h"
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/tools/test_shell/test_shell_test.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebFrame;
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebString;
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebView;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebFrameTest : public TestShellTest {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebFrameTest, GetContentAsPlainText) {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebView* view = test_shell_->webView();
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebFrame* frame = view->mainFrame();
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate a simple test case.
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char simple_source[] = "<div>Foo bar</div><div></div>baz";
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL test_url("http://foo/");
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  frame->loadHTMLString(simple_source, test_url);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_shell_->WaitTestFinished();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure it comes out OK.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const string16 expected(ASCIIToUTF16("Foo bar\nbaz"));
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 text = frame->contentAsText(std::numeric_limits<size_t>::max());
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected, text);
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try reading the same one with clipping of the text.
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int len = 5;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text = frame->contentAsText(len);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected.substr(0, len), text);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now do a new test with a subframe.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char outer_frame_source[] = "Hello<iframe></iframe> world";
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  frame->loadHTMLString(outer_frame_source, test_url);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_shell_->WaitTestFinished();
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load something into the subframe.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebFrame* subframe = frame->findChildByExpression(
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WebString::fromUTF8("/html/body/iframe"));
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(subframe);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  subframe->loadHTMLString("sub<p>text", test_url);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_shell_->WaitTestFinished();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text = frame->contentAsText(std::numeric_limits<size_t>::max());
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("Hello world\n\nsub\ntext", UTF16ToUTF8(text));
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the frame text where the subframe separator falls on the boundary of
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // what we'll take. There used to be a crash in this case.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text = frame->contentAsText(12);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("Hello world", UTF16ToUTF8(text));
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebFrameTest, GetFullHtmlOfPage) {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebView* view = test_shell_->webView();
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebFrame* frame = view->mainFrame();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generate a simple test case.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char simple_source[] = "<p>Hello</p><p>World</p>";
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL test_url("http://hello/");
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  frame->loadHTMLString(simple_source, test_url);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_shell_->WaitTestFinished();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 text = frame->contentAsText(std::numeric_limits<size_t>::max());
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("Hello\n\nWorld", UTF16ToUTF8(text));
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string html = frame->contentAsMarkup().utf8();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load again with the output html.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  frame->loadHTMLString(html, test_url);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_shell_->WaitTestFinished();
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(html, UTF16ToUTF8(frame->contentAsMarkup()));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text = frame->contentAsText(std::numeric_limits<size_t>::max());
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("Hello\n\nWorld", UTF16ToUTF8(text));
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test selection check
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(frame->hasSelection());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  frame->executeCommand(WebString::fromUTF8("SelectAll"));
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(frame->hasSelection());
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  frame->executeCommand(WebString::fromUTF8("Unselect"));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(frame->hasSelection());
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WebString selection_html = frame->selectionAsMarkup();
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(selection_html.isEmpty());
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
96