1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/omnibox/omnibox_view.h"
6#include "base/message_loop/message_loop.h"
7#include "base/strings/string16.h"
8#include "base/strings/string_util.h"
9#include "base/strings/utf_string_conversions.h"
10#include "testing/gtest/include/gtest/gtest.h"
11#include "testing/platform_test.h"
12#include "ui/base/clipboard/clipboard.h"
13#include "ui/base/clipboard/scoped_clipboard_writer.h"
14
15using base::ASCIIToUTF16;
16
17namespace {
18
19class OmniboxViewTest : public PlatformTest {
20 public:
21  virtual void TearDown() OVERRIDE {
22    ui::Clipboard::DestroyClipboardForCurrentThread();
23  }
24
25 private:
26  // Windows requires a message loop for clipboard access.
27  base::MessageLoopForUI message_loop_;
28};
29
30TEST_F(OmniboxViewTest, TestStripSchemasUnsafeForPaste) {
31  const char* urls[] = {
32    "http://www.google.com?q=javascript:alert(0)",  // Safe URL.
33    "javAscript:alert(0)",                          // Unsafe JS URL.
34    "jaVascript:\njavaScript: alert(0)"             // Single strip unsafe.
35  };
36
37  const char* expecteds[] = {
38    "http://www.google.com?q=javascript:alert(0)",  // Safe URL.
39    "alert(0)",                                     // Unsafe JS URL.
40    "alert(0)"                                      // Single strip unsafe.
41  };
42
43  for (size_t i = 0; i < arraysize(urls); i++) {
44    EXPECT_EQ(ASCIIToUTF16(expecteds[i]),
45              OmniboxView::StripJavascriptSchemas(ASCIIToUTF16(urls[i])));
46  }
47}
48
49TEST_F(OmniboxViewTest, SanitizeTextForPaste) {
50  // Broken URL has newlines stripped.
51  const base::string16 kWrappedURL(ASCIIToUTF16(
52      "http://www.chromium.org/developers/testing/chromium-\n"
53      "build-infrastructure/tour-of-the-chromium-buildbot"));
54
55  const base::string16 kFixedURL(ASCIIToUTF16(
56      "http://www.chromium.org/developers/testing/chromium-"
57      "build-infrastructure/tour-of-the-chromium-buildbot"));
58  EXPECT_EQ(kFixedURL, OmniboxView::SanitizeTextForPaste(kWrappedURL));
59
60  // Multi-line address is converted to a single-line address.
61  const base::string16 kWrappedAddress(ASCIIToUTF16(
62      "1600 Amphitheatre Parkway\nMountain View, CA"));
63
64  const base::string16 kFixedAddress(ASCIIToUTF16(
65      "1600 Amphitheatre Parkway Mountain View, CA"));
66  EXPECT_EQ(kFixedAddress, OmniboxView::SanitizeTextForPaste(kWrappedAddress));
67}
68
69TEST_F(OmniboxViewTest, GetClipboardText) {
70  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
71
72  const base::string16 kPlainText(ASCIIToUTF16("test text"));
73  const std::string kURL("http://www.example.com/");
74
75  // Can we pull straight text off the clipboard?
76  {
77    ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE);
78    clipboard_writer.WriteText(kPlainText);
79  }
80  EXPECT_EQ(kPlainText, OmniboxView::GetClipboardText());
81
82  // Can we pull a string consists of white-space?
83  const base::string16 kSpace6(ASCIIToUTF16("      "));
84  const base::string16 kSpace1(ASCIIToUTF16(" "));
85  {
86    ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE);
87    clipboard_writer.WriteText(kSpace6);
88  }
89  EXPECT_EQ(kSpace1, OmniboxView::GetClipboardText());
90
91  // Does an empty clipboard get empty text?
92  clipboard->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE);
93  EXPECT_EQ(base::string16(), OmniboxView::GetClipboardText());
94
95  // Bookmark clipboard apparently not supported on Linux.
96  // See TODO on ClipboardText.BookmarkTest.
97#if !defined(OS_POSIX) || defined(OS_MACOSX)
98  const base::string16 kTitle(ASCIIToUTF16("The Example Company"));
99  // Can we pull a bookmark off the clipboard?
100  {
101    ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE);
102    clipboard_writer.WriteBookmark(kTitle, kURL);
103  }
104  EXPECT_EQ(ASCIIToUTF16(kURL), OmniboxView::GetClipboardText());
105
106  // Do we pull text in preference to a bookmark?
107  {
108    ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE);
109    clipboard_writer.WriteText(kPlainText);
110    clipboard_writer.WriteBookmark(kTitle, kURL);
111  }
112  EXPECT_EQ(kPlainText, OmniboxView::GetClipboardText());
113#endif
114
115  // Do we get nothing if there is neither text nor a bookmark?
116  {
117    const base::string16 kMarkup(ASCIIToUTF16("<strong>Hi!</string>"));
118    ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE);
119    clipboard_writer.WriteHTML(kMarkup, kURL);
120  }
121  EXPECT_TRUE(OmniboxView::GetClipboardText().empty());
122}
123
124}  // namespace
125