OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 <atlbase.h> | |
6 #include <shlobj.h> | |
7 | |
8 #include "app/os_exchange_data.h" | 5 #include "app/os_exchange_data.h" |
9 #include "base/clipboard_util.h" | 6 #include "base/clipboard_util.h" |
10 #include "base/pickle.h" | 7 #include "base/pickle.h" |
11 #include "base/ref_counted.h" | 8 #include "base/ref_counted.h" |
12 #include "base/scoped_handle.h" | 9 #include "base/scoped_handle.h" |
13 #include "base/scoped_ptr.h" | 10 #include "base/scoped_ptr.h" |
14 #include "base/string_util.h" | 11 #include "base/string_util.h" |
15 #include "googleurl/src/gurl.h" | 12 #include "googleurl/src/gurl.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
17 | 14 |
(...skipping 17 matching lines...) Expand all Loading... |
35 EXPECT_EQ(url_spec, url.spec()); | 32 EXPECT_EQ(url_spec, url.spec()); |
36 // data gets freed when data2 releases the ref on it | 33 // data gets freed when data2 releases the ref on it |
37 delete data2; | 34 delete data2; |
38 } | 35 } |
39 | 36 |
40 // Test getting using the IDataObject COM API | 37 // Test getting using the IDataObject COM API |
41 TEST(OSExchangeDataTest, StringDataAccessViaCOM) { | 38 TEST(OSExchangeDataTest, StringDataAccessViaCOM) { |
42 OSExchangeData* data = new OSExchangeData; | 39 OSExchangeData* data = new OSExchangeData; |
43 std::wstring input = L"O hai googlz."; | 40 std::wstring input = L"O hai googlz."; |
44 data->SetString(input); | 41 data->SetString(input); |
45 CComPtr<IDataObject> com_data(data); | 42 ScopedComPtr<IDataObject> com_data(data); |
46 | 43 |
47 FORMATETC format_etc = | 44 FORMATETC format_etc = |
48 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 45 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
49 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); | 46 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); |
50 | 47 |
51 STGMEDIUM medium; | 48 STGMEDIUM medium; |
52 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); | 49 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); |
53 std::wstring output = | 50 std::wstring output = |
54 ScopedHGlobal<wchar_t>(medium.hGlobal).get(); | 51 ScopedHGlobal<wchar_t>(medium.hGlobal).get(); |
55 EXPECT_EQ(input, output); | 52 EXPECT_EQ(input, output); |
56 ReleaseStgMedium(&medium); | 53 ReleaseStgMedium(&medium); |
57 | |
58 // data is freed automatically by CComPtr. | |
59 } | 54 } |
60 | 55 |
61 // Test setting using the IDataObject COM API | 56 // Test setting using the IDataObject COM API |
62 TEST(OSExchangeDataTest, StringDataWritingViaCOM) { | 57 TEST(OSExchangeDataTest, StringDataWritingViaCOM) { |
63 OSExchangeData* data = new OSExchangeData; | 58 OSExchangeData* data = new OSExchangeData; |
64 std::wstring input = L"http://www.google.com/"; | 59 std::wstring input = L"http://www.google.com/"; |
65 | 60 |
66 CComPtr<IDataObject> com_data(data); | 61 ScopedComPtr<IDataObject> com_data(data); |
67 | 62 |
68 // Store data in the object using the COM SetData API. | 63 // Store data in the object using the COM SetData API. |
69 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); | 64 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); |
70 FORMATETC format_etc = | 65 FORMATETC format_etc = |
71 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 66 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
72 STGMEDIUM medium; | 67 STGMEDIUM medium; |
73 medium.tymed = TYMED_HGLOBAL; | 68 medium.tymed = TYMED_HGLOBAL; |
74 HGLOBAL glob = GlobalAlloc(GPTR, sizeof(wchar_t) * (input.size() + 1)); | 69 HGLOBAL glob = GlobalAlloc(GPTR, sizeof(wchar_t) * (input.size() + 1)); |
75 size_t stringsz = input.size(); | 70 size_t stringsz = input.size(); |
76 SIZE_T sz = GlobalSize(glob); | 71 SIZE_T sz = GlobalSize(glob); |
(...skipping 14 matching lines...) Expand all Loading... |
91 GURL reference_url(input); | 86 GURL reference_url(input); |
92 EXPECT_EQ(reference_url.spec(), url_from_data.spec()); | 87 EXPECT_EQ(reference_url.spec(), url_from_data.spec()); |
93 // deleting data2 will free data because it holds a ref to it. | 88 // deleting data2 will free data because it holds a ref to it. |
94 delete data2; | 89 delete data2; |
95 } | 90 } |
96 | 91 |
97 TEST(OSExchangeDataTest, URLDataAccessViaCOM) { | 92 TEST(OSExchangeDataTest, URLDataAccessViaCOM) { |
98 OSExchangeData* data = new OSExchangeData; | 93 OSExchangeData* data = new OSExchangeData; |
99 GURL url("http://www.google.com/"); | 94 GURL url("http://www.google.com/"); |
100 data->SetURL(url, L""); | 95 data->SetURL(url, L""); |
101 CComPtr<IDataObject> com_data(data); | 96 ScopedComPtr<IDataObject> com_data(data); |
102 | 97 |
103 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); | 98 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); |
104 FORMATETC format_etc = | 99 FORMATETC format_etc = |
105 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 100 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
106 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); | 101 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); |
107 | 102 |
108 STGMEDIUM medium; | 103 STGMEDIUM medium; |
109 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); | 104 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); |
110 std::wstring output = | 105 std::wstring output = |
111 ScopedHGlobal<wchar_t>(medium.hGlobal).get(); | 106 ScopedHGlobal<wchar_t>(medium.hGlobal).get(); |
112 EXPECT_EQ(url.spec(), WideToUTF8(output)); | 107 EXPECT_EQ(url.spec(), WideToUTF8(output)); |
113 ReleaseStgMedium(&medium); | 108 ReleaseStgMedium(&medium); |
114 } | 109 } |
115 | 110 |
116 TEST(OSExchangeDataTest, MultipleFormatsViaCOM) { | 111 TEST(OSExchangeDataTest, MultipleFormatsViaCOM) { |
117 OSExchangeData* data = new OSExchangeData; | 112 OSExchangeData* data = new OSExchangeData; |
118 std::string url_spec = "http://www.google.com/"; | 113 std::string url_spec = "http://www.google.com/"; |
119 GURL url(url_spec); | 114 GURL url(url_spec); |
120 std::wstring text = L"O hai googlz."; | 115 std::wstring text = L"O hai googlz."; |
121 data->SetURL(url, L"Google"); | 116 data->SetURL(url, L"Google"); |
122 data->SetString(text); | 117 data->SetString(text); |
123 | 118 |
124 CComPtr<IDataObject> com_data(data); | 119 ScopedComPtr<IDataObject> com_data(data); |
125 | 120 |
126 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); | 121 CLIPFORMAT cfstr_ineturl = RegisterClipboardFormat(CFSTR_INETURL); |
127 FORMATETC url_format_etc = | 122 FORMATETC url_format_etc = |
128 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 123 { cfstr_ineturl, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
129 EXPECT_EQ(S_OK, com_data->QueryGetData(&url_format_etc)); | 124 EXPECT_EQ(S_OK, com_data->QueryGetData(&url_format_etc)); |
130 FORMATETC text_format_etc = | 125 FORMATETC text_format_etc = |
131 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 126 { CF_UNICODETEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
132 EXPECT_EQ(S_OK, com_data->QueryGetData(&text_format_etc)); | 127 EXPECT_EQ(S_OK, com_data->QueryGetData(&text_format_etc)); |
133 | 128 |
134 STGMEDIUM medium; | 129 STGMEDIUM medium; |
(...skipping 14 matching lines...) Expand all Loading... |
149 | 144 |
150 TEST(OSExchangeDataTest, EnumerationViaCOM) { | 145 TEST(OSExchangeDataTest, EnumerationViaCOM) { |
151 OSExchangeData* data = new OSExchangeData; | 146 OSExchangeData* data = new OSExchangeData; |
152 data->SetURL(GURL("http://www.google.com/"), L""); | 147 data->SetURL(GURL("http://www.google.com/"), L""); |
153 data->SetString(L"O hai googlz."); | 148 data->SetString(L"O hai googlz."); |
154 | 149 |
155 CLIPFORMAT cfstr_file_group_descriptor = | 150 CLIPFORMAT cfstr_file_group_descriptor = |
156 RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR); | 151 RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR); |
157 CLIPFORMAT text_x_moz_url = RegisterClipboardFormat(L"text/x-moz-url"); | 152 CLIPFORMAT text_x_moz_url = RegisterClipboardFormat(L"text/x-moz-url"); |
158 | 153 |
159 CComPtr<IDataObject> com_data(data); | 154 ScopedComPtr<IDataObject> com_data(data); |
160 CComPtr<IEnumFORMATETC> enumerator; | 155 ScopedComPtr<IEnumFORMATETC> enumerator; |
161 EXPECT_EQ(S_OK, com_data->EnumFormatEtc(DATADIR_GET, &enumerator)); | 156 EXPECT_EQ(S_OK, com_data.get()->EnumFormatEtc(DATADIR_GET, |
| 157 enumerator.Receive())); |
162 | 158 |
163 // Test that we can get one item. | 159 // Test that we can get one item. |
164 { | 160 { |
165 // Explictly don't reset the first time, to verify the creation state is | 161 // Explictly don't reset the first time, to verify the creation state is |
166 // OK. | 162 // OK. |
167 ULONG retrieved = 0; | 163 ULONG retrieved = 0; |
168 FORMATETC elements_array[1]; | 164 FORMATETC elements_array[1]; |
169 EXPECT_EQ(S_OK, enumerator->Next(1, | 165 EXPECT_EQ(S_OK, enumerator->Next(1, |
170 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); | 166 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); |
171 EXPECT_EQ(1, retrieved); | 167 EXPECT_EQ(1, retrieved); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); | 199 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); |
204 EXPECT_EQ(1, retrieved); | 200 EXPECT_EQ(1, retrieved); |
205 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); | 201 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); |
206 } | 202 } |
207 | 203 |
208 // Test that we can skip the first item, and create a clone that matches in | 204 // Test that we can skip the first item, and create a clone that matches in |
209 // this state, and modify the original without affecting the clone. | 205 // this state, and modify the original without affecting the clone. |
210 { | 206 { |
211 EXPECT_EQ(S_OK, enumerator->Reset()); | 207 EXPECT_EQ(S_OK, enumerator->Reset()); |
212 EXPECT_EQ(S_OK, enumerator->Skip(1)); | 208 EXPECT_EQ(S_OK, enumerator->Skip(1)); |
213 CComPtr<IEnumFORMATETC> cloned_enumerator; | 209 ScopedComPtr<IEnumFORMATETC> cloned_enumerator; |
214 EXPECT_EQ(S_OK, enumerator->Clone(&cloned_enumerator)); | 210 EXPECT_EQ(S_OK, enumerator.get()->Clone(cloned_enumerator.Receive())); |
215 EXPECT_EQ(S_OK, enumerator->Reset()); | 211 EXPECT_EQ(S_OK, enumerator.get()->Reset()); |
216 | 212 |
217 { | 213 { |
218 ULONG retrieved = 0; | 214 ULONG retrieved = 0; |
219 FORMATETC elements_array[1]; | 215 FORMATETC elements_array[1]; |
220 EXPECT_EQ(S_OK, cloned_enumerator->Next(1, | 216 EXPECT_EQ(S_OK, cloned_enumerator->Next(1, |
221 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); | 217 reinterpret_cast<FORMATETC*>(&elements_array), &retrieved)); |
222 EXPECT_EQ(1, retrieved); | 218 EXPECT_EQ(1, retrieved); |
223 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); | 219 EXPECT_EQ(cfstr_file_group_descriptor, elements_array[0].cfFormat); |
224 } | 220 } |
225 | 221 |
(...skipping 24 matching lines...) Expand all Loading... |
250 EXPECT_TRUE(data2->GetURLAndTitle(&output_url, &output_title)); | 246 EXPECT_TRUE(data2->GetURLAndTitle(&output_url, &output_title)); |
251 EXPECT_EQ(url_spec, output_url.spec()); | 247 EXPECT_EQ(url_spec, output_url.spec()); |
252 EXPECT_EQ(url_title, output_title); | 248 EXPECT_EQ(url_title, output_title); |
253 std::wstring output_string; | 249 std::wstring output_string; |
254 | 250 |
255 // URL should be the raw text response | 251 // URL should be the raw text response |
256 EXPECT_TRUE(data2->GetString(&output_string)); | 252 EXPECT_TRUE(data2->GetString(&output_string)); |
257 EXPECT_EQ(url_spec, WideToUTF8(output_string)); | 253 EXPECT_EQ(url_spec, WideToUTF8(output_string)); |
258 | 254 |
259 // File contents access via COM | 255 // File contents access via COM |
260 CComPtr<IDataObject> com_data(data); | 256 ScopedComPtr<IDataObject> com_data(data); |
261 { | 257 { |
262 CLIPFORMAT cfstr_file_contents = | 258 CLIPFORMAT cfstr_file_contents = |
263 RegisterClipboardFormat(CFSTR_FILECONTENTS); | 259 RegisterClipboardFormat(CFSTR_FILECONTENTS); |
264 FORMATETC format_etc = | 260 FORMATETC format_etc = |
265 { cfstr_file_contents, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; | 261 { cfstr_file_contents, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; |
266 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); | 262 EXPECT_EQ(S_OK, com_data->QueryGetData(&format_etc)); |
267 | 263 |
268 STGMEDIUM medium; | 264 STGMEDIUM medium; |
269 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); | 265 EXPECT_EQ(S_OK, com_data->GetData(&format_etc, &medium)); |
270 ScopedHGlobal<char> glob(medium.hGlobal); | 266 ScopedHGlobal<char> glob(medium.hGlobal); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 scoped_refptr<OSExchangeData> data(new OSExchangeData); | 352 scoped_refptr<OSExchangeData> data(new OSExchangeData); |
357 data->SetString(L"http://google.com"); | 353 data->SetString(L"http://google.com"); |
358 | 354 |
359 scoped_ptr<OSExchangeData> data2(new OSExchangeData(data.get())); | 355 scoped_ptr<OSExchangeData> data2(new OSExchangeData(data.get())); |
360 ASSERT_TRUE(data2->HasURL()); | 356 ASSERT_TRUE(data2->HasURL()); |
361 GURL read_url; | 357 GURL read_url; |
362 std::wstring title; | 358 std::wstring title; |
363 EXPECT_TRUE(data2->GetURLAndTitle(&read_url, &title)); | 359 EXPECT_TRUE(data2->GetURLAndTitle(&read_url, &title)); |
364 EXPECT_EQ(GURL("http://google.com"), read_url); | 360 EXPECT_EQ(GURL("http://google.com"), read_url); |
365 } | 361 } |
OLD | NEW |