172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/print_preview_ui_html_source.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <algorithm>
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector>
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/message_loop.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/shared_memory.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string_piece.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/jstemplate_builder.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/url_constants.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/browser_resources.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/generated_resources.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SetLocalizedStrings(DictionaryValue* localized_strings) {
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("title"),
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_TITLE));
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("loading"),
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_LOADING));
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("noPlugin"),
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_NO_PLUGIN));
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("printButton"),
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PRINT_BUTTON));
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("cancelButton"),
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_CANCEL_BUTTON));
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("destinationLabel"),
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_DESTINATION_LABEL));
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("copiesLabel"),
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_COPIES_LABEL));
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("examplePageRangeText"),
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_EXAMPLE_PAGE_RANGE_TEXT));
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("invalidNumberOfCopiesTitleToolTip"),
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_INVALID_COPIES_TOOL_TIP));
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("layoutLabel"),
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_LAYOUT_LABEL));
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionAllPages"),
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_ALL_PAGES));
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionBw"),
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_BW));
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionCollate"),
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_COLLATE));
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionColor"),
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_COLOR));
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionLandscape"),
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_LANDSCAPE));
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionPortrait"),
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_PORTRAIT));
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  localized_strings->SetString(std::string("optionTwoSided"),
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_TWO_SIDED));
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("bindingLabel"),
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_BINDING_LABEL));
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("optionLongEdgeBinding"),
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_LONG_EDGE_BINDING));
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("optionShortEdgeBinding"),
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_OPTION_SHORT_EDGE_BINDING));
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("pagesLabel"),
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PAGES_LABEL));
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("pageRangeTextBox"),
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PAGE_RANGE_TEXT));
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("pageRangeRadio"),
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PAGE_RANGE_RADIO));
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("pageRangeInvalidTitleToolTip"),
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PAGE_RANGE_INVALID_TOOL_TIP));
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("printToPDF"),
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PRINT_TO_PDF));
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("printPreviewTitleFormat"),
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_TITLE_FORMAT));
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("printPreviewSummaryFormat"),
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_SUMMARY_FORMAT));
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("printPreviewSheetsLabel"),
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_SHEETS_LABEL));
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("printPreviewPageLabelSingular"),
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PAGE_LABEL_SINGULAR));
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("printPreviewPageLabelPlural"),
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_PAGE_LABEL_PLURAL));
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  localized_strings->SetString(std::string("systemDialogOption"),
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF8(IDS_PRINT_PREVIEW_SYSTEM_DIALOG_OPTION));
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrintPreviewUIHTMLSource::PrintPreviewUIHTMLSource()
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : DataSource(chrome::kChromeUIPrintHost, MessageLoop::current()),
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      data_(std::make_pair(static_cast<base::SharedMemory*>(NULL), 0U)) {
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenPrintPreviewUIHTMLSource::~PrintPreviewUIHTMLSource() {
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete data_.first;
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrintPreviewUIHTMLSource::GetPrintPreviewData(PrintPreviewData* data) {
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  *data = data_;
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrintPreviewUIHTMLSource::SetPrintPreviewData(
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const PrintPreviewData& data) {
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete data_.first;
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  data_ = data;
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid PrintPreviewUIHTMLSource::StartDataRequest(const std::string& path,
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                                bool is_incognito,
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                int request_id) {
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (path.empty()) {
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Print Preview Index page.
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    DictionaryValue localized_strings;
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetLocalizedStrings(&localized_strings);
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SetFontAndTextDirection(&localized_strings);
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    static const base::StringPiece print_html(
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        ResourceBundle::GetSharedInstance().GetRawDataResource(
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            IDR_PRINT_PREVIEW_HTML));
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string full_html = jstemplate_builder::GetI18nTemplateHtml(
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        print_html, &localized_strings);
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    html_bytes->data.resize(full_html.size());
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SendResponse(request_id, html_bytes);
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else if (path == "print.pdf" && data_.first) {
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Print Preview data.
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    char* preview_data = reinterpret_cast<char*>(data_.first->memory());
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    uint32 preview_data_size = data_.second;
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    html_bytes->data.resize(preview_data_size);
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::vector<unsigned char>::iterator it = html_bytes->data.begin();
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    for (uint32 i = 0; i < preview_data_size; ++i, ++it)
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      *it = *(preview_data + i);
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SendResponse(request_id, html_bytes);
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Invalid request.
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<RefCountedBytes> empty_bytes(new RefCountedBytes);
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    SendResponse(request_id, empty_bytes);
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::string PrintPreviewUIHTMLSource::GetMimeType(
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& path) const {
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Print Preview Index page.
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (path.empty())
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return "text/html";
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Print Preview data.
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return "application/pdf";
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
160