print_preview_handler.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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_view_manager.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printer_manager_dialog.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.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"
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/crash_keys.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/print_messages.h"
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_manager_base.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h"
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "printing/backend/print_backend_consts.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h"
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "printing/pdf_render_settings.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings.h"
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "printing/units.h"
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/ulocdata.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/local_discovery/privet_constants.h"
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (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,
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PRINT_WITH_PRIVET,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USERACTION_BUCKET_BOUNDARY
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintSettingsBuckets {
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LANDSCAPE = 0,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PORTRAIT,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLOR,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BLACK_AND_WHITE,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLLATE,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIMPLEX,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DUPLEX,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TOTAL,
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HEADERS_AND_FOOTERS,
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CSS_BACKGROUND,
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SELECTION_ONLY,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_SETTINGS_BUCKET_BOUNDARY
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UiBucketGroups {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_SEARCH,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GCP_PROMO,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UI_BUCKET_GROUP_BOUNDARY
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintDestinationBuckets {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_SHOWN,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_CLOSED_CHANGED,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_CLOSED_UNCHANGED,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIGNIN_PROMPT,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIGNIN_TRIGGERED,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PRIVET_DUPLICATE_SELECTED,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CLOUD_DUPLICATE_SELECTED,
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  REGISTER_PROMO_SHOWN,
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  REGISTER_PROMO_SELECTED,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_DESTINATION_BUCKET_BOUNDARY
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GcpPromoBuckets {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_SHOWN,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_CLOSED,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_CLICKED,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GCP_PROMO_BUCKET_BOUNDARY
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportUserActionHistogram(enum UserActionBuckets event) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            USERACTION_BUCKET_BOUNDARY);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingHistogram(enum PrintSettingsBuckets setting) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_SETTINGS_BUCKET_BOUNDARY);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintDestinationHistogram(enum PrintDestinationBuckets event) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.DestinationAction", event,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_DESTINATION_BUCKET_BOUNDARY);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportGcpPromoHistogram(enum GcpPromoBuckets event) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.GcpPromo", event,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            GCP_PROMO_BUCKET_BOUNDARY);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding cloud print related data;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppState[] = "appState";
165ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Name of a dictionary field holding the initiator title.
166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kInitiatorTitle[] = "initiatorTitle";
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the measurement system according to the
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locale.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMeasurementSystem[] = "measurementSystem";
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the number format according to the locale.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNumberFormat[] = "numberFormat";
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field specifying whether to print automatically in
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kiosk mode. See http://crbug.com/31395.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode";
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kHidePrintWithSystemDialogLink[] = "hidePrintWithSystemDialogLink";
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Name of a dictionary field holding the state of selection for document.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDocumentHasSelection[] = "documentHasSelection";
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Additional printer capability setting keys.
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kPrinterId[] = "printerId";
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kDisableColorOption[] = "disableColorOption";
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kSetDuplexAsDefault[] = "setDuplexAsDefault";
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kPrinterDefaultDuplexValue[] = "printerDefaultDuplexValue";
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_CUPS)
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const char kCUPSsColorModel[] = "cupsColorModel";
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const char kCUPSsBWModel[] = "cupsBWModel";
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the print job settings dictionary from |args|. The caller takes
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ownership of the returned DictionaryValue. Returns NULL on failure.
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* GetSettingsDictionary(const base::ListValue* args) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_str;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &json_str)) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Could not read JSON argument";
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (json_str.empty()) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Empty print job settings";
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<base::DictionaryValue*>(
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::JSONReader::Read(json_str)));
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!settings.get() || !settings->IsType(base::Value::TYPE_DICTIONARY)) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings must be a dictionary.";
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings->empty()) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings dictionary is empty";
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings.release();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Track the popularity of print settings and report the stats.
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ReportPrintSettingsStats(const base::DictionaryValue& settings) {
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ReportPrintSettingHistogram(TOTAL);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool landscape = false;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingLandscape, &landscape))
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(landscape ? LANDSCAPE : PORTRAIT);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool collate = false;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(COLLATE);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int duplex_mode = 0;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode))
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int color_mode = 0;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingColor, &color_mode)) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        printing::IsColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool headers = false;
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingHeaderFooterEnabled, &headers) &&
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      headers) {
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(HEADERS_AND_FOOTERS);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool css_background = false;
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintBackgrounds,
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &css_background) && css_background) {
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(CSS_BACKGROUND);
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool selection_only = false;
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintSelectionOnly,
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &selection_only) && selection_only) {
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(SELECTION_ONLY);
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback that stores a PDF file on disk.
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void PrintToPdfCallback(printing::Metafile* metafile,
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                        const base::FilePath& path) {
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile->SaveTo(path);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| must be deleted on the UI thread.
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, metafile);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::string GetDefaultPrinterOnFileThread(
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<printing::PrintBackend> print_backend) {
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string default_printer = print_backend->GetDefaultPrinterName();
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Default Printer: " << default_printer;
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return default_printer;
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void EnumeratePrintersOnFileThread(
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<printing::PrintBackend> print_backend,
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::ListValue* printers) {
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Enumerate printers start";
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  printing::PrinterList printer_list;
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  print_backend->EnumeratePrinters(&printer_list);
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (printing::PrinterList::iterator it = printer_list.begin();
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       it != printer_list.end(); ++it) {
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::DictionaryValue* printer_info = new base::DictionaryValue;
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printers->Append(printer_info);
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string printer_name;
292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string printer_description;
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX)
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // On Mac, |it->printer_description| specifies the printer name and
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |it->printer_name| specifies the device name / printer queue name.
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_name = it->printer_description;
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!it->options[kDriverNameTagName].empty())
298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      printer_description = it->options[kDriverNameTagName];
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_name = it->printer_name;
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_description = it->printer_description;
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_info->SetString(printing::kSettingDeviceName, it->printer_name);
304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->SetString(printing::kSettingPrinterDescription,
305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            printer_description);
306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->SetString(printing::kSettingPrinterName, printer_name);
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    VLOG(1) << "Found printer " << printer_name
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            << " with device name " << it->printer_name;
309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::DictionaryValue* options = new base::DictionaryValue;
311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->Set(printing::kSettingPrinterOptions, options);
312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (std::map<std::string, std::string>::iterator opt = it->options.begin();
313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         opt != it->options.end();
314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         ++opt) {
315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      options->SetString(opt->first, opt->second);
316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VLOG(1) << "Found printer " << printer_name << " with device name "
319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            << it->printer_name;
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Enumerate printers finished, found " << printers->GetSize()
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          << " printers";
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef base::Callback<void(const base::DictionaryValue*)>
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetPrinterCapabilitiesSuccessCallback;
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef base::Callback<void(const std::string&)>
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetPrinterCapabilitiesFailureCallback;
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GetPrinterCapabilitiesOnFileThread(
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_refptr<printing::PrintBackend> print_backend,
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& printer_name,
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GetPrinterCapabilitiesSuccessCallback& success_cb,
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GetPrinterCapabilitiesFailureCallback& failure_cb) {
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!printer_name.empty());
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Get printer capabilities start for " << printer_name;
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  crash_keys::ScopedPrinterInfo crash_key(
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      print_backend->GetPrinterDriverInfo(printer_name));
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!print_backend->IsValidPrinter(printer_name)) {
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // TODO(gene): Notify explicitly if printer is not valid, instead of
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // failed to get capabilities.
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            base::Bind(failure_cb, printer_name));
3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  printing::PrinterSemanticCapsAndDefaults info;
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, &info)) {
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LOG(WARNING) << "Failed to get capabilities for " << printer_name;
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            base::Bind(failure_cb, printer_name));
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings_info(new base::DictionaryValue);
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  settings_info->SetString(kPrinterId, printer_name);
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  settings_info->SetBoolean(kDisableColorOption, !info.color_changeable);
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  settings_info->SetBoolean(printing::kSettingSetColorAsDefault,
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            info.color_default);
3638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_CUPS)
3648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  settings_info->SetInteger(kCUPSsColorModel, info.color_model);
3658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  settings_info->SetInteger(kCUPSsBWModel, info.bw_model);
3668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
3678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // TODO(gene): Make new capabilities format for Print Preview
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // that will suit semantic capabiltities better.
3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Refactor pld API code below
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool default_duplex = info.duplex_capable ?
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      (info.duplex_default != printing::SIMPLEX) : false;
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int duplex_value = info.duplex_capable ?
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      printing::LONG_EDGE : printing::UNKNOWN_DUPLEX_MODE;
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  settings_info->SetBoolean(kSetDuplexAsDefault, default_duplex);
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  settings_info->SetInteger(kPrinterDefaultDuplexValue, duplex_value);
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTask(
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(success_cb, base::Owned(settings_info.release())));
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::LazyInstance<printing::StickySettings> g_sticky_settings =
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)printing::StickySettings* GetStickySettings() {
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return g_sticky_settings.Pointer();
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_CUPS)
3938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)struct PrintPreviewHandler::CUPSPrinterColorModels {
3948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string printer_name;
3958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  printing::ColorModel color_model;
3968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  printing::ColorModel bw_model;
3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
3998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrintPreviewHandler::AccessTokenService
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public OAuth2TokenService::Consumer {
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit AccessTokenService(PrintPreviewHandler* handler)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : OAuth2TokenService::Consumer("print_preview"),
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        handler_(handler) {
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RequestToken(const std::string& type) {
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (requests_.find(type) != requests_.end())
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;  // Already in progress.
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OAuth2TokenService* service = NULL;
41368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string account_id;
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == "profile") {
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile = Profile::FromWebUI(handler_->web_ui());
41668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (profile) {
41768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ProfileOAuth2TokenService* token_service =
41868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SigninManagerBase* signin_manager =
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            SigninManagerFactory::GetInstance()->GetForProfile(profile);
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        account_id = signin_manager->GetAuthenticatedAccountId();
42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        service = token_service;
42368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      }
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (type == "device") {
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      chromeos::DeviceOAuth2TokenService* token_service =
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chromeos::DeviceOAuth2TokenServiceFactory::Get();
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      account_id = token_service->GetRobotAccountId();
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      service = token_service;
4301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (service) {
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OAuth2TokenService::ScopeSet oauth_scopes;
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      oauth_scopes.insert(cloud_print::kCloudPrintAuth);
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<OAuth2TokenService::Request> request(
43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          service->StartRequest(account_id, oauth_scopes, this));
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      requests_[type].reset(request.release());
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      handler_->SendAccessToken(type, std::string());  // Unknown type.
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& access_token,
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const base::Time& expiration_time) OVERRIDE {
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, access_token);
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const GoogleServiceAuthError& error) OVERRIDE {
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, std::string());
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnServiceResponce(const OAuth2TokenService::Request* request,
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const std::string& access_token) {
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) {
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (i->second == request) {
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        handler_->SendAccessToken(i->first, access_token);
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        requests_.erase(i);
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<std::string,
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   linked_ptr<OAuth2TokenService::Request> > Requests;
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Requests requests_;
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrintPreviewHandler* handler_;
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessTokenService);
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::PrintPreviewHandler()
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : print_backend_(printing::PrintBackend::CreateInstance(NULL)),
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      regenerate_preview_request_count_(0),
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_printers_dialog_request_count_(0),
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_cloud_printers_dialog_request_count_(0),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reported_failed_preview_(false),
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      has_logged_printers_count_(false),
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      weak_factory_(this) {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_STARTED);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::~PrintPreviewHandler() {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (select_file_dialog_.get())
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_->ListenerDestroyed();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::RegisterMessages() {
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinters",
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinters,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPreview",
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPreview,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("print",
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrint,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinterCapabilities",
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinterCapabilities,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("showSystemDialog",
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleShowSystemDialog,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("signIn",
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSignin,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getAccessToken",
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetAccessToken,
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageCloudPrinters",
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManageCloudPrint,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageLocalPrinters",
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManagePrinters,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("closePrintPreviewDialog",
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleClosePreviewDialog,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("hidePreview",
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleHidePreview,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("cancelPendingPrintRequest",
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("saveAppState",
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSaveAppState,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getInitialSettings",
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("reportUiEvent",
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleReportUiEvent,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  web_ui()->RegisterMessageCallback("printWithCloudPrintDialog",
53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("forceOpenNewTab",
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab,
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrivetPrinters",
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrivetPrinters,
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->RegisterMessageCallback("stopGetPrivetPrinters",
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleStopGetPrivetPrinters,
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this)));
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrivetPrinterCapabilities",
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrivetPrinterCapabilities,
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::PrivetPrintingEnabled() {
55623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return !CommandLine::ForCurrentProcess()->HasSwitch(
55823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    switches::kDisableDeviceDiscovery);
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PrintPreviewHandler::preview_web_contents() const {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_ui()->GetWebContents();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinters(const base::ListValue* /*args*/) {
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::ListValue* results = new base::ListValue;
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTaskAndReply(
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&EnumeratePrintersOnFileThread, print_backend_,
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(results)),
5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SetupPrinterList,
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Owned(results)));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::HandleGetPrivetPrinters(const base::ListValue* args) {
58023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (PrivetPrintingEnabled()) {
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Profile* profile = Profile::FromWebUI(web_ui());
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_discovery_client_ =
584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        local_discovery::ServiceDiscoverySharedClient::GetInstance();
585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    printer_lister_.reset(new local_discovery::PrivetLocalPrinterLister(
586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        service_discovery_client_.get(),
587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile->GetRequestContext(),
588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        this));
589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    printer_lister_->Start();
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetPrintingEnabled()) {
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone");
595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleStopGetPrivetPrinters(
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
60023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (PrivetPrintingEnabled()) {
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    printer_lister_->Stop();
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities(
608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::ListValue* args) {
60923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string name;
611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool success = args->GetString(0, &name);
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(success);
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreatePrivetHTTP(
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name,
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient,
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(3U, args->GetSize());
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(GetSettingsDictionary(args));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id = -1;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetInteger(printing::kPreviewRequestID, &request_id))
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnPrintPreviewRequest(request_id);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an additional key in order to identify |print_preview_ui| later on
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(printing::kPreviewUIID,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       print_preview_ui->GetIDForPrintPreviewUI());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment request count.
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++regenerate_preview_request_count_;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
643ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator) {
644ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ReportUserActionHistogram(INITIATOR_CLOSED);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnClosePrintPreviewDialog();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the page title and url and send it to the renderer process if
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // headers and footers are to be displayed.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool display_header_footer = false;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &display_header_footer)) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (display_header_footer) {
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterTitle,
658ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                        initiator->GetTitle());
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string url;
6601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content::NavigationEntry* entry =
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        initiator->GetController().GetLastCommittedEntry();
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url = entry->GetVirtualURL().spec();
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterURL, url);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool generate_draft_data = false;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = settings->GetBoolean(printing::kSettingGenerateDraftData,
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &generate_draft_data);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(success);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!generate_draft_data) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double draft_page_count_double = -1;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetDouble(1, &draft_page_count_double);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int draft_page_count = static_cast<int>(draft_page_count_double);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool preview_modifiable = false;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetBoolean(2, &preview_modifiable);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (draft_page_count != -1 && preview_modifiable &&
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print_preview_ui->GetAvailableDraftPageCount() != draft_page_count) {
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings->SetBoolean(printing::kSettingGenerateDraftData, true);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Print preview request start";
689ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderViewHost* rvh = initiator->GetRenderViewHost();
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before printing.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint",
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
701ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
702ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator) {
703ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderViewHost* rvh = initiator->GetRenderViewHost();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->GetRoutingID()));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(GetSettingsDictionary(args));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Never try to add headers/footers here. It's already in the generated PDF.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_to_pdf = false;
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_cloud_printer = false;
716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool print_with_privet = false;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool open_pdf_in_preview = false;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!open_pdf_in_preview) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintWithPrivet, &print_with_privet);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId);
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int page_count = 0;
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings->GetInteger(printing::kSettingPreviewPageCount, &page_count);
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_to_pdf) {
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PDF);
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintToPdf();
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (print_with_privet && PrivetPrintingEnabled()) {
741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string printer_name;
742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string print_ticket;
743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string capabilities;
744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet", page_count);
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_PRIVET);
746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int width = 0;
748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int height = 0;
749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!settings->GetString(printing::kSettingDeviceName, &printer_name) ||
750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetString(printing::kSettingTicket, &print_ticket) ||
751effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        !settings->GetString(printing::kSettingCapabilities, &capabilities) ||
752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetInteger(printing::kSettingPageWidth, &width) ||
753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetInteger(printing::kSettingPageHeight, &height) ||
754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        width <= 0 || height <= 0) {
755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTREACHED();
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FundamentalValue http_code_value(-1);
757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return;
759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PrintToPrivetPrinter(
762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        printer_name, print_ticket, capabilities, gfx::Size(width, height));
763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_cloud_printer) {
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint",
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         page_count);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT);
778868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SendCloudPrintJob(data.get());
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count);
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PRINTER);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportPrintSettingsStats(*settings);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This tries to activate the initiator as well, so do not clear the
785ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // association with the initiator yet.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_ui()->GetController());
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnHidePreviewDialog();
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
790ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Do this so the initiator can open a new print preview dialog, while the
791ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // current print preview dialog is still handling its print job.
792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PDF being printed contains only the pages that the user selected,
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so ignore the page range and print all pages.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->Remove(printing::kSettingPageRange, NULL);
7971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Reset selection only flag for the same reason.
7981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_CUPS)
8010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!open_pdf_in_preview)  // We can get here even for cloud printers.
8020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      ConvertColorSettingToCUPSColorModel(settings.get());
8038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
8048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set ID to know whether printing is for preview.
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->SetInteger(printing::kPreviewUIID,
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         print_preview_ui->GetIDForPrintPreviewUI());
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost();
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(),
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                *settings));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For all other cases above, the preview dialog will stay open until the
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // printing has finished. Then the dialog closes and PrintPreviewDone() gets
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // called. In the case below, since the preview dialog will be hidden and
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // not closed, we need to make this call.
816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (initiator) {
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      printing::PrintViewManager* print_view_manager =
818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          printing::PrintViewManager::FromWebContents(initiator);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_view_manager->PrintPreviewDone();
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PrintToPdf() {
8251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!print_to_pdf_path_.empty()) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // User has already selected a path, no need to show the dialog again.
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostPrintToPdfTask();
828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (!select_file_dialog_.get() ||
829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             !select_file_dialog_->IsRunning(platform_util::GetTopLevel(
830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 preview_web_contents()->GetView()->GetNativeView()))) {
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_ui()->GetController());
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pre-populating select file dialog with print job title.
834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 print_job_title_utf16 = print_preview_ui->initiator_title();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title(print_job_title_utf16);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title =
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(print_job_title_utf16);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_');
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath default_filename(print_job_title);
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_filename =
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf"));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SelectFile(default_filename);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleHidePreview(const base::ListValue* /*args*/) {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnHidePreviewDialog();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleCancelPendingPrintRequest(
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator)
862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  chrome::ShowPrintErrorDialog();
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleSaveAppState(const base::ListValue* args) {
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_to_save;
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString(0, &data_to_save) && !data_to_save.empty())
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreAppState(data_to_save);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinterCapabilities(
8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string printer_name;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ret = args->GetString(0, &printer_name);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ret || printer_name.empty())
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetPrinterCapabilitiesSuccessCallback success_cb =
8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendPrinterCapabilities,
8844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr());
8854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetPrinterCapabilitiesFailureCallback failure_cb =
8864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendFailedToGetPrinterCapabilities,
8874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr());
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&GetPrinterCapabilitiesOnFileThread,
8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 print_backend_, printer_name, success_cb, failure_cb));
8924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
8934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
8944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PrintPreviewHandler::OnSigninComplete() {
8954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
8964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
8974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (print_preview_ui)
8984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    print_preview_ui->OnReloadPrintersList();
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleSignin(const base::ListValue* /*args*/) {
9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::ScopedTabbedBrowserDisplayer displayer(
9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile, chrome::GetActiveDesktop());
9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  print_dialog_cloud::CreateCloudPrintSigninTab(
9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      displayer.browser(),
9084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::OnSigninComplete,
9094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) {
913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string type;
914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!args->GetString(0, &type))
915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!token_service_)
917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    token_service_.reset(new AccessTokenService(this));
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  token_service_->RequestToken(type);
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::PrintWithCloudPrintDialog() {
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user asks to print via cloud print
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead of the print preview dialog.
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
92890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
92990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Nothing to print, no preview available.
93090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
93290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeWindow modal_parent = platform_util::GetTopLevel(
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      preview_web_contents()->GetView()->GetNativeView());
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_dialog_cloud::CreatePrintDialogForBytes(
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext(),
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      modal_parent,
938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      data.get(),
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title,
940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("application/pdf"));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once the cloud print dialog comes up we're no longer in a background
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // printing situation.  Close the print preview.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(abodenha@chromium.org) The flow should be changed as described in
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=44093
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleManageCloudPrint(
9515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_cloud_printers_dialog_request_count_;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  preview_web_contents()->OpenURL(
9561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      content::OpenURLParams(
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CloudPrintURL(profile).GetCloudPrintServiceManageURL(),
9581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          content::Referrer(),
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NEW_FOREGROUND_TAB,
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::PAGE_TRANSITION_LINK,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleShowSystemDialog(
9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
969ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
970ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
974ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(this);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->PrintForSystemDialogNow();
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the pending preview request if exists.
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnCancelPendingPreviewRequest();
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleManagePrinters(
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_printers_dialog_request_count_;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrinterManagerDialog::ShowPrinterManagerDialog();
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::HandlePrintWithCloudPrintDialog(
99190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::ListValue* args) {
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int page_count = 0;
99390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!args || !args->GetInteger(0, &page_count))
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog",
99690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       page_count);
99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PrintWithCloudPrintDialog();
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleClosePreviewDialog(
10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(CANCEL);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before cancelling.
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel",
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ReportStats() {
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters",
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_printers_dialog_request_count_);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManageCloudPrinters",
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_cloud_printers_dialog_request_count_);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem(
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* settings) {
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the measurement system based on the locale.
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode errorCode = U_ZERO_ERROR;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* locale = g_browser_process->GetApplicationLocale().c_str();
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMeasurementSystem system = ulocdata_getMeasurementSystem(locale, &errorCode);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system = UMS_SI;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the number formatting based on the locale and writing to
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dictionary.
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2));
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(kMeasurementSystem, system);
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetInitialSettings(
10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
1037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send before SendInitialSettings to allow cloud printer auto select.
1038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendCloudPrintEnabled();
10394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
10414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&GetDefaultPrinterOnFileThread, print_backend_),
10424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendInitialSettings,
10434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleReportUiEvent(const base::ListValue* args) {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int event_group, event_number;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number))
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UiBucketGroups ui_bucket_group =
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<enum UiBucketGroups>(event_group);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ui_bucket_group >= UI_BUCKET_GROUP_BOUNDARY)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ui_bucket_group) {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESTINATION_SEARCH: {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum PrintDestinationBuckets event =
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<enum PrintDestinationBuckets>(event_number);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event >= PRINT_DESTINATION_BUCKET_BOUNDARY)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ReportPrintDestinationHistogram(event);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GCP_PROMO: {
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum GcpPromoBuckets event =
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<enum GcpPromoBuckets>(event_number);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event >= GCP_PROMO_BUCKET_BOUNDARY)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ReportGcpPromoHistogram(event);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleForceOpenNewTab(const base::ListValue* args) {
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string url;
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!args->GetString(0, &url))
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1082ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(GetInitiator());
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser)
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AddSelectedTabWithURL(browser,
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GURL(url),
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                content::PAGE_TRANSITION_LINK);
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendInitialSettings(
10914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& default_printer) {
10924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
10934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue initial_settings;
1096ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  initial_settings.SetString(kInitiatorTitle,
1097ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             print_preview_ui->initiator_title());
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingPreviewModifiable,
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              print_preview_ui->source_is_modifiable());
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetString(printing::kSettingPrinterName, default_printer);
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kDocumentHasSelection,
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->source_has_selection());
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly,
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->print_selection_only());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext(
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sticky_settings->printer_app_state())
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_settings.SetString(kAppState,
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               *sticky_settings->printer_app_state());
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* cmdline = CommandLine::ForCurrentProcess();
11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode,
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              cmdline->HasSwitch(switches::kKioskModePrinting));
11154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
11164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In Win8 metro, the system print dialog can only open on the desktop.  Doing
11174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // so will cause the browser to appear hung, so we don't show the link in
11184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // metro.
11194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_ash = (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH);
11204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  initial_settings.SetBoolean(kHidePrintWithSystemDialogLink, is_ash);
11214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_preview_ui->source_is_modifiable())
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumberFormatAndMeasurementSystem(&initial_settings);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::ClosePreviewDialog() {
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnClosePrintPreviewDialog();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::SendAccessToken(const std::string& type,
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const std::string& access_token) {
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Get getAccessToken finished";
11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->CallJavascriptFunction("onDidGetAccessToken",
11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::StringValue(type),
11395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::StringValue(access_token));
1140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendPrinterCapabilities(
11435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* settings_info) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities finished";
11458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_CUPS)
11478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  SaveCUPSColorSetting(settings_info);
11488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
11498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
11514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   *settings_info);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendFailedToGetPrinterCapabilities(
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& printer_name) {
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities failed";
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue printer_name_value(printer_name);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   printer_name_value);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PrintPreviewHandler::SetupPrinterList(const base::ListValue* printers) {
11634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!has_logged_printers_count_) {
11644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.NumberOfPrinters", printers->GetSize());
11654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    has_logged_printers_count_ = true;
11664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_ui()->CallJavascriptFunction("setPrinters", *printers);
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendCloudPrintEnabled() {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) {
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL gcp_url(CloudPrintURL(profile).GetCloudPrintServiceURL());
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringValue gcp_url_value(gcp_url.spec());
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("setUseCloudPrint", gcp_url_value);
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) {
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BASE64 encode the job data.
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string raw_data(reinterpret_cast<const char*>(data->front()),
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       data->size());
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string base64_data;
1187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(raw_data, &base64_data);
11885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue data_value(base64_data);
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("printToCloud", data_value);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebContents* PrintPreviewHandler::GetInitiator() const {
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dialog_controller)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1198ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return dialog_controller->GetInitiator(preview_web_contents());
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintDialogShown() {
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SelectFile(const base::FilePath& default_filename) {
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo file_type_info;
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions.resize(1);
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initializing |save_path_| if it is not already initialized.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sticky_settings->save_path()) {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allowing IO operation temporarily. It is ok to do so here because
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the select file dialog performs IO anyway in order to display the
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // folders and also it is modal.
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ThreadRestrictions::ScopedAllowIO allow_io;
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreSavePath(file_path);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        preview_web_contents()->GetBrowserContext())->GetPrefs());
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(preview_web_contents())),
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_->SelectFile(
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_SAVEAS_FILE,
1228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sticky_settings->save_path()->Append(default_filename),
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &file_type_info,
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::StringType(),
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      platform_util::GetTopLevel(
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          preview_web_contents()->GetView()->GetNativeView()),
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewDialogDestroyed() {
1239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
1244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(NULL);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewFailed() {
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reported_failed_preview_)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reported_failed_preview_ = true;
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_FAILED);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ShowSystemDialog() {
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleShowSystemDialog(NULL);
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::FileSelected(const base::FilePath& path,
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int index, void* params) {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updating |save_path_| to the newly selected folder.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->StoreSavePath(path.DirName());
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("fileSelectionCompleted");
12671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_to_pdf_path_ = path;
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PostPrintToPdfTask();
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PostPrintToPdfTask() {
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Preview data was checked before file dialog.";
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<printing::PreviewMetafile> metafile(new printing::PreviewMetafile);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile->InitFromData(static_cast<const void*>(data->front()), data->size());
12801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BrowserThread::PostTask(
12811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
12821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&PrintToPdfCallback, metafile.release(), print_to_pdf_path_));
12831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_to_pdf_path_ = base::FilePath();
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::FileSelectionCanceled(void* params) {
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnFileSelectionCancelled();
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1293ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PrintPreviewHandler::ClearInitiatorDetails() {
1294ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1295ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1298ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // We no longer require the initiator details. Remove those details associated
1299ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // with the preview dialog to allow the initiator to create another preview
1300ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // dialog.
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dialog_controller)
1304ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    dialog_controller->EraseInitiatorInfo(preview_web_contents());
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrintPreviewHandler::GetPreviewDataAndTitle(
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::RefCountedBytes>* data,
1309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* title) const {
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_ui()->GetController());
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> tmp_data;
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->GetPrintPreviewDataForIndex(
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &tmp_data);
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!tmp_data.get()) {
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(tmp_data->size() && tmp_data->front());
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *data = tmp_data;
1323ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *title = print_preview_ui->initiator_title();
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_CUPS)
13288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void PrintPreviewHandler::SaveCUPSColorSetting(
13298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    const base::DictionaryValue* settings) {
13308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  cups_printer_color_models_.reset(new CUPSPrinterColorModels);
13318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  settings->GetString(kPrinterId, &cups_printer_color_models_->printer_name);
13328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  settings->GetInteger(
13338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      kCUPSsColorModel,
13348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      reinterpret_cast<int*>(&cups_printer_color_models_->color_model));
13358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  settings->GetInteger(
13368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      kCUPSsBWModel,
13378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      reinterpret_cast<int*>(&cups_printer_color_models_->bw_model));
13388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
13398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void PrintPreviewHandler::ConvertColorSettingToCUPSColorModel(
13418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::DictionaryValue* settings) const {
13428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!cups_printer_color_models_)
13438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
13448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Sanity check the printer name.
13468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string printer_name;
13478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!settings->GetString(printing::kSettingDeviceName, &printer_name) ||
13488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      printer_name != cups_printer_color_models_->printer_name) {
13498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    NOTREACHED();
13508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
13518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
13528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int color;
13548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!settings->GetInteger(printing::kSettingColor, &color)) {
13558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    NOTREACHED();
13568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
13578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
13588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (color == printing::GRAY) {
13600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (cups_printer_color_models_->bw_model != printing::UNKNOWN_COLOR_MODEL) {
13610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      settings->SetInteger(printing::kSettingColor,
13620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           cups_printer_color_models_->bw_model);
13630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
13648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
13658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
13660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
13678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  printing::ColorModel color_model = cups_printer_color_models_->color_model;
13688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (color_model != printing::UNKNOWN_COLOR_MODEL)
13698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    settings->SetInteger(printing::kSettingColor, color_model);
13708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
13718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
1373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
1375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterChanged(
1376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool added,
1377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool has_local_printing,
1379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::DeviceDescription& description) {
1380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
1381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (has_local_printing ||
1382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)) {
1383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::DictionaryValue info;
1384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FillPrinterDescription(name, description, has_local_printing, &info);
1385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrinterChanged", info);
1386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterRemoved(const std::string& name) {
1390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterCacheFlushed() {
1393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::PrivetCapabilitiesUpdateClient(
1396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetUpdateClient(http_client.Pass()))
1398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_ =
1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      privet_http_client_->CreateCapabilitiesOperation(
14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&PrintPreviewHandler::OnPrivetCapabilities,
14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this)));
1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_->Start();
1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::PrivetUpdateClient(
1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!http_client) {
1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(privet_http_resolution_->GetName());
1411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    privet_http_resolution_.reset();
1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
1413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_.reset();
1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_.reset();
1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_client_ = http_client.Pass();
1418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_.reset();
1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::PrivetLocalPrintUpdateClient(
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string print_ticket,
1426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string capabilities,
1427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    gfx::Size page_size,
1428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetUpdateClient(http_client.Pass()))
1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  StartPrivetLocalPrint(print_ticket, capabilities, page_size);
1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrintPreviewHandler::StartPrivetLocalPrint(const std::string& print_ticket,
1436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                const std::string& capabilities,
1437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                const gfx::Size& page_size) {
1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_ =
1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      privet_http_client_->CreateLocalPrintOperation(this);
1440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->SetTicket(print_ticket);
1442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  privet_local_print_operation_->SetCapabilities(capabilities);
1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::FundamentalValue http_code_value(-1);
1449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_local_print_operation_->SetJobname(base::UTF16ToUTF8(title));
14545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_local_print_operation_->SetPageSize(page_size);
1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->SetData(data);
1456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SigninManagerBase* signin_manager =
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SigninManagerFactory::GetForProfileIfExists(profile);
1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (signin_manager) {
1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    privet_local_print_operation_->SetUsername(
1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        signin_manager->GetAuthenticatedUsername());
1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->Start();
1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetCapabilities(
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::DictionaryValue* capabilities) {
14725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string name = privet_capabilities_operation_->GetHTTPClient()->GetName();
1473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!capabilities || capabilities->HasKey(local_discovery::kPrivetKeyError)) {
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::DictionaryValue printer_info;
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const local_discovery::DeviceDescription* description =
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_lister_->GetDeviceDescription(name);
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!description) {
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FillPrinterDescription(name, *description, true, &printer_info);
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "onPrivetCapabilitiesSet",
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_info,
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      *capabilities);
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_.reset();
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::SendPrivetCapabilitiesError(
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& device_name) {
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::StringValue name_value(device_name);
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "failedToGetPrivetPrinterCapabilities",
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name_value);
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrintPreviewHandler::PrintToPrivetPrinter(const std::string& device_name,
1507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const std::string& ticket,
1508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const std::string& capabilities,
1509effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const gfx::Size& page_size) {
1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreatePrivetHTTP(
1511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      device_name,
1512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient,
1513effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 base::Unretained(this),
1514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 ticket,
1515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 capabilities,
1516effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 page_size));
1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::CreatePrivetHTTP(
1520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetHTTPAsynchronousFactory::ResultCallback&
1522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    callback) {
1523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const local_discovery::DeviceDescription* device_description =
1524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_lister_->GetDeviceDescription(name);
1525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!device_description) {
1527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_factory_ =
1532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
1533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      service_discovery_client_,
1534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Profile::FromWebUI(web_ui())->GetRequestContext());
1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
1536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name,
1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      device_description->address,
1538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      callback);
1539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_->Start();
1540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
1542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetPrintingDone(
1545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetLocalPrintOperation* print_operation) {
1546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClosePreviewDialog();
1547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetPrintingError(
1550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetLocalPrintOperation* print_operation,
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int http_code) {
1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FundamentalValue http_code_value(http_code);
1553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::FillPrinterDescription(
1557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::DeviceDescription& description,
1559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool has_local_printing,
1560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::DictionaryValue* printer_value) {
1561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
1562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printer_value->SetString("serviceName", name);
1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printer_value->SetString("name", description.name);
1565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  printer_value->SetBoolean("hasLocalPrinting", has_local_printing);
15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_value->SetBoolean(
15675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "isUnregistered",
1568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      description.id.empty() &&
1569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos));
15705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_value->SetString("cloudID", description.id);
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
1574