Chromium Code Reviews| 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) | |
|
Lei Zhang
2016/03/08 23:37:59
nit: add extra space, run git cl lint.
satorux1
2016/03/09 05:28:18
Done.
| |
| 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 |