Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7398)

Unified Diff: chrome/renderer/print_web_view_helper.cc

Issue 7348010: Added Header and Footer support using Skia (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Indent Fix Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/print_web_view_helper.cc
diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc
index a1c33828f1de836325827570e92d90919b67c57d..c2194b8b1d44df255992c25509400b570e3d905c 100644
--- a/chrome/renderer/print_web_view_helper.cc
+++ b/chrome/renderer/print_web_view_helper.cc
@@ -7,9 +7,12 @@
#include <string>
#include "base/command_line.h"
+#include "base/i18n/time_formatting.h"
#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/process_util.h"
+#include "base/time.h"
+#include "base/string_number_conversions.h"
kmadhusu 2011/07/14 01:50:15 nit: ordering
Aayush Kumar 2011/07/19 01:20:30 Done.
#include "base/utf_string_conversions.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/print_messages.h"
@@ -21,6 +24,8 @@
#include "printing/metafile.h"
#include "printing/print_job_constants.h"
#include "printing/units.h"
+#include "skia/ext/vector_platform_device_skia.h"
+#include "third_party/skia/include/core/SkTypeface.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
@@ -32,11 +37,13 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/text/text_elider.h"
#if defined(OS_POSIX)
#include "content/common/view_messages.h"
#endif
+using base::Time;
using printing::ConvertPixelsToPoint;
using printing::ConvertPixelsToPointDouble;
using printing::ConvertUnit;
@@ -88,6 +95,8 @@ bool PrintMsg_Print_Params_IsEqual(
oldParams.params.supports_alpha_blend ==
newParams.params.supports_alpha_blend &&
oldParams.pages.size() == newParams.pages.size() &&
+ oldParams.params.header_footer ==
+ newParams.params.header_footer &&
std::equal(oldParams.pages.begin(), oldParams.pages.end(),
newParams.pages.begin());
}
@@ -158,7 +167,8 @@ PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view)
context_menu_preview_node_(NULL),
user_cancelled_scripted_print_count_(0),
notify_browser_of_print_failure_(true),
- preview_page_count_(0) {
+ preview_page_count_(0),
+ header_footer_interstice(printing::kSettingHeaderFooterInterstice) {
is_preview_ = switches::IsPrintPreviewEnabled();
}
@@ -266,10 +276,13 @@ void PrintWebViewHelper::OnPrintPages() {
Print(frame, NULL);
}
-void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
+void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings,
+ const DictionaryValue& header_footer_info) {
DCHECK(is_preview_);
DCHECK(!context_menu_preview_node_.get() || !script_initiated_preview_frame_);
+ header_footer_info_ = header_footer_info.DeepCopy();
+
if (script_initiated_preview_frame_) {
// Script initiated print preview.
PrintPreview(script_initiated_preview_frame_, NULL, settings);
@@ -499,13 +512,7 @@ void PrintWebViewHelper::didStopLoading() {
void PrintWebViewHelper::GetPageSizeAndMarginsInPoints(
WebFrame* frame,
int page_index,
- const PrintMsg_Print_Params& default_params,
- double* content_width_in_points,
- double* content_height_in_points,
- double* margin_top_in_points,
- double* margin_right_in_points,
- double* margin_bottom_in_points,
- double* margin_left_in_points) {
+ const PrintMsg_Print_Params& default_params) {
int dpi = GetDPI(&default_params);
WebSize page_size_in_pixels(
@@ -537,39 +544,26 @@ void PrintWebViewHelper::GetPageSizeAndMarginsInPoints(
margin_left_in_pixels);
}
- *content_width_in_points = ConvertPixelsToPoint(page_size_in_pixels.width -
- margin_left_in_pixels -
- margin_right_in_pixels);
- *content_height_in_points = ConvertPixelsToPoint(page_size_in_pixels.height -
- margin_top_in_pixels -
- margin_bottom_in_pixels);
+ content_width_in_points = ConvertPixelsToPoint(page_size_in_pixels.width -
+ margin_left_in_pixels -
+ margin_right_in_pixels);
+ content_height_in_points = ConvertPixelsToPoint(page_size_in_pixels.height -
+ margin_top_in_pixels -
+ margin_bottom_in_pixels);
// Invalid page size and/or margins. We just use the default setting.
- if (*content_width_in_points < 1.0 || *content_height_in_points < 1.0) {
+ if (content_width_in_points < 1.0 || content_height_in_points < 1.0) {
GetPageSizeAndMarginsInPoints(NULL,
page_index,
- default_params,
- content_width_in_points,
- content_height_in_points,
- margin_top_in_points,
- margin_right_in_points,
- margin_bottom_in_points,
- margin_left_in_points);
+ default_params);
return;
}
- if (margin_top_in_points)
- *margin_top_in_points =
- ConvertPixelsToPointDouble(margin_top_in_pixels);
- if (margin_right_in_points)
- *margin_right_in_points =
- ConvertPixelsToPointDouble(margin_right_in_pixels);
- if (margin_bottom_in_points)
- *margin_bottom_in_points =
+ margin_top_in_points = ConvertPixelsToPointDouble(margin_top_in_pixels);
+ margin_right_in_points = ConvertPixelsToPointDouble(margin_right_in_pixels);
+ margin_bottom_in_points =
ConvertPixelsToPointDouble(margin_bottom_in_pixels);
- if (margin_left_in_points)
- *margin_left_in_points =
- ConvertPixelsToPointDouble(margin_left_in_pixels);
+ margin_left_in_points = ConvertPixelsToPointDouble(margin_left_in_pixels);
}
bool PrintWebViewHelper::IsModifiable(WebKit::WebFrame* frame,
@@ -586,17 +580,8 @@ void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters(
WebFrame* frame,
WebNode* node,
PrintMsg_Print_Params* params) {
- double content_width_in_points;
- double content_height_in_points;
- double margin_top_in_points;
- double margin_right_in_points;
- double margin_bottom_in_points;
- double margin_left_in_points;
PrepareFrameAndViewForPrint prepare(*params, frame, node, frame->view());
- PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params,
- &content_width_in_points, &content_height_in_points,
- &margin_top_in_points, &margin_right_in_points,
- &margin_bottom_in_points, &margin_left_in_points);
+ PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params);
int dpi = GetDPI(params);
params->printable_size = gfx::Size(
static_cast<int>(ConvertUnitDouble(content_width_in_points,
@@ -687,6 +672,11 @@ bool PrintWebViewHelper::UpdatePrintSettingsLocal(
return false;
print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings));
+ bool header_footer;
+ if (!job_settings.GetBoolean(printing::kSettingHeaderFooter, &header_footer))
+ NOTREACHED();
+ print_pages_params_.get()->params.header_footer = header_footer;
kmadhusu 2011/07/14 01:50:15 "print_pages_params_.get()" -> "print_pages_params
Aayush Kumar 2011/07/19 01:20:30 Done.
+
Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(),
settings.params.document_cookie));
return true;
@@ -863,3 +853,118 @@ bool PrintWebViewHelper::PreviewPageRendered(int page_number) {
notify_browser_of_print_failure_ = false;
return !cancel;
}
+
+size_t GetString16ByteLength(string16 text) {
+ return text.length()*sizeof(char16);
+}
+
+SkScalar PrintWebViewHelper::GetHorizontalCoordinate(
+ string16 text,
+ SkPaint paint,
+ HorizontalHeaderFooterPosition pos) {
+ SkScalar text_width_in_points = paint.measureText(text.c_str(),
+ GetString16ByteLength(text));
+
+ switch (pos) {
kmadhusu 2011/07/14 01:50:15 Why did you use switch() here and if() in GetVerti
Aayush Kumar 2011/07/19 01:20:30 Done.
+ case LEFT:
kmadhusu 2011/07/14 01:50:15 nit: curly braces. http://google-styleguide.googl
Aayush Kumar 2011/07/19 01:20:30 Done.
+ return margin_left_in_points*(-1) + header_footer_interstice;
+ case RIGHT:
+ return ((content_width_in_points+margin_right_in_points) -
kmadhusu 2011/07/14 01:50:15 nit: add space before and after '+'
Aayush Kumar 2011/07/19 01:20:30 Done.
+ (header_footer_interstice + text_width_in_points));
+ case CENTER:
+ SkScalar available_width = (margin_left_in_points +
+ margin_right_in_points +
+ content_width_in_points -
+ 4*header_footer_interstice)/3;
+ return (available_width - margin_left_in_points +
+ (available_width - text_width_in_points)/2);
+ }
+ NOTREACHED();
+ return 0;
+}
+
+SkScalar PrintWebViewHelper::GetVerticalCoordinate(
kmadhusu 2011/07/14 01:50:15 Are you planning to call GetHorizontalCoordinate()
Aayush Kumar 2011/07/19 01:20:30 Done.
+ SkPaint paint,
+ VerticalHeaderFooterPosition pos) {
+ if (pos == TOP) {
+ return margin_top_in_points*(-1) + header_footer_interstice +
+ paint.getTextSize();
+ } else if (pos == BOTTOM) {
+ return margin_bottom_in_points+content_height_in_points -
kmadhusu 2011/07/14 01:50:15 nit: add space before and after '+'
Aayush Kumar 2011/07/19 01:20:30 Done.
+ header_footer_interstice;
+ } else {
+ NOTREACHED();
+ return 0;
+ }
+}
+
+void PrintWebViewHelper::PrintHeaderFooterText(
+ string16 text,
+ SkPaint paint,
+ const SkRefPtr<skia::VectorCanvas>& canvas,
+ HorizontalHeaderFooterPosition hor_pos,
+ VerticalHeaderFooterPosition ver_pos,
+ float webkit_scale_factor) {
+ SkScalar x_cord = GetHorizontalCoordinate(text, paint, hor_pos) /
+ webkit_scale_factor;
+ SkScalar y_cord = GetVerticalCoordinate(paint, ver_pos) /
+ webkit_scale_factor;
+ size_t byte_length = GetString16ByteLength(text);
+
+ canvas->drawText(text.c_str(), byte_length, x_cord, y_cord, paint);
+}
+
+void PrintWebViewHelper::PrintHeaderAndFooter(SkDevice *device,
+ const SkRefPtr<skia::VectorCanvas>& canvas,
+ int page_number, int total_pages, float webkit_scale_factor) {
+
+ // Set the drawing area to draw in the margins.
+ ((skia::VectorPlatformDeviceSkia* )device)->
kmadhusu 2011/07/14 01:50:15 Remove outer paranthesis "(skia::VectorPlatformDev
Aayush Kumar 2011/07/19 01:20:30 That doesn't work. It tries to call setDrawingAre
+ setDrawingArea(SkPDFDevice::kMargin_DrawingArea);
+
+ // Setting up styles for the headers and footers text.
+ SkPaint paint;
+ paint.setColor(SK_ColorBLACK);
+ paint.setTextSize(SkIntToScalar(8)/webkit_scale_factor);
kmadhusu 2011/07/14 01:50:15 Is there any specific reason to use "8"?
dpapad 2011/07/14 15:59:35 Spaces around /.
Aayush Kumar 2011/07/19 01:20:30 It's what looked good on the page according to me
Aayush Kumar 2011/07/19 01:20:30 Done.
+ paint.setTypeface(SkTypeface::CreateFromName(NULL, SkTypeface::kNormal));
+ paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
+
+ // Printing the Date
+ Time now = Time::Now();
+ string16 date = base::TimeFormatShortDateNumeric(now);
kmadhusu 2011/07/14 01:50:15 |now| is used only once. Change line 934 to base
Aayush Kumar 2011/07/19 01:20:30 Done.
+ PrintHeaderFooterText(date, paint, canvas, LEFT, TOP, webkit_scale_factor);
+
+ // Printing the title
+ string16 title;
+ if (!header_footer_info_->GetString("title", &title))
kmadhusu 2011/07/14 01:50:15 "title" -> printing::kSettingHeaderFooterTitle
Aayush Kumar 2011/07/19 01:20:30 Thanks! :) On 2011/07/14 01:50:15, kmadhusu wrote:
+ NOTREACHED();
+
+ SkScalar maxTitleSize = (margin_left_in_points +
+ content_width_in_points +
+ margin_right_in_points -
+ 4*header_footer_interstice)/3;
+ title = ui::ElideText(title, paint, maxTitleSize, false);
+ PrintHeaderFooterText(title, paint, canvas, CENTER, TOP,
+ webkit_scale_factor);
kmadhusu 2011/07/14 01:50:15 Fix indentation. PrintHeaderFooterText(title, pai
Aayush Kumar 2011/07/19 01:20:30 Done.
+
+ // Printing the URL
+ std::string url;
+ if (!header_footer_info_->GetString("url", &url))
kmadhusu 2011/07/14 01:50:15 "url" -> printing::kSettingHeaderFooterURL
Aayush Kumar 2011/07/19 01:20:30 Done.
+ NOTREACHED();
+ GURL gurl(url);
+ string16 url_elided = ui::ElideUrl(gurl, paint, maxTitleSize,
+ std::string());
+ PrintHeaderFooterText(url_elided, paint, canvas, LEFT, BOTTOM,
+ webkit_scale_factor);
kmadhusu 2011/07/14 01:50:15 Fix indentation
Aayush Kumar 2011/07/19 01:20:30 Done.
+
+ // Printing the page numbers at the bottom right corner of page.
+ string16 page_on_page_total = base::IntToString16(page_number) +
+ UTF8ToUTF16("/") +
+ base::IntToString16(total_pages);
+ PrintHeaderFooterText(page_on_page_total, paint, canvas, RIGHT, BOTTOM,
+ webkit_scale_factor);
+
+ // Restore the drawing area to draw in the content area.
+ ((skia::VectorPlatformDeviceSkia* )device)->
+ setDrawingArea(SkPDFDevice::kContent_DrawingArea);
+}

Powered by Google App Engine
This is Rietveld 408576698