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)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <map>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/file_util_icu.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/number_formatting.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/linked_ptr.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_dialog_cloud.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_error_dialog.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_manager.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_dialog_controller.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_view_manager.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printer_manager_dialog.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.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"
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_cdd_conversion.h"
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/crash_keys.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/print_messages.h"
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/cloud_devices/common/cloud_device_description.h"
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/cloud_devices_urls.h"
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/cloud_devices/common/printer_description.h"
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_manager_base.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h"
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "printing/backend/print_backend_consts.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h"
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "printing/pdf_render_settings.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings.h"
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "printing/printing_context.h"
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "printing/units.h"
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/ulocdata.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/local_discovery/privet_constants.h"
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UserActionBuckets {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_TO_PRINTER,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_TO_PDF,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CANCEL,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FALLBACK_TO_ADVANCED_SETTINGS_DIALOG,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PREVIEW_FAILED,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PREVIEW_STARTED,
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  INITIATOR_CRASHED,  // UNUSED
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  INITIATOR_CLOSED,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_WITH_CLOUD_PRINT,
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PRINT_WITH_PRIVET,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USERACTION_BUCKET_BOUNDARY
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintSettingsBuckets {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LANDSCAPE = 0,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PORTRAIT,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLOR,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BLACK_AND_WHITE,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLLATE,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIMPLEX,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DUPLEX,
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TOTAL,
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HEADERS_AND_FOOTERS,
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CSS_BACKGROUND,
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SELECTION_ONLY,
119bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  EXTERNAL_PDF_PREVIEW,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_SETTINGS_BUCKET_BOUNDARY
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UiBucketGroups {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_SEARCH,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GCP_PROMO,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UI_BUCKET_GROUP_BOUNDARY
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintDestinationBuckets {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_SHOWN,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_CLOSED_CHANGED,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DESTINATION_CLOSED_UNCHANGED,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIGNIN_PROMPT,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIGNIN_TRIGGERED,
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PRIVET_DUPLICATE_SELECTED,
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CLOUD_DUPLICATE_SELECTED,
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  REGISTER_PROMO_SHOWN,
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  REGISTER_PROMO_SELECTED,
1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ACCOUNT_CHANGED,
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ADD_ACCOUNT_SELECTED,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_DESTINATION_BUCKET_BOUNDARY
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GcpPromoBuckets {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_SHOWN,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_CLOSED,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PROMO_CLICKED,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GCP_PROMO_BUCKET_BOUNDARY
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportUserActionHistogram(enum UserActionBuckets event) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            USERACTION_BUCKET_BOUNDARY);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingHistogram(enum PrintSettingsBuckets setting) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_SETTINGS_BUCKET_BOUNDARY);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintDestinationHistogram(enum PrintDestinationBuckets event) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.DestinationAction", event,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_DESTINATION_BUCKET_BOUNDARY);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportGcpPromoHistogram(enum GcpPromoBuckets event) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.GcpPromo", event,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            GCP_PROMO_BUCKET_BOUNDARY);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding cloud print related data;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppState[] = "appState";
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Name of a dictionary field holding the initiator title.
174ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kInitiatorTitle[] = "initiatorTitle";
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the measurement system according to the
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locale.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMeasurementSystem[] = "measurementSystem";
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the number format according to the locale.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNumberFormat[] = "numberFormat";
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field specifying whether to print automatically in
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kiosk mode. See http://crbug.com/31395.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode";
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kHidePrintWithSystemDialogLink[] = "hidePrintWithSystemDialogLink";
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Name of a dictionary field holding the state of selection for document.
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDocumentHasSelection[] = "documentHasSelection";
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Id of the predefined PDF printer.
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kLocalPdfPrinterId[] = "Save as PDF";
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Additional printer capability setting keys.
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kPrinterId[] = "printerId";
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPrinterCapabilities[] = "capabilities";
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the print job settings dictionary from |args|. The caller takes
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ownership of the returned DictionaryValue. Returns NULL on failure.
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* GetSettingsDictionary(const base::ListValue* args) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_str;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &json_str)) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Could not read JSON argument";
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (json_str.empty()) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Empty print job settings";
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<base::DictionaryValue*>(
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::JSONReader::Read(json_str)));
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!settings.get() || !settings->IsType(base::Value::TYPE_DICTIONARY)) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings must be a dictionary.";
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings->empty()) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings dictionary is empty";
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings.release();
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Track the popularity of print settings and report the stats.
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ReportPrintSettingsStats(const base::DictionaryValue& settings) {
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ReportPrintSettingHistogram(TOTAL);
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool landscape = false;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingLandscape, &landscape))
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(landscape ? LANDSCAPE : PORTRAIT);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool collate = false;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(COLLATE);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int duplex_mode = 0;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode))
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int color_mode = 0;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingColor, &color_mode)) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        printing::IsColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool headers = false;
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingHeaderFooterEnabled, &headers) &&
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      headers) {
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(HEADERS_AND_FOOTERS);
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool css_background = false;
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintBackgrounds,
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &css_background) && css_background) {
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(CSS_BACKGROUND);
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool selection_only = false;
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintSelectionOnly,
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &selection_only) && selection_only) {
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(SELECTION_ONLY);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
263bee9932bab44713b74b422b4b759b49f5a222977Bo Liu
264bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  bool external_preview = false;
265bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  if (settings.GetBoolean(printing::kSettingOpenPDFInPreview,
266bee9932bab44713b74b422b4b759b49f5a222977Bo Liu                          &external_preview) && external_preview) {
267bee9932bab44713b74b422b4b759b49f5a222977Bo Liu    ReportPrintSettingHistogram(EXTERNAL_PDF_PREVIEW);
268bee9932bab44713b74b422b4b759b49f5a222977Bo Liu  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback that stores a PDF file on disk.
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void PrintToPdfCallback(printing::Metafile* metafile,
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                        const base::FilePath& path) {
274e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile->SaveTo(path);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| must be deleted on the UI thread.
2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, metafile);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string GetDefaultPrinterOnFileThread() {
281e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend(
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL));
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string default_printer = print_backend->GetDefaultPrinterName();
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Default Printer: " << default_printer;
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return default_printer;
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size GetDefaultPdfMediaSizeMicrons() {
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<printing::PrintingContext> printing_context(
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing::PrintingContext::Create(
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          g_browser_process->GetApplicationLocale()));
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (printing::PrintingContext::OK != printing_context->UsePdfSettings() ||
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing_context->settings().device_units_per_inch() <= 0) {
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return gfx::Size();
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Size pdf_media_size = printing_context->GetPdfPaperSizeDeviceUnits();
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  float deviceMicronsPerDeviceUnit =
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (printing::kHundrethsMMPerInch * 10.0f) /
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing_context->settings().device_units_per_inch();
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return gfx::Size(pdf_media_size.width() * deviceMicronsPerDeviceUnit,
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   pdf_media_size.height() * deviceMicronsPerDeviceUnit);
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef base::Callback<void(const base::DictionaryValue*)>
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetPdfCapabilitiesCallback;
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<base::DictionaryValue> GetPdfCapabilitiesOnFileThread(
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& locale) {
312e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cloud_devices::CloudDeviceDescription description;
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  using namespace cloud_devices::printer;
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OrientationCapability orientation;
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.AddOption(cloud_devices::printer::PORTRAIT);
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.AddOption(cloud_devices::printer::LANDSCAPE);
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.AddDefaultOption(AUTO_ORIENTATION, true);
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.SaveTo(&description);
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ColorCapability color;
324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Color standard_color(STANDARD_COLOR);
326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    standard_color.vendor_id = base::IntToString(printing::COLOR);
327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    color.AddDefaultOption(standard_color, true);
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  color.SaveTo(&description);
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const cloud_devices::printer::MediaType kPdfMedia[] = {
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ISO_A4,
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ISO_A3,
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NA_LETTER,
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NA_LEGAL,
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NA_LEDGER
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons();
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Media default_media(
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "", "", default_media_size.width(), default_media_size.height());
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!default_media.MatchBySize() ||
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::find(kPdfMedia,
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                kPdfMedia + arraysize(kPdfMedia),
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                default_media.type) == kPdfMedia + arraysize(kPdfMedia)) {
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default_media = Media(locale == "en-US" ? NA_LETTER : ISO_A4);
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MediaCapability media;
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kPdfMedia); ++i) {
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Media media_option(kPdfMedia[i]);
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    media.AddDefaultOption(media_option,
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           default_media.type == media_option.type);
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  media.SaveTo(&description);
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy());
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<base::DictionaryValue> GetLocalPrinterCapabilitiesOnFileThread(
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& printer_name) {
36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend(
36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL));
36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  VLOG(1) << "Get printer capabilities start for " << printer_name;
36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  crash_keys::ScopedPrinterInfo crash_key(
36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      print_backend->GetPrinterDriverInfo(printer_name));
36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!print_backend->IsValidPrinter(printer_name)) {
37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LOG(WARNING) << "Invalid printer " << printer_name;
37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<base::DictionaryValue>();
37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  printing::PrinterSemanticCapsAndDefaults info;
37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, &info)) {
37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LOG(WARNING) << "Failed to get capabilities for " << printer_name;
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<base::DictionaryValue>();
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> description(
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info));
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!description) {
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LOG(WARNING) << "Failed to convert capabilities for " << printer_name;
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<base::DictionaryValue>();
38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return description.Pass();
38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void EnumeratePrintersOnFileThread(base::ListValue* printers) {
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend(
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL));
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Enumerate printers start";
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  printing::PrinterList printer_list;
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  print_backend->EnumeratePrinters(&printer_list);
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (printing::PrinterList::iterator it = printer_list.begin();
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       it != printer_list.end(); ++it) {
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::DictionaryValue* printer_info = new base::DictionaryValue;
403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printers->Append(printer_info);
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string printer_name;
405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string printer_description;
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX)
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // On Mac, |it->printer_description| specifies the printer name and
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |it->printer_name| specifies the device name / printer queue name.
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_name = it->printer_description;
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!it->options[kDriverNameTagName].empty())
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      printer_description = it->options[kDriverNameTagName];
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_name = it->printer_name;
414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_description = it->printer_description;
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_info->SetString(printing::kSettingDeviceName, it->printer_name);
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->SetString(printing::kSettingPrinterDescription,
418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            printer_description);
419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->SetString(printing::kSettingPrinterName, printer_name);
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    VLOG(1) << "Found printer " << printer_name
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            << " with device name " << it->printer_name;
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::DictionaryValue* options = new base::DictionaryValue;
424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->Set(printing::kSettingPrinterOptions, options);
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (std::map<std::string, std::string>::iterator opt = it->options.begin();
426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         opt != it->options.end();
427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         ++opt) {
428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      options->SetString(opt->first, opt->second);
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VLOG(1) << "Found printer " << printer_name << " with device name "
432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            << it->printer_name;
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Enumerate printers finished, found " << printers->GetSize()
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          << " printers";
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef base::Callback<void(const base::DictionaryValue*)>
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetPrinterCapabilitiesSuccessCallback;
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef base::Callback<void(const std::string&)>
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetPrinterCapabilitiesFailureCallback;
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GetPrinterCapabilitiesOnFileThread(
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& printer_name,
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& locale,
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GetPrinterCapabilitiesSuccessCallback& success_cb,
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GetPrinterCapabilitiesFailureCallback& failure_cb) {
448e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!printer_name.empty());
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
45146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> printer_capabilities(
45246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      printer_name == kLocalPdfPrinterId ?
45346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetPdfCapabilitiesOnFileThread(locale) :
45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetLocalPrinterCapabilitiesOnFileThread(printer_name));
45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!printer_capabilities) {
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            base::Bind(failure_cb, printer_name));
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> printer_info(new base::DictionaryValue);
46246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  printer_info->SetString(kPrinterId, printer_name);
46346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  printer_info->Set(kPrinterCapabilities, printer_capabilities.release());
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTask(
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(success_cb, base::Owned(printer_info.release())));
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::LazyInstance<printing::StickySettings> g_sticky_settings =
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)printing::StickySettings* GetStickySettings() {
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return g_sticky_settings.Pointer();
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrintPreviewHandler::AccessTokenService
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public OAuth2TokenService::Consumer {
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit AccessTokenService(PrintPreviewHandler* handler)
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : OAuth2TokenService::Consumer("print_preview"),
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        handler_(handler) {
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RequestToken(const std::string& type) {
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (requests_.find(type) != requests_.end())
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;  // Already in progress.
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OAuth2TokenService* service = NULL;
49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string account_id;
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == "profile") {
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile = Profile::FromWebUI(handler_->web_ui());
49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (profile) {
49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ProfileOAuth2TokenService* token_service =
49768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SigninManagerBase* signin_manager =
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            SigninManagerFactory::GetInstance()->GetForProfile(profile);
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        account_id = signin_manager->GetAuthenticatedAccountId();
50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        service = token_service;
50268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      }
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (type == "device") {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      chromeos::DeviceOAuth2TokenService* token_service =
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chromeos::DeviceOAuth2TokenServiceFactory::Get();
5071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      account_id = token_service->GetRobotAccountId();
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      service = token_service;
5091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
5111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (service) {
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OAuth2TokenService::ScopeSet oauth_scopes;
5140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      oauth_scopes.insert(cloud_devices::kCloudPrintAuthScope);
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<OAuth2TokenService::Request> request(
51668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          service->StartRequest(account_id, oauth_scopes, this));
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      requests_[type].reset(request.release());
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      handler_->SendAccessToken(type, std::string());  // Unknown type.
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& access_token,
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const base::Time& expiration_time) OVERRIDE {
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, access_token);
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const GoogleServiceAuthError& error) OVERRIDE {
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, std::string());
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnServiceResponce(const OAuth2TokenService::Request* request,
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const std::string& access_token) {
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) {
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (i->second == request) {
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        handler_->SendAccessToken(i->first, access_token);
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        requests_.erase(i);
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<std::string,
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   linked_ptr<OAuth2TokenService::Request> > Requests;
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Requests requests_;
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrintPreviewHandler* handler_;
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessTokenService);
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::PrintPreviewHandler()
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : regenerate_preview_request_count_(0),
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_printers_dialog_request_count_(0),
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_cloud_printers_dialog_request_count_(0),
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reported_failed_preview_(false),
5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      has_logged_printers_count_(false),
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      weak_factory_(this) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_STARTED);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::~PrintPreviewHandler() {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (select_file_dialog_.get())
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_->ListenerDestroyed();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::RegisterMessages() {
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinters",
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinters,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPreview",
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPreview,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("print",
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrint,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinterCapabilities",
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinterCapabilities,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("showSystemDialog",
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleShowSystemDialog,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("signIn",
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSignin,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getAccessToken",
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetAccessToken,
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageCloudPrinters",
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManageCloudPrint,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageLocalPrinters",
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManagePrinters,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("closePrintPreviewDialog",
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleClosePreviewDialog,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("hidePreview",
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleHidePreview,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("cancelPendingPrintRequest",
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("saveAppState",
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSaveAppState,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getInitialSettings",
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("reportUiEvent",
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleReportUiEvent,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
61690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  web_ui()->RegisterMessageCallback("printWithCloudPrintDialog",
61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("forceOpenNewTab",
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab,
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrivetPrinters",
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrivetPrinters,
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->RegisterMessageCallback("stopGetPrivetPrinters",
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleStopGetPrivetPrinters,
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this)));
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrivetPrinterCapabilities",
629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrivetPrinterCapabilities,
630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
631f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::PrivetPrintingEnabled() {
63423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return !base::CommandLine::ForCurrentProcess()->HasSwitch(
63623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    switches::kDisableDeviceDiscovery);
637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PrintPreviewHandler::preview_web_contents() const {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_ui()->GetWebContents();
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinters(const base::ListValue* /*args*/) {
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::ListValue* results = new base::ListValue;
6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTaskAndReply(
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&EnumeratePrintersOnFileThread,
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(results)),
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SetupPrinterList,
6534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Owned(results)));
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::HandleGetPrivetPrinters(const base::ListValue* args) {
65823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (PrivetPrintingEnabled()) {
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Profile* profile = Profile::FromWebUI(web_ui());
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    service_discovery_client_ =
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        local_discovery::ServiceDiscoverySharedClient::GetInstance();
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    printer_lister_.reset(new local_discovery::PrivetLocalPrinterLister(
664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        service_discovery_client_.get(),
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile->GetRequestContext(),
666f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        this));
667f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    printer_lister_->Start();
668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetPrintingEnabled()) {
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone");
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleStopGetPrivetPrinters(
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
67823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (PrivetPrintingEnabled()) {
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    printer_lister_->Stop();
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities(
686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::ListValue* args) {
68723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string name;
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool success = args->GetString(0, &name);
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(success);
691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreatePrivetHTTP(
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name,
694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient,
695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) {
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(3U, args->GetSize());
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(GetSettingsDictionary(args));
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id = -1;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetInteger(printing::kPreviewRequestID, &request_id))
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnPrintPreviewRequest(request_id);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an additional key in order to identify |print_preview_ui| later on
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(printing::kPreviewUIID,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       print_preview_ui->GetIDForPrintPreviewUI());
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment request count.
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++regenerate_preview_request_count_;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
720ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
721ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator) {
722ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ReportUserActionHistogram(INITIATOR_CLOSED);
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnClosePrintPreviewDialog();
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the page title and url and send it to the renderer process if
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // headers and footers are to be displayed.
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool display_header_footer = false;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled,
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &display_header_footer)) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (display_header_footer) {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterTitle,
736ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                        initiator->GetTitle());
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string url;
7381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content::NavigationEntry* entry =
739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        initiator->GetController().GetLastCommittedEntry();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url = entry->GetVirtualURL().spec();
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterURL, url);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool generate_draft_data = false;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = settings->GetBoolean(printing::kSettingGenerateDraftData,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &generate_draft_data);
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(success);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!generate_draft_data) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double draft_page_count_double = -1;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetDouble(1, &draft_page_count_double);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int draft_page_count = static_cast<int>(draft_page_count_double);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool preview_modifiable = false;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetBoolean(2, &preview_modifiable);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (draft_page_count != -1 && preview_modifiable &&
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print_preview_ui->GetAvailableDraftPageCount() != draft_page_count) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings->SetBoolean(printing::kSettingGenerateDraftData, true);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Print preview request start";
767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderViewHost* rvh = initiator->GetRenderViewHost();
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before printing.
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint",
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
780ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator) {
781ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderViewHost* rvh = initiator->GetRenderViewHost();
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->GetRoutingID()));
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(GetSettingsDictionary(args));
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Never try to add headers/footers here. It's already in the generated PDF.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_to_pdf = false;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_cloud_printer = false;
794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool print_with_privet = false;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool open_pdf_in_preview = false;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!open_pdf_in_preview) {
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintWithPrivet, &print_with_privet);
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int page_count = 0;
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings->GetInteger(printing::kSettingPreviewPageCount, &page_count);
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_to_pdf) {
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PDF);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintToPdf();
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (print_with_privet && PrivetPrintingEnabled()) {
819f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string printer_name;
820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string print_ticket;
821effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string capabilities;
822f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet", page_count);
823f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_PRIVET);
824f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int width = 0;
826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int height = 0;
827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!settings->GetString(printing::kSettingDeviceName, &printer_name) ||
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetString(printing::kSettingTicket, &print_ticket) ||
829effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        !settings->GetString(printing::kSettingCapabilities, &capabilities) ||
830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetInteger(printing::kSettingPageWidth, &width) ||
831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetInteger(printing::kSettingPageHeight, &height) ||
832effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        width <= 0 || height <= 0) {
833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTREACHED();
834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FundamentalValue http_code_value(-1);
835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return;
837f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
839effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PrintToPrivetPrinter(
840effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        printer_name, print_ticket, capabilities, gfx::Size(width, height));
841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_cloud_printer) {
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint",
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         page_count);
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT);
856868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SendCloudPrintJob(data.get());
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PRINTER);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportPrintSettingsStats(*settings);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This tries to activate the initiator as well, so do not clear the
863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // association with the initiator yet.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_ui()->GetController());
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnHidePreviewDialog();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Do this so the initiator can open a new print preview dialog, while the
869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // current print preview dialog is still handling its print job.
870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PDF being printed contains only the pages that the user selected,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so ignore the page range and print all pages.
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->Remove(printing::kSettingPageRange, NULL);
8751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Reset selection only flag for the same reason.
8761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set ID to know whether printing is for preview.
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->SetInteger(printing::kPreviewUIID,
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         print_preview_ui->GetIDForPrintPreviewUI());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost();
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(),
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                *settings));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For all other cases above, the preview dialog will stay open until the
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // printing has finished. Then the dialog closes and PrintPreviewDone() gets
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // called. In the case below, since the preview dialog will be hidden and
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // not closed, we need to make this call.
889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (initiator) {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      printing::PrintViewManager* print_view_manager =
891ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          printing::PrintViewManager::FromWebContents(initiator);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_view_manager->PrintPreviewDone();
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PrintToPdf() {
8981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!print_to_pdf_path_.empty()) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // User has already selected a path, no need to show the dialog again.
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostPrintToPdfTask();
901868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (!select_file_dialog_.get() ||
902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             !select_file_dialog_->IsRunning(platform_util::GetTopLevel(
903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 preview_web_contents()->GetNativeView()))) {
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_ui()->GetController());
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pre-populating select file dialog with print job title.
907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 print_job_title_utf16 = print_preview_ui->initiator_title();
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title(print_job_title_utf16);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title =
9135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(print_job_title_utf16);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_');
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath default_filename(print_job_title);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_filename =
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf"));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SelectFile(default_filename);
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleHidePreview(const base::ListValue* /*args*/) {
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnHidePreviewDialog();
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleCancelPendingPrintRequest(
9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator)
935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
936a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  chrome::ShowPrintErrorDialog();
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleSaveAppState(const base::ListValue* args) {
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_to_save;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString(0, &data_to_save) && !data_to_save.empty())
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreAppState(data_to_save);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinterCapabilities(
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string printer_name;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ret = args->GetString(0, &printer_name);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ret || printer_name.empty())
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetPrinterCapabilitiesSuccessCallback success_cb =
9564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendPrinterCapabilities,
9574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr());
9584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetPrinterCapabilitiesFailureCallback failure_cb =
9594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendFailedToGetPrinterCapabilities,
9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr());
961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          base::Bind(&GetPrinterCapabilitiesOnFileThread,
963cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     printer_name,
964cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     g_browser_process->GetApplicationLocale(),
965cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     success_cb, failure_cb));
9664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
9674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PrintPreviewHandler::OnSigninComplete() {
9694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
9704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
9714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (print_preview_ui)
9724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    print_preview_ui->OnReloadPrintersList();
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid PrintPreviewHandler::HandleSignin(const base::ListValue* args) {
976e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool add_account = false;
977e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool success = args->GetBoolean(0, &add_account);
978e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(success);
979e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::ScopedTabbedBrowserDisplayer displayer(
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile, chrome::GetActiveDesktop());
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  print_dialog_cloud::CreateCloudPrintSigninTab(
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      displayer.browser(),
986e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      add_account,
9874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::OnSigninComplete,
9884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) {
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string type;
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!args->GetString(0, &type))
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!token_service_)
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    token_service_.reset(new AccessTokenService(this));
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  token_service_->RequestToken(type);
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::PrintWithCloudPrintDialog() {
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user asks to print via cloud print
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead of the print preview dialog.
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
100790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
100890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Nothing to print, no preview available.
100990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
101090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
101190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeWindow modal_parent = platform_util::GetTopLevel(
1013010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      preview_web_contents()->GetNativeView());
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_dialog_cloud::CreatePrintDialogForBytes(
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext(),
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      modal_parent,
1017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      data.get(),
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title,
1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("application/pdf"));
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once the cloud print dialog comes up we're no longer in a background
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // printing situation.  Close the print preview.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(abodenha@chromium.org) The flow should be changed as described in
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=44093
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleManageCloudPrint(
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_cloud_printers_dialog_request_count_;
10320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  preview_web_contents()->OpenURL(content::OpenURLParams(
10330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      cloud_devices::GetCloudPrintRelativeURL("manage.html"),
10340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      content::Referrer(),
10350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NEW_FOREGROUND_TAB,
10360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      content::PAGE_TRANSITION_LINK,
10370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false));
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleShowSystemDialog(
10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1046ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
1050ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(this);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->PrintForSystemDialogNow();
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the pending preview request if exists.
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnCancelPendingPreviewRequest();
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleManagePrinters(
10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_printers_dialog_request_count_;
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrinterManagerDialog::ShowPrinterManagerDialog();
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::HandlePrintWithCloudPrintDialog(
106790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::ListValue* args) {
106890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int page_count = 0;
106990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!args || !args->GetInteger(0, &page_count))
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
107190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog",
107290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       page_count);
107390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
107490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PrintWithCloudPrintDialog();
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleClosePreviewDialog(
10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(CANCEL);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before cancelling.
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel",
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ReportStats() {
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters",
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_printers_dialog_request_count_);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManageCloudPrinters",
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_cloud_printers_dialog_request_count_);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem(
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* settings) {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the measurement system based on the locale.
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode errorCode = U_ZERO_ERROR;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* locale = g_browser_process->GetApplicationLocale().c_str();
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMeasurementSystem system = ulocdata_getMeasurementSystem(locale, &errorCode);
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system = UMS_SI;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the number formatting based on the locale and writing to
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dictionary.
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2));
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(kMeasurementSystem, system);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetInitialSettings(
11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
1113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send before SendInitialSettings to allow cloud printer auto select.
1114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendCloudPrintEnabled();
11154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&GetDefaultPrinterOnFileThread),
11184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendInitialSettings,
11194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleReportUiEvent(const base::ListValue* args) {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int event_group, event_number;
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number))
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UiBucketGroups ui_bucket_group =
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<enum UiBucketGroups>(event_group);
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ui_bucket_group >= UI_BUCKET_GROUP_BOUNDARY)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ui_bucket_group) {
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DESTINATION_SEARCH: {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum PrintDestinationBuckets event =
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<enum PrintDestinationBuckets>(event_number);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event >= PRINT_DESTINATION_BUCKET_BOUNDARY)
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ReportPrintDestinationHistogram(event);
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case GCP_PROMO: {
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enum GcpPromoBuckets event =
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<enum GcpPromoBuckets>(event_number);
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (event >= GCP_PROMO_BUCKET_BOUNDARY)
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ReportGcpPromoHistogram(event);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleForceOpenNewTab(const base::ListValue* args) {
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string url;
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!args->GetString(0, &url))
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(GetInitiator());
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser)
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AddSelectedTabWithURL(browser,
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GURL(url),
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                content::PAGE_TRANSITION_LINK);
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendInitialSettings(
11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& default_printer) {
11684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
11694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue initial_settings;
1172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  initial_settings.SetString(kInitiatorTitle,
1173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             print_preview_ui->initiator_title());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingPreviewModifiable,
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              print_preview_ui->source_is_modifiable());
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetString(printing::kSettingPrinterName, default_printer);
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kDocumentHasSelection,
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->source_has_selection());
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly,
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->print_selection_only());
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext(
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
118446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (sticky_settings->printer_app_state()) {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_settings.SetString(kAppState,
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               *sticky_settings->printer_app_state());
118746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode,
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              cmdline->HasSwitch(switches::kKioskModePrinting));
11924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In Win8 metro, the system print dialog can only open on the desktop.  Doing
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // so will cause the browser to appear hung, so we don't show the link in
11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // metro.
11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_ash = (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH);
11974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  initial_settings.SetBoolean(kHidePrintWithSystemDialogLink, is_ash);
11984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_preview_ui->source_is_modifiable())
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumberFormatAndMeasurementSystem(&initial_settings);
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::ClosePreviewDialog() {
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnClosePrintPreviewDialog();
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::SendAccessToken(const std::string& type,
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const std::string& access_token) {
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Get getAccessToken finished";
12145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->CallJavascriptFunction("onDidGetAccessToken",
12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::StringValue(type),
12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::StringValue(access_token));
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendPrinterCapabilities(
12205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* settings_info) {
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities finished";
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
12234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   *settings_info);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendFailedToGetPrinterCapabilities(
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& printer_name) {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities failed";
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue printer_name_value(printer_name);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   printer_name_value);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PrintPreviewHandler::SetupPrinterList(const base::ListValue* printers) {
12354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!has_logged_printers_count_) {
12364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.NumberOfPrinters", printers->GetSize());
12374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    has_logged_printers_count_ = true;
12384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_ui()->CallJavascriptFunction("setPrinters", *printers);
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendCloudPrintEnabled() {
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) {
12480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GURL gcp_url(cloud_devices::GetCloudPrintURL());
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringValue gcp_url_value(gcp_url.spec());
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("setUseCloudPrint", gcp_url_value);
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) {
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BASE64 encode the job data.
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string raw_data(reinterpret_cast<const char*>(data->front()),
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       data->size());
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string base64_data;
1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(raw_data, &base64_data);
12605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue data_value(base64_data);
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("printToCloud", data_value);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebContents* PrintPreviewHandler::GetInitiator() const {
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dialog_controller)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1270ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return dialog_controller->GetInitiator(preview_web_contents());
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintDialogShown() {
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SelectFile(const base::FilePath& default_filename) {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo file_type_info;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions.resize(1);
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initializing |save_path_| if it is not already initialized.
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sticky_settings->save_path()) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allowing IO operation temporarily. It is ok to do so here because
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the select file dialog performs IO anyway in order to display the
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // folders and also it is modal.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ThreadRestrictions::ScopedAllowIO allow_io;
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path);
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreSavePath(file_path);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        preview_web_contents()->GetBrowserContext())->GetPrefs());
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(preview_web_contents())),
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_->SelectFile(
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_SAVEAS_FILE,
1300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sticky_settings->save_path()->Append(default_filename),
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &file_type_info,
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::StringType(),
1305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      platform_util::GetTopLevel(preview_web_contents()->GetNativeView()),
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewDialogDestroyed() {
1310ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1311ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
1315ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(NULL);
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewFailed() {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reported_failed_preview_)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reported_failed_preview_ = true;
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_FAILED);
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ShowSystemDialog() {
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleShowSystemDialog(NULL);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::FileSelected(const base::FilePath& path,
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int index, void* params) {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updating |save_path_| to the newly selected folder.
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->StoreSavePath(path.DirName());
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("fileSelectionCompleted");
13381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_to_pdf_path_ = path;
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PostPrintToPdfTask();
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PostPrintToPdfTask() {
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Preview data was checked before file dialog.";
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<printing::PreviewMetafile> metafile(new printing::PreviewMetafile);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metafile->InitFromData(static_cast<const void*>(data->front()), data->size());
13511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BrowserThread::PostTask(
13521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
13531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&PrintToPdfCallback, metafile.release(), print_to_pdf_path_));
13541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_to_pdf_path_ = base::FilePath();
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::FileSelectionCanceled(void* params) {
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnFileSelectionCancelled();
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1364ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PrintPreviewHandler::ClearInitiatorDetails() {
1365ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1366ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1369ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // We no longer require the initiator details. Remove those details associated
1370ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // with the preview dialog to allow the initiator to create another preview
1371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // dialog.
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dialog_controller)
1375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    dialog_controller->EraseInitiatorInfo(preview_web_contents());
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrintPreviewHandler::GetPreviewDataAndTitle(
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::RefCountedBytes>* data,
1380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* title) const {
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_ui()->GetController());
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> tmp_data;
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->GetPrintPreviewDataForIndex(
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &tmp_data);
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!tmp_data.get()) {
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(tmp_data->size() && tmp_data->front());
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *data = tmp_data;
1394ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *title = print_preview_ui->initiator_title();
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
139823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
1399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterChanged(
1400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool added,
1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool has_local_printing,
1403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::DeviceDescription& description) {
140446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (has_local_printing ||
1406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)) {
1407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::DictionaryValue info;
1408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FillPrinterDescription(name, description, has_local_printing, &info);
1409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrinterChanged", info);
1410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterRemoved(const std::string& name) {
1414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterCacheFlushed() {
1417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::PrivetCapabilitiesUpdateClient(
1420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetUpdateClient(http_client.Pass()))
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_ =
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      privet_http_client_->CreateCapabilitiesOperation(
14265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&PrintPreviewHandler::OnPrivetCapabilities,
14275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this)));
1428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_->Start();
1429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::PrivetUpdateClient(
1432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!http_client) {
1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(privet_http_resolution_->GetName());
1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    privet_http_resolution_.reset();
1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_.reset();
1440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_.reset();
1441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  privet_http_client_ =
1442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      local_discovery::PrivetV1HTTPClient::CreateDefault(http_client.Pass());
1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_.reset();
1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1448f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::PrivetLocalPrintUpdateClient(
1450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string print_ticket,
1451effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string capabilities,
1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    gfx::Size page_size,
1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetUpdateClient(http_client.Pass()))
1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  StartPrivetLocalPrint(print_ticket, capabilities, page_size);
1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrintPreviewHandler::StartPrivetLocalPrint(const std::string& print_ticket,
1461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                const std::string& capabilities,
1462effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                const gfx::Size& page_size) {
1463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_ =
1464f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      privet_http_client_->CreateLocalPrintOperation(this);
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->SetTicket(print_ticket);
1467effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  privet_local_print_operation_->SetCapabilities(capabilities);
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
1473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::FundamentalValue http_code_value(-1);
1474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_local_print_operation_->SetJobname(base::UTF16ToUTF8(title));
14795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_local_print_operation_->SetPageSize(page_size);
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->SetData(data);
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SigninManagerBase* signin_manager =
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SigninManagerFactory::GetForProfileIfExists(profile);
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (signin_manager) {
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    privet_local_print_operation_->SetUsername(
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        signin_manager->GetAuthenticatedUsername());
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->Start();
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetCapabilities(
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::DictionaryValue* capabilities) {
14975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string name = privet_capabilities_operation_->GetHTTPClient()->GetName();
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!capabilities || capabilities->HasKey(local_discovery::kPrivetKeyError)) {
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::DictionaryValue printer_info;
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const local_discovery::DeviceDescription* description =
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_lister_->GetDeviceDescription(name);
1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!description) {
1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FillPrinterDescription(name, *description, true, &printer_info);
1514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "onPrivetCapabilitiesSet",
1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_info,
1518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      *capabilities);
1519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_.reset();
1521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::SendPrivetCapabilitiesError(
1524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& device_name) {
1525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::StringValue name_value(device_name);
1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "failedToGetPrivetPrinterCapabilities",
1528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name_value);
1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrintPreviewHandler::PrintToPrivetPrinter(const std::string& device_name,
1532effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const std::string& ticket,
1533effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const std::string& capabilities,
1534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const gfx::Size& page_size) {
1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreatePrivetHTTP(
1536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      device_name,
1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient,
1538effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 base::Unretained(this),
1539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 ticket,
1540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 capabilities,
1541effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 page_size));
1542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::CreatePrivetHTTP(
1545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetHTTPAsynchronousFactory::ResultCallback&
1547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        callback) {
1548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const local_discovery::DeviceDescription* device_description =
1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_lister_->GetDeviceDescription(name);
1550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!device_description) {
1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
1554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_factory_ =
1557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
1558f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          service_discovery_client_,
1559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          Profile::FromWebUI(web_ui())->GetRequestContext());
1560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
1561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      name, device_description->address, callback);
1562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_->Start();
1563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetPrintingDone(
1568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetLocalPrintOperation* print_operation) {
1569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClosePreviewDialog();
1570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetPrintingError(
1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetLocalPrintOperation* print_operation,
1574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int http_code) {
1575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FundamentalValue http_code_value(http_code);
1576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::FillPrinterDescription(
1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::DeviceDescription& description,
1582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool has_local_printing,
1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::DictionaryValue* printer_value) {
158446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printer_value->SetString("serviceName", name);
1587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printer_value->SetString("name", description.name);
1588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  printer_value->SetBoolean("hasLocalPrinting", has_local_printing);
15895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_value->SetBoolean(
15905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "isUnregistered",
1591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      description.id.empty() &&
1592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos));
15935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_value->SetString("cloudID", description.id);
1594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
159646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // defined(ENABLE_SERVICE_DISCOVERY)
1597