15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h" 69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OmniboxViewTest : public PlatformTest { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard::DestroyClipboardForCurrentThread(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows requires a message loop for clipboard access. 27b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OmniboxViewTest, TestStripSchemasUnsafeForPaste) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* urls[] = { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.google.com?q=javascript:alert(0)", // Safe URL. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "javAscript:alert(0)", // Unsafe JS URL. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "jaVascript:\njavaScript: alert(0)" // Single strip unsafe. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expecteds[] = { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.google.com?q=javascript:alert(0)", // Safe URL. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "alert(0)", // Unsafe JS URL. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "alert(0)" // Single strip unsafe. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(urls); i++) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(expecteds[i]), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OmniboxView::StripJavascriptSchemas(ASCIIToUTF16(urls[i]))); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(OmniboxViewTest, SanitizeTextForPaste) { 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Broken URL has newlines stripped. 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kWrappedURL(ASCIIToUTF16( 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "http://www.chromium.org/developers/testing/chromium-\n" 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "build-infrastructure/tour-of-the-chromium-buildbot")); 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kFixedURL(ASCIIToUTF16( 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "http://www.chromium.org/developers/testing/chromium-" 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "build-infrastructure/tour-of-the-chromium-buildbot")); 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(kFixedURL, OmniboxView::SanitizeTextForPaste(kWrappedURL)); 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Multi-line address is converted to a single-line address. 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kWrappedAddress(ASCIIToUTF16( 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "1600 Amphitheatre Parkway\nMountain View, CA")); 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kFixedAddress(ASCIIToUTF16( 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch "1600 Amphitheatre Parkway Mountain View, CA")); 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(kFixedAddress, OmniboxView::SanitizeTextForPaste(kWrappedAddress)); 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OmniboxViewTest, GetClipboardText) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kPlainText(ASCIIToUTF16("test text")); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string kURL("http://www.example.com/"); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can we pull straight text off the clipboard? 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard_writer.WriteText(kPlainText); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kPlainText, OmniboxView::GetClipboardText()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Can we pull a string consists of white-space? 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kSpace6(ASCIIToUTF16(" ")); 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kSpace1(ASCIIToUTF16(" ")); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clipboard_writer.WriteText(kSpace6); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kSpace1, OmniboxView::GetClipboardText()); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Does an empty clipboard get empty text? 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) clipboard->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::string16(), OmniboxView::GetClipboardText()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bookmark clipboard apparently not supported on Linux. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See TODO on ClipboardText.BookmarkTest. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_POSIX) || defined(OS_MACOSX) 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kTitle(ASCIIToUTF16("The Example Company")); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can we pull a bookmark off the clipboard? 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard_writer.WriteBookmark(kTitle, kURL); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16(kURL), OmniboxView::GetClipboardText()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do we pull text in preference to a bookmark? 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard_writer.WriteText(kPlainText); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard_writer.WriteBookmark(kTitle, kURL); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kPlainText, OmniboxView::GetClipboardText()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do we get nothing if there is neither text nor a bookmark? 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 kMarkup(ASCIIToUTF16("<strong>Hi!</string>")); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter clipboard_writer(ui::CLIPBOARD_TYPE_COPY_PASTE); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clipboard_writer.WriteHTML(kMarkup, kURL); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(OmniboxView::GetClipboardText().empty()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 125