OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/image_decoder.h" | 5 #include "chrome/browser/image_decoder.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 #include "chrome/grit/generated_resources.h" | 9 #include "chrome/grit/generated_resources.h" |
10 #include "chrome/test/base/in_process_browser_test.h" | 10 #include "chrome/test/base/in_process_browser_test.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 static const char kPngData[] = | 23 static const char kPngData[] = |
24 "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52" | 24 "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52" |
25 "\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90\x77\x53" | 25 "\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90\x77\x53" |
26 "\xde\x00\x00\x00\x0c\x49\x44\x41\x54\x08\xd7\x63\xf8\xff\xff\x3f" | 26 "\xde\x00\x00\x00\x0c\x49\x44\x41\x54\x08\xd7\x63\xf8\xff\xff\x3f" |
27 "\x00\x05\xfe\x02\xfe\xdc\xcc\x59\xe7\x00\x00\x00\x00\x49\x45\x4e" | 27 "\x00\x05\xfe\x02\xfe\xdc\xcc\x59\xe7\x00\x00\x00\x00\x49\x45\x4e" |
28 "\x44\xae\x42\x60\x82"; | 28 "\x44\xae\x42\x60\x82"; |
29 // Need to specify the buffer size because it contains NULs. | 29 // Need to specify the buffer size because it contains NULs. |
30 return std::string(kPngData, sizeof(kPngData) - 1); | 30 return std::string(kPngData, sizeof(kPngData) - 1); |
31 } | 31 } |
32 | 32 |
| 33 #if defined(OS_CHROMEOS) |
| 34 |
| 35 std::string GetValidJpgString() { |
| 36 // 1x1 JPG created from the 1x1 PNG above. |
| 37 static const char kJpgData[] = |
| 38 "\xFF\xD8\xFF\xE0\x00\x10\x4A\x46\x49\x46\x00\x01\x01\x01\x00\x48" |
| 39 "\x00\x48\x00\x00\xFF\xDB\x00\x43\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 40 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 41 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 42 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 43 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xDB\x00\x43\x01\xFF\xFF" |
| 44 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 45 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 46 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" |
| 47 "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC0" |
| 48 "\x00\x11\x08\x00\x01\x00\x01\x03\x01\x22\x00\x02\x11\x01\x03\x11" |
| 49 "\x01\xFF\xC4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00" |
| 50 "\x00\x00\x00\x00\x00\x00\x00\x03\xFF\xC4\x00\x14\x10\x01\x00\x00" |
| 51 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xC4" |
| 52 "\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" |
| 53 "\x00\x00\x00\x00\xFF\xC4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00" |
| 54 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xDA\x00\x0C\x03\x01" |
| 55 "\x00\x02\x11\x03\x11\x00\x3F\x00\xA0\x00\xFF\xD9"; |
| 56 // Need to specify the buffer size because it contains NULs. |
| 57 return std::string(kJpgData, sizeof(kJpgData) - 1); |
| 58 } |
| 59 |
| 60 #endif // defined(OS_CHROMEOS) |
| 61 |
33 class TestImageRequest : public ImageDecoder::ImageRequest { | 62 class TestImageRequest : public ImageDecoder::ImageRequest { |
34 public: | 63 public: |
35 explicit TestImageRequest(const base::Closure& quit_closure) | 64 explicit TestImageRequest(const base::Closure& quit_closure) |
36 : decode_succeeded_(false), | 65 : decode_succeeded_(false), |
37 quit_closure_(quit_closure), | 66 quit_closure_(quit_closure), |
38 quit_called_(false) { | 67 quit_called_(false) { |
39 } | 68 } |
40 | 69 |
41 ~TestImageRequest() override { | 70 ~TestImageRequest() override { |
42 if (!quit_called_) { | 71 if (!quit_called_) { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 | 161 |
133 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, Basic) { | 162 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, Basic) { |
134 scoped_refptr<content::MessageLoopRunner> runner = | 163 scoped_refptr<content::MessageLoopRunner> runner = |
135 new content::MessageLoopRunner; | 164 new content::MessageLoopRunner; |
136 TestImageRequest test_request(runner->QuitClosure()); | 165 TestImageRequest test_request(runner->QuitClosure()); |
137 ImageDecoder::Start(&test_request, std::string()); | 166 ImageDecoder::Start(&test_request, std::string()); |
138 runner->Run(); | 167 runner->Run(); |
139 EXPECT_FALSE(test_request.decode_succeeded()); | 168 EXPECT_FALSE(test_request.decode_succeeded()); |
140 } | 169 } |
141 | 170 |
| 171 #if defined(OS_CHROMEOS) |
| 172 |
| 173 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, RobustJpegCodecWithJpegData) { |
| 174 scoped_refptr<content::MessageLoopRunner> runner = |
| 175 new content::MessageLoopRunner; |
| 176 TestImageRequest test_request(runner->QuitClosure()); |
| 177 ImageDecoder::StartWithOptions(&test_request, GetValidJpgString(), |
| 178 ImageDecoder::ROBUST_JPEG_CODEC, |
| 179 false /* shrink_to_fit */); |
| 180 runner->Run(); |
| 181 EXPECT_TRUE(test_request.decode_succeeded()); |
| 182 } |
| 183 |
| 184 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, RobustJpegCodecWithPngData) { |
| 185 scoped_refptr<content::MessageLoopRunner> runner = |
| 186 new content::MessageLoopRunner; |
| 187 TestImageRequest test_request(runner->QuitClosure()); |
| 188 ImageDecoder::StartWithOptions(&test_request, GetValidPngString(), |
| 189 ImageDecoder::ROBUST_JPEG_CODEC, |
| 190 false /* shrink_to_fit */); |
| 191 runner->Run(); |
| 192 // Should fail with PNG data because only JPEG data is allowed. |
| 193 EXPECT_FALSE(test_request.decode_succeeded()); |
| 194 } |
| 195 |
| 196 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, RobustPngCodecWithPngData) { |
| 197 scoped_refptr<content::MessageLoopRunner> runner = |
| 198 new content::MessageLoopRunner; |
| 199 TestImageRequest test_request(runner->QuitClosure()); |
| 200 ImageDecoder::StartWithOptions(&test_request, GetValidPngString(), |
| 201 ImageDecoder::ROBUST_PNG_CODEC, |
| 202 false /* shrink_to_fit */); |
| 203 runner->Run(); |
| 204 EXPECT_TRUE(test_request.decode_succeeded()); |
| 205 } |
| 206 |
| 207 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, RobustPngCodecWithJpegData) { |
| 208 scoped_refptr<content::MessageLoopRunner> runner = |
| 209 new content::MessageLoopRunner; |
| 210 TestImageRequest test_request(runner->QuitClosure()); |
| 211 ImageDecoder::StartWithOptions(&test_request, GetValidJpgString(), |
| 212 ImageDecoder::ROBUST_PNG_CODEC, |
| 213 false /* shrink_to_fit */); |
| 214 runner->Run(); |
| 215 // Should fail with JPEG data because only PNG data is allowed. |
| 216 EXPECT_FALSE(test_request.decode_succeeded()); |
| 217 } |
| 218 |
| 219 #endif // defined(OS_CHROMEOS) |
| 220 |
142 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, BasicDecode) { | 221 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, BasicDecode) { |
143 scoped_refptr<content::MessageLoopRunner> runner = | 222 scoped_refptr<content::MessageLoopRunner> runner = |
144 new content::MessageLoopRunner; | 223 new content::MessageLoopRunner; |
145 TestImageRequest test_request(runner->QuitClosure()); | 224 TestImageRequest test_request(runner->QuitClosure()); |
146 ImageDecoder::Start(&test_request, GetValidPngString()); | 225 ImageDecoder::Start(&test_request, GetValidPngString()); |
147 runner->Run(); | 226 runner->Run(); |
148 EXPECT_TRUE(test_request.decode_succeeded()); | 227 EXPECT_TRUE(test_request.decode_succeeded()); |
149 } | 228 } |
150 | 229 |
151 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndDestroy) { | 230 IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndDestroy) { |
(...skipping 18 matching lines...) Expand all Loading... |
170 new content::MessageLoopRunner; | 249 new content::MessageLoopRunner; |
171 TestImageRequest test_request(runner->QuitClosure()); | 250 TestImageRequest test_request(runner->QuitClosure()); |
172 ImageDecoder::Start(&test_request, GetValidPngString()); | 251 ImageDecoder::Start(&test_request, GetValidPngString()); |
173 runner->Run(); | 252 runner->Run(); |
174 if (!test_request.decode_succeeded()) { | 253 if (!test_request.decode_succeeded()) { |
175 // The UI thread won the race. Make sure the utility process did get killed. | 254 // The UI thread won the race. Make sure the utility process did get killed. |
176 EXPECT_TRUE(observer.did_kill()); | 255 EXPECT_TRUE(observer.did_kill()); |
177 } | 256 } |
178 // Else the IO thread won the race and the image got decoded. Oh well. | 257 // Else the IO thread won the race and the image got decoded. Oh well. |
179 } | 258 } |
OLD | NEW |