| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/memory/ref_counted.h" | 5 #include "base/memory/ref_counted.h" |
| 6 #include "base/memory/scoped_handle.h" | 6 #include "base/memory/scoped_handle.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "ui/base/dragdrop/os_exchange_data.h" | 8 #include "ui/base/dragdrop/os_exchange_data.h" |
| 9 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" | 9 #include "ui/base/dragdrop/os_exchange_data_provider_win.h" |
| 10 #include "base/pickle.h" | 10 #include "base/pickle.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 EXPECT_FALSE(data2.GetURLAndTitle(&url, &title)); | 43 EXPECT_FALSE(data2.GetURLAndTitle(&url, &title)); |
| 44 // No URLs in |data|, so url should be untouched. | 44 // No URLs in |data|, so url should be untouched. |
| 45 EXPECT_EQ(url_spec, url.spec()); | 45 EXPECT_EQ(url_spec, url.spec()); |
| 46 } | 46 } |
| 47 | 47 |
| 48 // Test getting using the IDataObject COM API | 48 // Test getting using the IDataObject COM API |
| 49 TEST(OSExchangeDataTest, StringDataAccessViaCOM) { | 49 TEST(OSExchangeDataTest, StringDataAccessViaCOM) { |
| 50 OSExchangeData data; | 50 OSExchangeData data; |
| 51 std::wstring input = L"O hai googlz."; | 51 std::wstring input = L"O hai googlz."; |
| 52 data.SetString(input); | 52 data.SetString(input); |
| 53 ScopedComPtr<IDataObject> com_data( | 53 base::win::ScopedComPtr<IDataObject> com_data( |
| 54 OSExchangeDataProviderWin::GetIDataObject(data)); | 54 OSExchangeDataProviderWin::GetIDataObject(data)); |
| 55 | 55 |
| 56 FORMATETC format_etc = | 56 FORMATETC format_etc = |
| 57 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 57 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
| 58 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); | 58 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); |
| 59 | 59 |
| 60 STGMEDIUM medium; | 60 STGMEDIUM medium; |
| 61 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); | 61 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); |
| 62 std::wstring output = | 62 std::wstring output = |
| 63 base::win::ScopedHGlobal<wchar_t>(medium.hGlobal).get(); | 63 base::win::ScopedHGlobal<wchar_t>(medium.hGlobal).get(); |
| 64 EXPECT_EQ(input, output); | 64 EXPECT_EQ(input, output); |
| 65 ReleaseStgMedium(&medium); | 65 ReleaseStgMedium(&medium); |
| 66 } | 66 } |
| 67 | 67 |
| 68 // Test setting using the IDataObject COM API | 68 // Test setting using the IDataObject COM API |
| 69 TEST(OSExchangeDataTest, StringDataWritingViaCOM) { | 69 TEST(OSExchangeDataTest, StringDataWritingViaCOM) { |
| 70 OSExchangeData data; | 70 OSExchangeData data; |
| 71 std::wstring input = L"http://www.google.com/"; | 71 std::wstring input = L"http://www.google.com/"; |
| 72 | 72 |
| 73 ScopedComPtr<IDataObject> com_data( | 73 base::win::ScopedComPtr<IDataObject> com_data( |
| 74 OSExchangeDataProviderWin::GetIDataObject(data)); | 74 OSExchangeDataProviderWin::GetIDataObject(data)); |
| 75 | 75 |
| 76 // Store data in the object using the COM SetData API. | 76 // Store data in the object using the COM SetData API. |
| 77 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); | 77 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); |
| 78 FORMATETC format_etc = | 78 FORMATETC format_etc = |
| 79 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 79 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
| 80 STGMEDIUM medium; | 80 STGMEDIUM medium; |
| 81 medium.tymed = TYMED_HGLOBAL; | 81 medium.tymed = TYMED_HGLOBAL; |
| 82 HGLOBAL glob = GlobalAlloc(GPTR, sizeof(wchar_t) * (input.size() + 1)); | 82 HGLOBAL glob = GlobalAlloc(GPTR, sizeof(wchar_t) * (input.size() + 1)); |
| 83 size_t stringsz = input.size(); | 83 size_t stringsz = input.size(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 97 std::wstring title; | 97 std::wstring title; |
| 98 EXPECT_TRUE(data2.GetURLAndTitle(&url_from_data, &title)); | 98 EXPECT_TRUE(data2.GetURLAndTitle(&url_from_data, &title)); |
| 99 GURL reference_url(input); | 99 GURL reference_url(input); |
| 100 EXPECT_EQ(reference_url.spec(), url_from_data.spec()); | 100 EXPECT_EQ(reference_url.spec(), url_from_data.spec()); |
| 101 } | 101 } |
| 102 | 102 |
| 103 TEST(OSExchangeDataTest, URLDataAccessViaCOM) { | 103 TEST(OSExchangeDataTest, URLDataAccessViaCOM) { |
| 104 OSExchangeData data; | 104 OSExchangeData data; |
| 105 GURL url("http://www.google.com/"); | 105 GURL url("http://www.google.com/"); |
| 106 data.SetURL(url, L""); | 106 data.SetURL(url, L""); |
| 107 ScopedComPtr<IDataObject> com_data( | 107 base::win::ScopedComPtr<IDataObject> com_data( |
| 108 OSExchangeDataProviderWin::GetIDataObject(data)); | 108 OSExchangeDataProviderWin::GetIDataObject(data)); |
| 109 | 109 |
| 110 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); | 110 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); |
| 111 FORMATETC format_etc = | 111 FORMATETC format_etc = |
| 112 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 112 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
| 113 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); | 113 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); |
| 114 | 114 |
| 115 STGMEDIUM medium; | 115 STGMEDIUM medium; |
| 116 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); | 116 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); |
| 117 std::wstring output = | 117 std::wstring output = |
| 118 base::win::ScopedHGlobal<wchar_t>(medium.hGlobal).get(); | 118 base::win::ScopedHGlobal<wchar_t>(medium.hGlobal).get(); |
| 119 EXPECT_EQ(url.spec(), WideToUTF8(output)); | 119 EXPECT_EQ(url.spec(), WideToUTF8(output)); |
| 120 ReleaseStgMedium(&medium); | 120 ReleaseStgMedium(&medium); |
| 121 } | 121 } |
| 122 | 122 |
| 123 TEST(OSExchangeDataTest, MultipleFormatsViaCOM) { | 123 TEST(OSExchangeDataTest, MultipleFormatsViaCOM) { |
| 124 OSExchangeData data; | 124 OSExchangeData data; |
| 125 std::string url_spec = "http://www.google.com/"; | 125 std::string url_spec = "http://www.google.com/"; |
| 126 GURL url(url_spec); | 126 GURL url(url_spec); |
| 127 std::wstring text = L"O hai googlz."; | 127 std::wstring text = L"O hai googlz."; |
| 128 data.SetURL(url, L"Google"); | 128 data.SetURL(url, L"Google"); |
| 129 data.SetString(text); | 129 data.SetString(text); |
| 130 | 130 |
| 131 ScopedComPtr<IDataObject> com_data( | 131 base::win::ScopedComPtr<IDataObject> com_data( |
| 132 OSExchangeDataProviderWin::GetIDataObject(data)); | 132 OSExchangeDataProviderWin::GetIDataObject(data)); |
| 133 | 133 |
| 134 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); | 134 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); |
| 135 FORMATETC url_format_etc = | 135 FORMATETC url_format_etc = |
| 136 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 136 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
| 137 EXPECT_EQ(S_OK, com_data->QueryGetData(&url_format_etc)); | 137 EXPECT_EQ(S_OK, com_data->QueryGetData(&url_format_etc)); |
| 138 FORMATETC text_format_etc = | 138 FORMATETC text_format_etc = |
| 139 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 139 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
| 140 EXPECT_EQ(S_OK, com_data->QueryGetData(&text_format_etc)); | 140 EXPECT_EQ(S_OK, com_data->QueryGetData(&text_format_etc)); |
| 141 | 141 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 157 | 157 |
| 158 TEST(OSExchangeDataTest, EnumerationViaCOM) { | 158 TEST(OSExchangeDataTest, EnumerationViaCOM) { |
| 159 OSExchangeData data; | 159 OSExchangeData data; |
| 160 data.SetURL(GURL("http://www.google.com/"), L""); | 160 data.SetURL(GURL("http://www.google.com/"), L""); |
| 161 data.SetString(L"O hai googlz."); | 161 data.SetString(L"O hai googlz."); |
| 162 | 162 |
| 163 CLIPFORMAT cfstr_file_group_descriptor = | 163 CLIPFORMAT cfstr_file_group_descriptor = |
| 164 RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR); | 164 RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR); |
| 165 CLIPFORMAT text_x_moz_url = RegisterClipboardFormat(L"text/x-moz-url"); | 165 CLIPFORMAT text_x_moz_url = RegisterClipboardFormat(L"text/x-moz-url"); |
| 166 | 166 |
| 167 ScopedComPtr<IDataObject> com_data( | 167 base::win::ScopedComPtr<IDataObject> com_data( |
| 168 OSExchangeDataProviderWin::GetIDataObject(data)); | 168 OSExchangeDataProviderWin::GetIDataObject(data)); |
| 169 ScopedComPtr<IEnumFORMATETC> enumerator; | 169 base::win::ScopedComPtr<IEnumFORMATETC> enumerator; |
| 170 EXPECT_EQ(S_OK, com_data.get()->EnumFormatEtc(DATADIR_GET, | 170 EXPECT_EQ(S_OK, com_data.get()->EnumFormatEtc(DATADIR_GET, |
| 171 enumerator.Receive())); | 171 enumerator.Receive())); |
| 172 | 172 |
| 173 // Test that we can get one item. | 173 // Test that we can get one item. |
| 174 { | 174 { |
| 175 // Explictly don't reset the first time, to verify the creation state is | 175 // Explictly don't reset the first time, to verify the creation state is |
| 176 // OK. | 176 // OK. |
| 177 ULONG retrieved = 0; | 177 ULONG retrieved = 0; |
| 178 FORMATETC elements_array[1]; | 178 FORMATETC elements_array[1]; |
| 179 EXPECT_EQ(S_OK, enumerator->Next(1, | 179 EXPECT_EQ(S_OK, enumerator->Next(1, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); | 213 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); |
| 214 EXPECT_EQ(1, retrieved); | 214 EXPECT_EQ(1, retrieved); |
| 215 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); | 215 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); |
| 216 } | 216 } |
| 217 | 217 |
| 218 // Test that we can skip the first item, and create a clone that matches in | 218 // Test that we can skip the first item, and create a clone that matches in |
| 219 // this state, and modify the original without affecting the clone. | 219 // this state, and modify the original without affecting the clone. |
| 220 { | 220 { |
| 221 EXPECT_EQ(S_OK, enumerator->Reset()); | 221 EXPECT_EQ(S_OK, enumerator->Reset()); |
| 222 EXPECT_EQ(S_OK, enumerator->Skip(1)); | 222 EXPECT_EQ(S_OK, enumerator->Skip(1)); |
| 223 ScopedComPtr<IEnumFORMATETC> cloned_enumerator; | 223 base::win::ScopedComPtr<IEnumFORMATETC> cloned_enumerator; |
| 224 EXPECT_EQ(S_OK, enumerator.get()->Clone(cloned_enumerator.Receive())); | 224 EXPECT_EQ(S_OK, enumerator.get()->Clone(cloned_enumerator.Receive())); |
| 225 EXPECT_EQ(S_OK, enumerator.get()->Reset()); | 225 EXPECT_EQ(S_OK, enumerator.get()->Reset()); |
| 226 | 226 |
| 227 { | 227 { |
| 228 ULONG retrieved = 0; | 228 ULONG retrieved = 0; |
| 229 FORMATETC elements_array[1]; | 229 FORMATETC elements_array[1]; |
| 230 EXPECT_EQ(S_OK, cloned_enumerator->Next(1, | 230 EXPECT_EQ(S_OK, cloned_enumerator->Next(1, |
| 231 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); | 231 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); |
| 232 EXPECT_EQ(1, retrieved); | 232 EXPECT_EQ(1, retrieved); |
| 233 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); | 233 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 260 EXPECT_TRUE(data2.GetURLAndTitle(&output_url, &output_title)); | 260 EXPECT_TRUE(data2.GetURLAndTitle(&output_url, &output_title)); |
| 261 EXPECT_EQ(url_spec, output_url.spec()); | 261 EXPECT_EQ(url_spec, output_url.spec()); |
| 262 EXPECT_EQ(url_title, output_title); | 262 EXPECT_EQ(url_title, output_title); |
| 263 std::wstring output_string; | 263 std::wstring output_string; |
| 264 | 264 |
| 265 // URL should be the raw text response | 265 // URL should be the raw text response |
| 266 EXPECT_TRUE(data2.GetString(&output_string)); | 266 EXPECT_TRUE(data2.GetString(&output_string)); |
| 267 EXPECT_EQ(url_spec, WideToUTF8(output_string)); | 267 EXPECT_EQ(url_spec, WideToUTF8(output_string)); |
| 268 | 268 |
| 269 // File contents access via COM | 269 // File contents access via COM |
| 270 ScopedComPtr<IDataObject> com_data( | 270 base::win::ScopedComPtr<IDataObject> com_data( |
| 271 OSExchangeDataProviderWin::GetIDataObject(data)); | 271 OSExchangeDataProviderWin::GetIDataObject(data)); |
| 272 { | 272 { |
| 273 CLIPFORMAT cfstr_file_contents = | 273 CLIPFORMAT cfstr_file_contents = |
| 274 RegisterClipboardFormat(CFSTR_FILECONTENTS); | 274 RegisterClipboardFormat(CFSTR_FILECONTENTS); |
| 275 FORMATETC format_etc = | 275 FORMATETC format_etc = |
| 276 { cfstr_file_contents, NULL, DVASPECT_CONTENT, 0, TYMED_HGLOBAL }; | 276 { cfstr_file_contents, NULL, DVASPECT_CONTENT, 0, TYMED_HGLOBAL }; |
| 277 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); | 277 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); |
| 278 | 278 |
| 279 STGMEDIUM medium; | 279 STGMEDIUM medium; |
| 280 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); | 280 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 | 368 |
| 369 OSExchangeData data2(CloneProvider(data)); | 369 OSExchangeData data2(CloneProvider(data)); |
| 370 ASSERT_TRUE(data2.HasURL()); | 370 ASSERT_TRUE(data2.HasURL()); |
| 371 GURL read_url; | 371 GURL read_url; |
| 372 std::wstring title; | 372 std::wstring title; |
| 373 EXPECT_TRUE(data2.GetURLAndTitle(&read_url, &title)); | 373 EXPECT_TRUE(data2.GetURLAndTitle(&read_url, &title)); |
| 374 EXPECT_EQ(GURL("http://google.com"), read_url); | 374 EXPECT_EQ(GURL("http://google.com"), read_url); |
| 375 } | 375 } |
| 376 | 376 |
| 377 } // namespace ui | 377 } // namespace ui |
| OLD | NEW |