OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 WebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromNode(LocalFrame* f
rame, const WebNode& node) | 264 WebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromNode(LocalFrame* f
rame, const WebNode& node) |
265 { | 265 { |
266 WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame); | 266 WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame); |
267 if (pluginContainer) | 267 if (pluginContainer) |
268 return pluginContainer; | 268 return pluginContainer; |
269 return toWebPluginContainerImpl(node.pluginContainer()); | 269 return toWebPluginContainerImpl(node.pluginContainer()); |
270 } | 270 } |
271 | 271 |
272 // Simple class to override some of PrintContext behavior. Some of the methods | 272 // Simple class to override some of PrintContext behavior. Some of the methods |
273 // made virtual so that they can be overridden by ChromePluginPrintContext. | 273 // made virtual so that they can be overridden by ChromePluginPrintContext. |
274 class ChromePrintContext : public PrintContext, public DisplayItemClient { | 274 class ChromePrintContext : public PrintContext { |
275 WTF_MAKE_NONCOPYABLE(ChromePrintContext); | 275 WTF_MAKE_NONCOPYABLE(ChromePrintContext); |
276 public: | 276 public: |
277 ChromePrintContext(LocalFrame* frame) | 277 ChromePrintContext(LocalFrame* frame) |
278 : PrintContext(frame) | 278 : PrintContext(frame) |
279 , m_printedPageWidth(0) | 279 , m_printedPageWidth(0) |
280 { | 280 { |
281 } | 281 } |
282 | 282 |
283 ~ChromePrintContext() override {} | 283 ~ChromePrintContext() override {} |
284 | 284 |
(...skipping 17 matching lines...) Expand all Loading... |
302 return 0; | 302 return 0; |
303 | 303 |
304 frame()->view()->updateAllLifecyclePhasesExceptPaint(); | 304 frame()->view()->updateAllLifecyclePhasesExceptPaint(); |
305 if (!frame()->document() || frame()->document()->layoutViewItem().isNull
()) | 305 if (!frame()->document() || frame()->document()->layoutViewItem().isNull
()) |
306 return 0; | 306 return 0; |
307 | 307 |
308 IntRect pageRect = m_pageRects[pageNumber]; | 308 IntRect pageRect = m_pageRects[pageNumber]; |
309 SkPictureBuilder pictureBuilder(pageRect, &skia::GetMetaData(*canvas)); | 309 SkPictureBuilder pictureBuilder(pageRect, &skia::GetMetaData(*canvas)); |
310 pictureBuilder.context().setPrinting(true); | 310 pictureBuilder.context().setPrinting(true); |
311 | 311 |
312 float scale = spoolPage(pictureBuilder.context(), pageNumber); | 312 float scale = spoolPage(pictureBuilder, pageNumber); |
313 pictureBuilder.endRecording()->playback(canvas); | 313 pictureBuilder.endRecording()->playback(canvas); |
314 return scale; | 314 return scale; |
315 } | 315 } |
316 | 316 |
317 void spoolAllPagesWithBoundaries(WebCanvas* canvas, const FloatSize& pageSiz
eInPixels) | 317 void spoolAllPagesWithBoundaries(WebCanvas* canvas, const FloatSize& pageSiz
eInPixels) |
318 { | 318 { |
319 dispatchEventsForPrintingOnAllFrames(); | 319 dispatchEventsForPrintingOnAllFrames(); |
320 if (!frame()->document() || frame()->document()->layoutViewItem().isNull
()) | 320 if (!frame()->document() || frame()->document()->layoutViewItem().isNull
()) |
321 return; | 321 return; |
322 | 322 |
323 frame()->view()->updateAllLifecyclePhasesExceptPaint(); | 323 frame()->view()->updateAllLifecyclePhasesExceptPaint(); |
324 if (!frame()->document() || frame()->document()->layoutViewItem().isNull
()) | 324 if (!frame()->document() || frame()->document()->layoutViewItem().isNull
()) |
325 return; | 325 return; |
326 | 326 |
327 float pageHeight; | 327 float pageHeight; |
328 computePageRects(FloatRect(FloatPoint(0, 0), pageSizeInPixels), 0, 0, 1,
pageHeight); | 328 computePageRects(FloatRect(FloatPoint(0, 0), pageSizeInPixels), 0, 0, 1,
pageHeight); |
329 | 329 |
330 const float pageWidth = pageSizeInPixels.width(); | 330 const float pageWidth = pageSizeInPixels.width(); |
331 size_t numPages = pageRects().size(); | 331 size_t numPages = pageRects().size(); |
332 int totalHeight = numPages * (pageSizeInPixels.height() + 1) - 1; | 332 int totalHeight = numPages * (pageSizeInPixels.height() + 1) - 1; |
333 IntRect allPagesRect(0, 0, pageWidth, totalHeight); | 333 IntRect allPagesRect(0, 0, pageWidth, totalHeight); |
334 | 334 |
335 SkPictureBuilder pictureBuilder(allPagesRect, &skia::GetMetaData(*canvas
)); | 335 SkPictureBuilder pictureBuilder(allPagesRect, &skia::GetMetaData(*canvas
)); |
336 pictureBuilder.context().setPrinting(true); | 336 pictureBuilder.context().setPrinting(true); |
337 | 337 |
338 GraphicsContext& context = pictureBuilder.context(); | 338 GraphicsContext& context = pictureBuilder.context(); |
339 | 339 |
340 // Fill the whole background by white. | 340 // Fill the whole background by white. |
341 { | 341 { |
342 DrawingRecorder backgroundRecorder(context, *this, DisplayItem::Prin
tedContentBackground, allPagesRect); | 342 DrawingRecorder backgroundRecorder(context, pictureBuilder, DisplayI
tem::PrintedContentBackground, allPagesRect); |
343 context.fillRect(FloatRect(0, 0, pageWidth, totalHeight), Color::whi
te); | 343 context.fillRect(FloatRect(0, 0, pageWidth, totalHeight), Color::whi
te); |
344 } | 344 } |
345 | 345 |
346 int currentHeight = 0; | 346 int currentHeight = 0; |
347 for (size_t pageIndex = 0; pageIndex < numPages; pageIndex++) { | 347 for (size_t pageIndex = 0; pageIndex < numPages; pageIndex++) { |
348 ScopeRecorder scopeRecorder(context); | 348 ScopeRecorder scopeRecorder(context); |
349 // Draw a line for a page boundary if this isn't the first page. | 349 // Draw a line for a page boundary if this isn't the first page. |
350 if (pageIndex > 0) { | 350 if (pageIndex > 0) { |
351 DrawingRecorder lineBoundaryRecorder(context, *this, DisplayItem
::PrintedContentLineBoundary, allPagesRect); | 351 DrawingRecorder lineBoundaryRecorder(context, pictureBuilder, Di
splayItem::PrintedContentLineBoundary, allPagesRect); |
352 context.save(); | 352 context.save(); |
353 context.setStrokeColor(Color(0, 0, 255)); | 353 context.setStrokeColor(Color(0, 0, 255)); |
354 context.setFillColor(Color(0, 0, 255)); | 354 context.setFillColor(Color(0, 0, 255)); |
355 context.drawLine(IntPoint(0, currentHeight), IntPoint(pageWidth,
currentHeight)); | 355 context.drawLine(IntPoint(0, currentHeight), IntPoint(pageWidth,
currentHeight)); |
356 context.restore(); | 356 context.restore(); |
357 } | 357 } |
358 | 358 |
359 AffineTransform transform; | 359 AffineTransform transform; |
360 transform.translate(0, currentHeight); | 360 transform.translate(0, currentHeight); |
361 #if OS(WIN) || OS(MACOSX) | 361 #if OS(WIN) || OS(MACOSX) |
362 // Account for the disabling of scaling in spoolPage. In the context | 362 // Account for the disabling of scaling in spoolPage. In the context |
363 // of spoolAllPagesWithBoundaries the scale HAS NOT been pre-applied
. | 363 // of spoolAllPagesWithBoundaries the scale HAS NOT been pre-applied
. |
364 float scale = getPageShrink(pageIndex); | 364 float scale = getPageShrink(pageIndex); |
365 transform.scale(scale, scale); | 365 transform.scale(scale, scale); |
366 #endif | 366 #endif |
367 TransformRecorder transformRecorder(context, *this, transform); | 367 TransformRecorder transformRecorder(context, pictureBuilder, transfo
rm); |
368 spoolPage(context, pageIndex); | 368 spoolPage(pictureBuilder, pageIndex); |
369 | 369 |
370 currentHeight += pageSizeInPixels.height() + 1; | 370 currentHeight += pageSizeInPixels.height() + 1; |
371 } | 371 } |
372 pictureBuilder.endRecording()->playback(canvas); | 372 pictureBuilder.endRecording()->playback(canvas); |
373 } | 373 } |
374 | 374 |
375 // DisplayItemClient methods | |
376 String debugName() const final { return "ChromePrintContext"; } | |
377 LayoutRect visualRect() const override { return LayoutRect(); } | |
378 | |
379 protected: | 375 protected: |
380 // Spools the printed page, a subrect of frame(). Skip the scale step. | 376 // Spools the printed page, a subrect of frame(). Skip the scale step. |
381 // NativeTheme doesn't play well with scaling. Scaling is done browser side | 377 // NativeTheme doesn't play well with scaling. Scaling is done browser side |
382 // instead. Returns the scale to be applied. | 378 // instead. Returns the scale to be applied. |
383 // On Linux, we don't have the problem with NativeTheme, hence we let WebKit | 379 // On Linux, we don't have the problem with NativeTheme, hence we let WebKit |
384 // do the scaling and ignore the return value. | 380 // do the scaling and ignore the return value. |
385 virtual float spoolPage(GraphicsContext& context, int pageNumber) | 381 virtual float spoolPage(SkPictureBuilder& pictureBuilder, int pageNumber) |
386 { | 382 { |
387 IntRect pageRect = m_pageRects[pageNumber]; | 383 IntRect pageRect = m_pageRects[pageNumber]; |
388 float scale = m_printedPageWidth / pageRect.width(); | 384 float scale = m_printedPageWidth / pageRect.width(); |
| 385 GraphicsContext& context = pictureBuilder.context(); |
389 | 386 |
390 AffineTransform transform; | 387 AffineTransform transform; |
391 #if OS(POSIX) && !OS(MACOSX) | 388 #if OS(POSIX) && !OS(MACOSX) |
392 transform.scale(scale); | 389 transform.scale(scale); |
393 #endif | 390 #endif |
394 transform.translate(static_cast<float>(-pageRect.x()), static_cast<float
>(-pageRect.y())); | 391 transform.translate(static_cast<float>(-pageRect.x()), static_cast<float
>(-pageRect.y())); |
395 TransformRecorder transformRecorder(context, *this, transform); | 392 TransformRecorder transformRecorder(context, pictureBuilder, transform); |
396 | 393 |
397 ClipRecorder clipRecorder(context, *this, DisplayItem::ClipPrintedPage,
LayoutRect(pageRect)); | 394 ClipRecorder clipRecorder(context, pictureBuilder, DisplayItem::ClipPrin
tedPage, LayoutRect(pageRect)); |
398 | 395 |
399 frame()->view()->paintContents(context, GlobalPaintNormalPhase, pageRect
); | 396 frame()->view()->paintContents(context, GlobalPaintNormalPhase, pageRect
); |
400 | 397 |
401 { | 398 { |
402 DrawingRecorder lineBoundaryRecorder(context, *this, DisplayItem::Pr
intedContentDestinationLocations, pageRect); | 399 DrawingRecorder lineBoundaryRecorder(context, pictureBuilder, Displa
yItem::PrintedContentDestinationLocations, pageRect); |
403 outputLinkedDestinations(context, pageRect); | 400 outputLinkedDestinations(context, pageRect); |
404 } | 401 } |
405 | 402 |
406 return scale; | 403 return scale; |
407 } | 404 } |
408 | 405 |
409 private: | 406 private: |
410 void dispatchEventsForPrintingOnAllFrames() | 407 void dispatchEventsForPrintingOnAllFrames() |
411 { | 408 { |
412 HeapVector<Member<Document>> documents; | 409 HeapVector<Member<Document>> documents; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 | 461 |
465 void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels) overrid
e | 462 void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels) overrid
e |
466 { | 463 { |
467 NOTREACHED(); | 464 NOTREACHED(); |
468 } | 465 } |
469 | 466 |
470 protected: | 467 protected: |
471 // Spools the printed page, a subrect of frame(). Skip the scale step. | 468 // Spools the printed page, a subrect of frame(). Skip the scale step. |
472 // NativeTheme doesn't play well with scaling. Scaling is done browser side | 469 // NativeTheme doesn't play well with scaling. Scaling is done browser side |
473 // instead. Returns the scale to be applied. | 470 // instead. Returns the scale to be applied. |
474 float spoolPage(GraphicsContext& context, int pageNumber) override | 471 float spoolPage(SkPictureBuilder& pictureBuilder, int pageNumber) override |
475 { | 472 { |
476 IntRect pageRect = m_pageRects[pageNumber]; | 473 IntRect pageRect = m_pageRects[pageNumber]; |
477 m_plugin->printPage(pageNumber, context, pageRect); | 474 m_plugin->printPage(pageNumber, pictureBuilder.context(), pageRect); |
478 | 475 |
479 return 1.0; | 476 return 1.0; |
480 } | 477 } |
481 | 478 |
482 private: | 479 private: |
483 // Set when printing. | 480 // Set when printing. |
484 Member<WebPluginContainerImpl> m_plugin; | 481 Member<WebPluginContainerImpl> m_plugin; |
485 WebPrintParams m_printParams; | 482 WebPrintParams m_printParams; |
486 }; | 483 }; |
487 | 484 |
(...skipping 1622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2110 return WebSandboxFlags::None; | 2107 return WebSandboxFlags::None; |
2111 return static_cast<WebSandboxFlags>(frame()->loader().effectiveSandboxFlags(
)); | 2108 return static_cast<WebSandboxFlags>(frame()->loader().effectiveSandboxFlags(
)); |
2112 } | 2109 } |
2113 | 2110 |
2114 void WebLocalFrameImpl::forceSandboxFlags(WebSandboxFlags flags) | 2111 void WebLocalFrameImpl::forceSandboxFlags(WebSandboxFlags flags) |
2115 { | 2112 { |
2116 frame()->loader().forceSandboxFlags(static_cast<SandboxFlags>(flags)); | 2113 frame()->loader().forceSandboxFlags(static_cast<SandboxFlags>(flags)); |
2117 } | 2114 } |
2118 | 2115 |
2119 } // namespace blink | 2116 } // namespace blink |
OLD | NEW |