| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <memory> | 5 #include <memory> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "content/public/test/browser_test.h" | 10 #include "content/public/test/browser_test.h" |
| 11 #include "headless/public/devtools/domains/page.h" | 11 #include "headless/public/devtools/domains/page.h" |
| 12 #include "headless/public/devtools/domains/runtime.h" | 12 #include "headless/public/devtools/domains/runtime.h" |
| 13 #include "headless/public/devtools/domains/security.h" | 13 #include "headless/public/devtools/domains/security.h" |
| 14 #include "headless/public/headless_browser.h" | 14 #include "headless/public/headless_browser.h" |
| 15 #include "headless/public/headless_devtools_client.h" | 15 #include "headless/public/headless_devtools_client.h" |
| 16 #include "headless/public/headless_tab_socket.h" | 16 #include "headless/public/headless_tab_socket.h" |
| 17 #include "headless/public/headless_web_contents.h" | 17 #include "headless/public/headless_web_contents.h" |
| 18 #include "headless/test/headless_browser_test.h" | 18 #include "headless/test/headless_browser_test.h" |
| 19 #include "printing/features/features.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "third_party/skia/include/core/SkBitmap.h" | 22 #include "third_party/skia/include/core/SkBitmap.h" |
| 22 #include "third_party/skia/include/core/SkColor.h" | 23 #include "third_party/skia/include/core/SkColor.h" |
| 23 #include "ui/gfx/codec/png_codec.h" | 24 #include "ui/gfx/codec/png_codec.h" |
| 24 #include "ui/gfx/geometry/size.h" | 25 #include "ui/gfx/geometry/size.h" |
| 25 #include "url/gurl.h" | 26 #include "url/gurl.h" |
| 26 | 27 |
| 28 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 29 #include "base/strings/string_number_conversions.h" |
| 30 #include "pdf/pdf.h" |
| 31 #include "printing/pdf_render_settings.h" |
| 32 #include "printing/units.h" |
| 33 #include "ui/gfx/geometry/rect.h" |
| 34 #endif |
| 35 |
| 27 using testing::UnorderedElementsAre; | 36 using testing::UnorderedElementsAre; |
| 28 | 37 |
| 29 namespace headless { | 38 namespace headless { |
| 30 | 39 |
| 31 class HeadlessWebContentsTest : public HeadlessBrowserTest {}; | 40 class HeadlessWebContentsTest : public HeadlessBrowserTest {}; |
| 32 | 41 |
| 33 IN_PROC_BROWSER_TEST_F(HeadlessWebContentsTest, Navigation) { | 42 IN_PROC_BROWSER_TEST_F(HeadlessWebContentsTest, Navigation) { |
| 34 EXPECT_TRUE(embedded_test_server()->Start()); | 43 EXPECT_TRUE(embedded_test_server()->Start()); |
| 35 | 44 |
| 36 HeadlessBrowserContext* browser_context = | 45 HeadlessBrowserContext* browser_context = |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 void OnPageSetupCompleted(std::unique_ptr<runtime::EvaluateResult> result) { | 146 void OnPageSetupCompleted(std::unique_ptr<runtime::EvaluateResult> result) { |
| 138 devtools_client_->GetPage()->GetExperimental()->CaptureScreenshot( | 147 devtools_client_->GetPage()->GetExperimental()->CaptureScreenshot( |
| 139 page::CaptureScreenshotParams::Builder().SetFromSurface(true).Build(), | 148 page::CaptureScreenshotParams::Builder().SetFromSurface(true).Build(), |
| 140 base::Bind(&HeadlessWebContentsScreenshotTest::OnScreenshotCaptured, | 149 base::Bind(&HeadlessWebContentsScreenshotTest::OnScreenshotCaptured, |
| 141 base::Unretained(this))); | 150 base::Unretained(this))); |
| 142 } | 151 } |
| 143 | 152 |
| 144 void OnScreenshotCaptured( | 153 void OnScreenshotCaptured( |
| 145 std::unique_ptr<page::CaptureScreenshotResult> result) { | 154 std::unique_ptr<page::CaptureScreenshotResult> result) { |
| 146 std::string base64 = result->GetData(); | 155 std::string base64 = result->GetData(); |
| 147 EXPECT_LT(0U, base64.length()); | 156 EXPECT_GT(base64.length(), 0U); |
| 148 SkBitmap result_bitmap; | 157 SkBitmap result_bitmap; |
| 149 EXPECT_TRUE(DecodePNG(base64, &result_bitmap)); | 158 EXPECT_TRUE(DecodePNG(base64, &result_bitmap)); |
| 150 | 159 |
| 151 EXPECT_EQ(800, result_bitmap.width()); | 160 EXPECT_EQ(800, result_bitmap.width()); |
| 152 EXPECT_EQ(600, result_bitmap.height()); | 161 EXPECT_EQ(600, result_bitmap.height()); |
| 153 SkColor actual_color = result_bitmap.getColor(400, 300); | 162 SkColor actual_color = result_bitmap.getColor(400, 300); |
| 154 SkColor expected_color = SkColorSetRGB(0x00, 0x00, 0xff); | 163 SkColor expected_color = SkColorSetRGB(0x00, 0x00, 0xff); |
| 155 EXPECT_EQ(expected_color, actual_color); | 164 EXPECT_EQ(expected_color, actual_color); |
| 156 FinishAsynchronousTest(); | 165 FinishAsynchronousTest(); |
| 157 } | 166 } |
| 158 }; | 167 }; |
| 159 | 168 |
| 160 HEADLESS_ASYNC_DEVTOOLED_TEST_P(HeadlessWebContentsScreenshotTest); | 169 HEADLESS_ASYNC_DEVTOOLED_TEST_P(HeadlessWebContentsScreenshotTest); |
| 161 | 170 |
| 162 // Instantiate test case for both software and gpu compositing modes. | 171 // Instantiate test case for both software and gpu compositing modes. |
| 163 INSTANTIATE_TEST_CASE_P(HeadlessWebContentsScreenshotTests, | 172 INSTANTIATE_TEST_CASE_P(HeadlessWebContentsScreenshotTests, |
| 164 HeadlessWebContentsScreenshotTest, | 173 HeadlessWebContentsScreenshotTest, |
| 165 ::testing::Bool()); | 174 ::testing::Bool()); |
| 166 | 175 |
| 176 #if BUILDFLAG(ENABLE_BASIC_PRINTING) |
| 177 class HeadlessWebContentsPDFTest : public HeadlessAsyncDevTooledBrowserTest { |
| 178 public: |
| 179 const double kPaperWidth = 10; |
| 180 const double kPaperHeight = 15; |
| 181 const double kDocHeight = 50; |
| 182 // Number of color channels in a BGRA bitmap. |
| 183 const int kColorChannels = 4; |
| 184 const int kDpi = 300; |
| 185 |
| 186 void RunDevTooledTest() override { |
| 187 std::string height_expression = "document.body.style.height = '" + |
| 188 base::DoubleToString(kDocHeight) + "in'"; |
| 189 std::unique_ptr<runtime::EvaluateParams> params = |
| 190 runtime::EvaluateParams::Builder() |
| 191 .SetExpression("document.body.style.background = '#123456';" + |
| 192 height_expression) |
| 193 .Build(); |
| 194 devtools_client_->GetRuntime()->Evaluate( |
| 195 std::move(params), |
| 196 base::Bind(&HeadlessWebContentsPDFTest::OnPageSetupCompleted, |
| 197 base::Unretained(this))); |
| 198 } |
| 199 |
| 200 void OnPageSetupCompleted(std::unique_ptr<runtime::EvaluateResult> result) { |
| 201 devtools_client_->GetPage()->GetExperimental()->PrintToPDF( |
| 202 page::PrintToPDFParams::Builder() |
| 203 .SetPrintBackground(true) |
| 204 .SetPaperHeight(kPaperHeight) |
| 205 .SetPaperWidth(kPaperWidth) |
| 206 .SetMarginTop(0) |
| 207 .SetMarginBottom(0) |
| 208 .SetMarginLeft(0) |
| 209 .SetMarginRight(0) |
| 210 .Build(), |
| 211 base::Bind(&HeadlessWebContentsPDFTest::OnPDFCreated, |
| 212 base::Unretained(this))); |
| 213 } |
| 214 |
| 215 void OnPDFCreated(std::unique_ptr<page::PrintToPDFResult> result) { |
| 216 std::string base64 = result->GetData(); |
| 217 EXPECT_GT(base64.length(), 0U); |
| 218 std::string pdf_data; |
| 219 EXPECT_TRUE(base::Base64Decode(base64, &pdf_data)); |
| 220 |
| 221 int num_pages; |
| 222 EXPECT_TRUE(chrome_pdf::GetPDFDocInfo(pdf_data.data(), pdf_data.size(), |
| 223 &num_pages, nullptr)); |
| 224 EXPECT_EQ(std::ceil(kDocHeight / kPaperHeight), num_pages); |
| 225 |
| 226 for (int i = 0; i < num_pages; i++) { |
| 227 double width_in_points; |
| 228 double height_in_points; |
| 229 EXPECT_TRUE(chrome_pdf::GetPDFPageSizeByIndex( |
| 230 pdf_data.data(), pdf_data.size(), i, &width_in_points, |
| 231 &height_in_points)); |
| 232 EXPECT_EQ(static_cast<int>(width_in_points), |
| 233 static_cast<int>(kPaperWidth * printing::kPointsPerInch)); |
| 234 EXPECT_EQ(static_cast<int>(height_in_points), |
| 235 static_cast<int>(kPaperHeight * printing::kPointsPerInch)); |
| 236 |
| 237 gfx::Rect rect(kPaperWidth * kDpi, kPaperHeight * kDpi); |
| 238 printing::PdfRenderSettings settings( |
| 239 rect, gfx::Point(0, 0), kDpi, true, |
| 240 printing::PdfRenderSettings::Mode::NORMAL); |
| 241 std::vector<uint8_t> page_bitmap_data(kColorChannels * |
| 242 settings.area.size().GetArea()); |
| 243 EXPECT_TRUE(chrome_pdf::RenderPDFPageToBitmap( |
| 244 pdf_data.data(), pdf_data.size(), i, page_bitmap_data.data(), |
| 245 settings.area.size().width(), settings.area.size().height(), |
| 246 settings.dpi, settings.autorotate)); |
| 247 EXPECT_EQ(0x56, page_bitmap_data[0]); // B |
| 248 EXPECT_EQ(0x34, page_bitmap_data[1]); // G |
| 249 EXPECT_EQ(0x12, page_bitmap_data[2]); // R |
| 250 } |
| 251 FinishAsynchronousTest(); |
| 252 } |
| 253 }; |
| 254 |
| 255 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessWebContentsPDFTest); |
| 256 #endif |
| 257 |
| 167 class HeadlessWebContentsSecurityTest | 258 class HeadlessWebContentsSecurityTest |
| 168 : public HeadlessAsyncDevTooledBrowserTest, | 259 : public HeadlessAsyncDevTooledBrowserTest, |
| 169 public security::ExperimentalObserver { | 260 public security::ExperimentalObserver { |
| 170 public: | 261 public: |
| 171 void RunDevTooledTest() override { | 262 void RunDevTooledTest() override { |
| 172 devtools_client_->GetSecurity()->GetExperimental()->AddObserver(this); | 263 devtools_client_->GetSecurity()->GetExperimental()->AddObserver(this); |
| 173 devtools_client_->GetSecurity()->GetExperimental()->Enable( | 264 devtools_client_->GetSecurity()->GetExperimental()->Enable( |
| 174 security::EnableParams::Builder().Build()); | 265 security::EnableParams::Builder().Build()); |
| 175 } | 266 } |
| 176 | 267 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 EXPECT_EQ("Embedder sent us: Hello", message); | 307 EXPECT_EQ("Embedder sent us: Hello", message); |
| 217 FinishAsynchronousTest(); | 308 FinishAsynchronousTest(); |
| 218 } | 309 } |
| 219 | 310 |
| 220 bool GetCreateTabSocket() override { return true; } | 311 bool GetCreateTabSocket() override { return true; } |
| 221 }; | 312 }; |
| 222 | 313 |
| 223 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessTabSocketTest); | 314 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessTabSocketTest); |
| 224 | 315 |
| 225 } // namespace headless | 316 } // namespace headless |
| OLD | NEW |