15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/file_util_icu.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/number_formatting.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/linked_ptr.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/cloud_print/cloud_print_url.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_dialog_cloud.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_error_dialog.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_manager.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_dialog_controller.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_system_task_proxy.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_view_manager.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printer_manager_dialog.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/oauth2_token_service.h"
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/print_messages.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_range.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_size_margins.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings.h"
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/ulocdata.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kinaba): provide more non-intrusive way for handling local/remote
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distinction and remove these ugly #ifdef's. http://crbug.com/140425
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using printing::Metafile;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The cloud print OAuth2 scope.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kCloudPrintAuth[] = "https://www.googleapis.com/auth/cloudprint";
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UserActionBuckets {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_TO_PRINTER,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_TO_PDF,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CANCEL,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FALLBACK_TO_ADVANCED_SETTINGS_DIALOG,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PREVIEW_FAILED,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PREVIEW_STARTED,
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  INITIATOR_CRASHED,  // UNUSED
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  INITIATOR_CLOSED,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_WITH_CLOUD_PRINT,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USERACTION_BUCKET_BOUNDARY
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintSettingsBuckets {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LANDSCAPE = 0,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PORTRAIT,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLOR,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BLACK_AND_WHITE,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLLATE,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIMPLEX,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DUPLEX,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TOTAL,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HEADERS_AND_FOOTERS,
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CSS_BACKGROUND,
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SELECTION_ONLY,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_SETTINGS_BUCKET_BOUNDARY
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UiBucketGroups {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_SEARCH,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GCP_PROMO,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UI_BUCKET_GROUP_BOUNDARY
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintDestinationBuckets {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_SHOWN,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_CLOSED_CHANGED,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_CLOSED_UNCHANGED,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIGNIN_PROMPT,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIGNIN_TRIGGERED,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_DESTINATION_BUCKET_BOUNDARY
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GcpPromoBuckets {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_SHOWN,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_CLOSED,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_CLICKED,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GCP_PROMO_BUCKET_BOUNDARY
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportUserActionHistogram(enum UserActionBuckets event) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            USERACTION_BUCKET_BOUNDARY);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingHistogram(enum PrintSettingsBuckets setting) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_SETTINGS_BUCKET_BOUNDARY);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintDestinationHistogram(enum PrintDestinationBuckets event) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.DestinationAction", event,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_DESTINATION_BUCKET_BOUNDARY);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportGcpPromoHistogram(enum GcpPromoBuckets event) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.GcpPromo", event,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            GCP_PROMO_BUCKET_BOUNDARY);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding cloud print related data;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppState[] = "appState";
160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Name of a dictionary field holding the initiator title.
161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kInitiatorTitle[] = "initiatorTitle";
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the measurement system according to the
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locale.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMeasurementSystem[] = "measurementSystem";
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the number format according to the locale.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNumberFormat[] = "numberFormat";
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field specifying whether to print automatically in
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kiosk mode. See http://crbug.com/31395.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode";
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Name of a dictionary field holding the state of selection for document.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDocumentHasSelection[] = "documentHasSelection";
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the print job settings dictionary from |args|. The caller takes
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ownership of the returned DictionaryValue. Returns NULL on failure.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* GetSettingsDictionary(const ListValue* args) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_str;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &json_str)) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Could not read JSON argument";
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (json_str.empty()) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Empty print job settings";
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> settings(static_cast<DictionaryValue*>(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::JSONReader::Read(json_str)));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get() || !settings->IsType(Value::TYPE_DICTIONARY)) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings must be a dictionary.";
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings->empty()) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings dictionary is empty";
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings.release();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Track the popularity of print settings and report the stats.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingsStats(const DictionaryValue& settings) {
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ReportPrintSettingHistogram(TOTAL);
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool landscape = false;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingLandscape, &landscape))
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(landscape ? LANDSCAPE : PORTRAIT);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool collate = false;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(COLLATE);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int duplex_mode = 0;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode))
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int color_mode = 0;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingColor, &color_mode)) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        printing::isColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool headers = false;
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingHeaderFooterEnabled, &headers) &&
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      headers) {
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(HEADERS_AND_FOOTERS);
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool css_background = false;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintBackgrounds,
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &css_background) && css_background) {
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(CSS_BACKGROUND);
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool selection_only = false;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintSelectionOnly,
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &selection_only) && selection_only) {
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(SELECTION_ONLY);
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback that stores a PDF file on disk.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintToPdfCallback(Metafile* metafile, const base::FilePath& path) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile->SaveTo(path);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| must be deleted on the UI thread.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&base::DeletePointer<Metafile>, metafile));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintToPdfCallbackWithCheck(Metafile* metafile,
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 drive::FileError error,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const base::FilePath& path) {
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (error != drive::FILE_ERROR_OK) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Save to pdf failed to write: " << error;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metafile->SaveTo(path);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| must be deleted on the UI thread.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&base::DeletePointer<Metafile>, metafile));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<printing::StickySettings> sticky_settings =
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrintPreviewHandler::AccessTokenService
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public OAuth2TokenService::Consumer {
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit AccessTokenService(PrintPreviewHandler* handler)
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : handler_(handler) {
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RequestToken(const std::string& type) {
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (requests_.find(type) != requests_.end())
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;  // Already in progress.
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OAuth2TokenService* service = NULL;
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == "profile") {
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile = Profile::FromWebUI(handler_->web_ui());
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (profile)
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        service = ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (type == "device") {
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      service = chromeos::DeviceOAuth2TokenServiceFactory::Get();
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (service) {
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OAuth2TokenService::ScopeSet oauth_scopes;
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      oauth_scopes.insert(kCloudPrintAuth);
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<OAuth2TokenService::Request> request(
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          service->StartRequest(oauth_scopes, this));
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      requests_[type].reset(request.release());
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      handler_->SendAccessToken(type, std::string());  // Unknown type.
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& access_token,
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const base::Time& expiration_time) OVERRIDE {
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, access_token);
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const GoogleServiceAuthError& error) OVERRIDE {
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, std::string());
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnServiceResponce(const OAuth2TokenService::Request* request,
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const std::string& access_token) {
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) {
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (i->second == request) {
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        handler_->SendAccessToken(i->first, access_token);
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        requests_.erase(i);
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<std::string,
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   linked_ptr<OAuth2TokenService::Request> > Requests;
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Requests requests_;
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrintPreviewHandler* handler_;
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessTokenService);
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printing::StickySettings* PrintPreviewHandler::GetStickySettings() {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sticky_settings.Pointer();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::PrintPreviewHandler()
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : print_backend_(printing::PrintBackend::CreateInstance(NULL)),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      regenerate_preview_request_count_(0),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_printers_dialog_request_count_(0),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_cloud_printers_dialog_request_count_(0),
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reported_failed_preview_(false),
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      has_logged_printers_count_(false) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_STARTED);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::~PrintPreviewHandler() {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (select_file_dialog_.get())
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_->ListenerDestroyed();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::RegisterMessages() {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinters",
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinters,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPreview",
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPreview,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("print",
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrint,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinterCapabilities",
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinterCapabilities,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("showSystemDialog",
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleShowSystemDialog,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("signIn",
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSignin,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getAccessToken",
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetAccessToken,
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageCloudPrinters",
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManageCloudPrint,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageLocalPrinters",
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManagePrinters,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("closePrintPreviewDialog",
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleClosePreviewDialog,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("hidePreview",
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleHidePreview,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("cancelPendingPrintRequest",
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("saveAppState",
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSaveAppState,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getInitialSettings",
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("reportUiEvent",
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleReportUiEvent,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  web_ui()->RegisterMessageCallback("printWithCloudPrintDialog",
40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("forceOpenNewTab",
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::Unretained(this)));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PrintPreviewHandler::preview_web_contents() const {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_ui()->GetWebContents();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinters(const ListValue* /*args*/) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PrintSystemTaskProxy> task =
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PrintSystemTaskProxy(AsWeakPtr(),
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               print_backend_.get(),
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               has_logged_printers_count_);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  has_logged_printers_count_ = true;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintSystemTaskProxy::EnumeratePrinters, task.get()));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetPreview(const ListValue* args) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(3U, args->GetSize());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id = -1;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetInteger(printing::kPreviewRequestID, &request_id))
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnPrintPreviewRequest(request_id);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an additional key in order to identify |print_preview_ui| later on
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(printing::kPreviewUIID,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       print_preview_ui->GetIDForPrintPreviewUI());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment request count.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++regenerate_preview_request_count_;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator) {
450ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ReportUserActionHistogram(INITIATOR_CLOSED);
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnClosePrintPreviewDialog();
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the page title and url and send it to the renderer process if
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // headers and footers are to be displayed.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool display_header_footer = false;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &display_header_footer)) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (display_header_footer) {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterTitle,
464ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                        initiator->GetTitle());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string url;
466ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    NavigationEntry* entry = initiator->GetController().GetActiveEntry();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url = entry->GetVirtualURL().spec();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterURL, url);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool generate_draft_data = false;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = settings->GetBoolean(printing::kSettingGenerateDraftData,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &generate_draft_data);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(success);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!generate_draft_data) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double draft_page_count_double = -1;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetDouble(1, &draft_page_count_double);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int draft_page_count = static_cast<int>(draft_page_count_double);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool preview_modifiable = false;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetBoolean(2, &preview_modifiable);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (draft_page_count != -1 && preview_modifiable &&
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print_preview_ui->GetAvailableDraftPageCount() != draft_page_count) {
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings->SetBoolean(printing::kSettingGenerateDraftData, true);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Print preview request start";
494ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderViewHost* rvh = initiator->GetRenderViewHost();
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandlePrint(const ListValue* args) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before printing.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint",
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
506ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
507ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator) {
508ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderViewHost* rvh = initiator->GetRenderViewHost();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->GetRoutingID()));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Never try to add headers/footers here. It's already in the generated PDF.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_to_pdf = false;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_cloud_printer = false;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool open_pdf_in_preview = false;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!open_pdf_in_preview) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int page_count = 0;
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings->GetInteger(printing::kSettingPreviewPageCount, &page_count);
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_to_pdf) {
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PDF);
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintToPdf();
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 title;
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_cloud_printer) {
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint",
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         page_count);
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT);
553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SendCloudPrintJob(data.get());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PRINTER);
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportPrintSettingsStats(*settings);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
559ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This tries to activate the initiator as well, so do not clear the
560ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // association with the initiator yet.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_ui()->GetController());
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnHidePreviewDialog();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Do this so the initiator can open a new print preview dialog, while the
566ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // current print preview dialog is still handling its print job.
567ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PDF being printed contains only the pages that the user selected,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so ignore the page range and print all pages.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->Remove(printing::kSettingPageRange, NULL);
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Remove selection only flag for the same reason.
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    settings->Remove(printing::kSettingShouldPrintSelectionOnly, NULL);
574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set ID to know whether printing is for preview.
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->SetInteger(printing::kPreviewUIID,
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         print_preview_ui->GetIDForPrintPreviewUI());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost();
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(),
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                *settings));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For all other cases above, the preview dialog will stay open until the
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // printing has finished. Then the dialog closes and PrintPreviewDone() gets
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // called. In the case below, since the preview dialog will be hidden and
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // not closed, we need to make this call.
586ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (initiator) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      printing::PrintViewManager* print_view_manager =
588ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          printing::PrintViewManager::FromWebContents(initiator);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_view_manager->PrintPreviewDone();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PrintToPdf() {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (print_to_pdf_path_.get()) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // User has already selected a path, no need to show the dialog again.
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostPrintToPdfTask();
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (!select_file_dialog_.get() ||
599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             !select_file_dialog_->IsRunning(platform_util::GetTopLevel(
600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 preview_web_contents()->GetView()->GetNativeView()))) {
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_ui()->GetController());
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pre-populating select file dialog with print job title.
604ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    string16 print_job_title_utf16 = print_preview_ui->initiator_title();
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title(print_job_title_utf16);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title =
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UTF16ToUTF8(print_job_title_utf16);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_');
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath default_filename(print_job_title);
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_filename =
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf"));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SelectFile(default_filename);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleHidePreview(const ListValue* /*args*/) {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnHidePreviewDialog();
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleCancelPendingPrintRequest(
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* /*args*/) {
630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator)
632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  gfx::NativeWindow parent = initiator ?
634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      initiator->GetView()->GetTopLevelNativeWindow() :
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowPrintErrorDialog(parent);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleSaveAppState(const ListValue* args) {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_to_save;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString(0, &data_to_save) && !data_to_save.empty())
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreAppState(data_to_save);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinterCapabilities(const ListValue* args) {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string printer_name;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ret = args->GetString(0, &printer_name);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ret || printer_name.empty())
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PrintSystemTaskProxy> task =
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PrintSystemTaskProxy(AsWeakPtr(),
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               print_backend_.get(),
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               has_logged_printers_count_);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintSystemTaskProxy::GetPrinterCapabilities, task.get(),
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 printer_name));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnSigninComplete(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::WeakPtr<PrintPreviewHandler>& handler) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handler.get()) {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewUI* print_preview_ui =
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<PrintPreviewUI*>(handler->web_ui()->GetController());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (print_preview_ui)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_preview_ui->OnReloadPrintersList();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleSignin(const ListValue* /*args*/) {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeWindow modal_parent = platform_util::GetTopLevel(
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      preview_web_contents()->GetView()->GetNativeView());
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_dialog_cloud::CreateCloudPrintSigninDialog(
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext(),
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      modal_parent,
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::OnSigninComplete, AsWeakPtr()));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) {
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string type;
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!args->GetString(0, &type))
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!token_service_)
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    token_service_.reset(new AccessTokenService(this));
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  token_service_->RequestToken(type);
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::PrintWithCloudPrintDialog() {
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user asks to print via cloud print
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead of the print preview dialog.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  string16 title;
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Nothing to print, no preview available.
70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeWindow modal_parent = platform_util::GetTopLevel(
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      preview_web_contents()->GetView()->GetNativeView());
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_dialog_cloud::CreatePrintDialogForBytes(
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext(),
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      modal_parent,
711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      data.get(),
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title,
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string16(),
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("application/pdf"));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once the cloud print dialog comes up we're no longer in a background
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // printing situation.  Close the print preview.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(abodenha@chromium.org) The flow should be changed as described in
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=44093
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleManageCloudPrint(const ListValue* /*args*/) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_cloud_printers_dialog_request_count_;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  preview_web_contents()->OpenURL(
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      OpenURLParams(
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CloudPrintURL(profile).GetCloudPrintServiceManageURL(),
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Referrer(),
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NEW_FOREGROUND_TAB,
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_LINK,
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* /*args*/) {
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
740ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
741ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
745ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(this);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->PrintForSystemDialogNow();
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the pending preview request if exists.
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnCancelPendingPreviewRequest();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleManagePrinters(const ListValue* /*args*/) {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_printers_dialog_request_count_;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrinterManagerDialog::ShowPrinterManagerDialog();
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::HandlePrintWithCloudPrintDialog(
76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::ListValue* args) {
76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int page_count = 0;
76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!args || !args->GetInteger(0, &page_count))
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog",
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       page_count);
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PrintWithCloudPrintDialog();
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::HandleClosePreviewDialog(const ListValue* /*args*/) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(CANCEL);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before cancelling.
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel",
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ReportStats() {
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters",
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_printers_dialog_request_count_);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManageCloudPrinters",
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_cloud_printers_dialog_request_count_);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* settings) {
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the measurement system based on the locale.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode errorCode = U_ZERO_ERROR;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* locale = g_browser_process->GetApplicationLocale().c_str();
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMeasurementSystem system = ulocdata_getMeasurementSystem(locale, &errorCode);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system = UMS_SI;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the number formatting based on the locale and writing to
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dictionary.
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2));
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(kMeasurementSystem, system);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetInitialSettings(const ListValue* /*args*/) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PrintSystemTaskProxy> task =
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PrintSystemTaskProxy(AsWeakPtr(),
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                print_backend_.get(),
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                has_logged_printers_count_);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintSystemTaskProxy::GetDefaultPrinter, task.get()));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendCloudPrintEnabled();
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleReportUiEvent(const ListValue* args) {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int event_group, event_number;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number))
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UiBucketGroups ui_bucket_group =
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<enum UiBucketGroups>(event_group);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ui_bucket_group >= UI_BUCKET_GROUP_BOUNDARY)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ui_bucket_group) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESTINATION_SEARCH: {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum PrintDestinationBuckets event =
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<enum PrintDestinationBuckets>(event_number);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event >= PRINT_DESTINATION_BUCKET_BOUNDARY)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ReportPrintDestinationHistogram(event);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GCP_PROMO: {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum GcpPromoBuckets event =
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<enum GcpPromoBuckets>(event_number);
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event >= GCP_PROMO_BUCKET_BOUNDARY)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ReportGcpPromoHistogram(event);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::HandleForceOpenNewTab(const ListValue* args) {
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string url;
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!args->GetString(0, &url))
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(GetInitiator());
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AddSelectedTabWithURL(browser,
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GURL(url),
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                content::PAGE_TRANSITION_LINK);
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendInitialSettings(
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& default_printer,
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& cloud_print_data) {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue initial_settings;
866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  initial_settings.SetString(kInitiatorTitle,
867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             print_preview_ui->initiator_title());
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingPreviewModifiable,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              print_preview_ui->source_is_modifiable());
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetString(printing::kSettingPrinterName, default_printer);
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kDocumentHasSelection,
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->source_has_selection());
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly,
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->print_selection_only());
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext(
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sticky_settings->printer_app_state())
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_settings.SetString(kAppState,
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               *sticky_settings->printer_app_state());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* cmdline = CommandLine::ForCurrentProcess();
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode,
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              cmdline->HasSwitch(switches::kKioskModePrinting));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_preview_ui->source_is_modifiable())
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumberFormatAndMeasurementSystem(&initial_settings);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::ClosePreviewDialog() {
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnClosePrintPreviewDialog();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::SendAccessToken(const std::string& type,
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const std::string& access_token) {
899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Get getAccessToken finished";
900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->CallJavascriptFunction("onDidGetAccessToken", StringValue(type),
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   StringValue(access_token));
902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendPrinterCapabilities(
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DictionaryValue& settings_info) {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities finished";
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   settings_info);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendFailedToGetPrinterCapabilities(
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& printer_name) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities failed";
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue printer_name_value(printer_name);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   printer_name_value);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SetupPrinterList(const ListValue& printers) {
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("setPrinters", printers);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendCloudPrintEnabled() {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL gcp_url(CloudPrintURL(profile).GetCloudPrintServiceURL());
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringValue gcp_url_value(gcp_url.spec());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("setUseCloudPrint", gcp_url_value);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) {
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BASE64 encode the job data.
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string raw_data(reinterpret_cast<const char*>(data->front()),
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       data->size());
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string base64_data;
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!base::Base64Encode(raw_data, &base64_data)) {
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Base64 encoding PDF data.";
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringValue data_value(base64_data);
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("printToCloud", data_value);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
947ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebContents* PrintPreviewHandler::GetInitiator() const {
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dialog_controller)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
952ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return dialog_controller->GetInitiator(preview_web_contents());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintDialogShown() {
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SelectFile(const base::FilePath& default_filename) {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo file_type_info;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions.resize(1);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  file_type_info.support_drive = true;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initializing save_path_ if it is not already initialized.
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sticky_settings->save_path()) {
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allowing IO operation temporarily. It is ok to do so here because
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the select file dialog performs IO anyway in order to display the
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // folders and also it is modal.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ThreadRestrictions::ScopedAllowIO allow_io;
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path);
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreSavePath(file_path);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        preview_web_contents()->GetBrowserContext())->GetPrefs());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(preview_web_contents())),
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_->SelectFile(
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_SAVEAS_FILE,
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string16(),
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sticky_settings->save_path()->Append(default_filename),
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &file_type_info,
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::StringType(),
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      platform_util::GetTopLevel(
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          preview_web_contents()->GetView()->GetNativeView()),
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewDialogDestroyed() {
994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
995ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(NULL);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewFailed() {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reported_failed_preview_)
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reported_failed_preview_ = true;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_FAILED);
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ShowSystemDialog() {
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleShowSystemDialog(NULL);
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::FileSelected(const base::FilePath& path,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int index, void* params) {
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updating |save_path_| to the newly selected folder.
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->StoreSavePath(path.DirName());
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("fileSelectionCompleted");
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_to_pdf_path_.reset(new base::FilePath(path));
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PostPrintToPdfTask();
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PostPrintToPdfTask() {
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 title;
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Preview data was checked before file dialog.";
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PreviewMetafile* metafile = new printing::PreviewMetafile;
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile->InitFromData(static_cast<const void*>(data->front()), data->size());
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PrintToPdfCallback takes ownership of |metafile|.
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  drive::util::PrepareWritableFileAndRun(
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromBrowserContext(preview_web_contents()->GetBrowserContext()),
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *print_to_pdf_path_,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintToPdfCallbackWithCheck, metafile));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          base::Bind(&PrintToPdfCallback, metafile,
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     *print_to_pdf_path_));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_to_pdf_path_.reset();
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::FileSelectionCanceled(void* params) {
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnFileSelectionCancelled();
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PrintPreviewHandler::ClearInitiatorDetails() {
1059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // We no longer require the initiator details. Remove those details associated
1064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // with the preview dialog to allow the initiator to create another preview
1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // dialog.
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dialog_controller)
1069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    dialog_controller->EraseInitiatorInfo(preview_web_contents());
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrintPreviewHandler::GetPreviewDataAndTitle(
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::RefCountedBytes>* data,
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    string16* title) const {
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_ui()->GetController());
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> tmp_data;
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->GetPrintPreviewDataForIndex(
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &tmp_data);
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!tmp_data.get()) {
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(tmp_data->size() && tmp_data->front());
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *data = tmp_data;
1088ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *title = print_preview_ui->initiator_title();
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092