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"
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/app_mode/app_mode_utils.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_dialog_cloud.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_error_dialog.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_manager.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_dialog_controller.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_view_manager.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printer_manager_dialog.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/signin/account_reconcilor_factory.h"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_cdd_conversion.h"
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/crash_keys.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/print_messages.h"
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/cloud_devices/common/cloud_device_description.h"
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/cloud_devices_urls.h"
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/cloud_devices/common/printer_description.h"
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/signin/core/browser/account_reconcilor.h"
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/signin/core/common/profile_management_switches.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/render_process_host.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h"
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "printing/backend/print_backend_consts.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h"
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "printing/pdf_metafile_skia.h"
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "printing/pdf_render_settings.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings.h"
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "printing/printing_context.h"
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "printing/units.h"
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/ulocdata.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/local_discovery/privet_constants.h"
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UserActionBuckets {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_TO_PRINTER,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_TO_PDF,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CANCEL,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FALLBACK_TO_ADVANCED_SETTINGS_DIALOG,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PREVIEW_FAILED,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PREVIEW_STARTED,
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  INITIATOR_CRASHED,  // UNUSED
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  INITIATOR_CLOSED,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_WITH_CLOUD_PRINT,
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PRINT_WITH_PRIVET,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USERACTION_BUCKET_BOUNDARY
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintSettingsBuckets {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LANDSCAPE = 0,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PORTRAIT,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLOR,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BLACK_AND_WHITE,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COLLATE,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIMPLEX,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DUPLEX,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TOTAL,
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HEADERS_AND_FOOTERS,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CSS_BACKGROUND,
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SELECTION_ONLY,
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXTERNAL_PDF_PREVIEW,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PAGE_RANGE,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DEFAULT_MEDIA,
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NON_DEFAULT_MEDIA,
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COPIES,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NON_DEFAULT_MARGINS,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PRINT_SETTINGS_BUCKET_BOUNDARY
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportUserActionHistogram(enum UserActionBuckets event) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            USERACTION_BUCKET_BOUNDARY);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingHistogram(enum PrintSettingsBuckets setting) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            PRINT_SETTINGS_BUCKET_BOUNDARY);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding cloud print related data;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppState[] = "appState";
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Name of a dictionary field holding the initiator title.
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kInitiatorTitle[] = "initiatorTitle";
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the measurement system according to the
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locale.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMeasurementSystem[] = "measurementSystem";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the number format according to the locale.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNumberFormat[] = "numberFormat";
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field specifying whether to print automatically in
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kiosk mode. See http://crbug.com/31395.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode";
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Dictionary field to indicate whether Chrome is running in forced app (app
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// kiosk) mode. It's not the same as desktop Chrome kiosk (the one above).
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kAppKioskMode[] = "appKioskMode";
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Dictionary field to store Cloud Print base URL.
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kCloudPrintUrl[] = "cloudPrintUrl";
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kHidePrintWithSystemDialogLink[] = "hidePrintWithSystemDialogLink";
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Name of a dictionary field holding the state of selection for document.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDocumentHasSelection[] = "documentHasSelection";
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Id of the predefined PDF printer.
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kLocalPdfPrinterId[] = "Save as PDF";
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Additional printer capability setting keys.
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char kPrinterId[] = "printerId";
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPrinterCapabilities[] = "capabilities";
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the print job settings dictionary from |args|. The caller takes
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ownership of the returned DictionaryValue. Returns NULL on failure.
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::DictionaryValue* GetSettingsDictionary(const base::ListValue* args) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string json_str;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &json_str)) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Could not read JSON argument";
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (json_str.empty()) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Empty print job settings";
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<base::DictionaryValue*>(
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::JSONReader::Read(json_str)));
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!settings.get() || !settings->IsType(base::Value::TYPE_DICTIONARY)) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings must be a dictionary.";
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings->empty()) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Print job settings dictionary is empty";
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return settings.release();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Track the popularity of print settings and report the stats.
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ReportPrintSettingsStats(const base::DictionaryValue& settings) {
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ReportPrintSettingHistogram(TOTAL);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::ListValue* page_range_array = NULL;
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (settings.GetList(printing::kSettingPageRange, &page_range_array) &&
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !page_range_array->empty()) {
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ReportPrintSettingHistogram(PAGE_RANGE);
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* media_size_value = NULL;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (settings.GetDictionary(printing::kSettingMediaSize, &media_size_value) &&
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !media_size_value->empty()) {
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool is_default = false;
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (media_size_value->GetBoolean(printing::kSettingMediaSizeIsDefault,
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     &is_default) &&
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        is_default) {
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReportPrintSettingHistogram(DEFAULT_MEDIA);
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else {
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReportPrintSettingHistogram(NON_DEFAULT_MEDIA);
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool landscape = false;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingLandscape, &landscape))
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(landscape ? LANDSCAPE : PORTRAIT);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int copies = 1;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (settings.GetInteger(printing::kSettingCopies, &copies) && copies > 1)
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ReportPrintSettingHistogram(COPIES);
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool collate = false;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(COLLATE);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int duplex_mode = 0;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode))
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int color_mode = 0;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings.GetInteger(printing::kSettingColor, &color_mode)) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReportPrintSettingHistogram(
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        printing::IsColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int margins_type = 0;
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (settings.GetInteger(printing::kSettingMarginsType, &margins_type) &&
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      margins_type != 0) {
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ReportPrintSettingHistogram(NON_DEFAULT_MARGINS);
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool headers = false;
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingHeaderFooterEnabled, &headers) &&
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      headers) {
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(HEADERS_AND_FOOTERS);
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool css_background = false;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintBackgrounds,
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &css_background) && css_background) {
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(CSS_BACKGROUND);
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool selection_only = false;
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings.GetBoolean(printing::kSettingShouldPrintSelectionOnly,
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          &selection_only) && selection_only) {
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ReportPrintSettingHistogram(SELECTION_ONLY);
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool external_preview = false;
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (settings.GetBoolean(printing::kSettingOpenPDFInPreview,
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          &external_preview) && external_preview) {
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ReportPrintSettingHistogram(EXTERNAL_PDF_PREVIEW);
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback that stores a PDF file on disk.
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintToPdfCallback(const scoped_refptr<base::RefCountedBytes>& data,
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const base::FilePath& path,
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const base::Closure& pdf_file_saved_closure) {
280e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  printing::PdfMetafileSkia metafile;
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metafile.InitFromData(static_cast<const void*>(data->front()), data->size());
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::File file(path,
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  metafile.SaveTo(&file);
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!pdf_file_saved_closure.is_null())
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    pdf_file_saved_closure.Run();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string GetDefaultPrinterOnFileThread() {
291e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend(
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL));
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string default_printer = print_backend->GetDefaultPrinterName();
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Default Printer: " << default_printer;
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return default_printer;
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PrintingContextDelegate : public printing::PrintingContext::Delegate {
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // PrintingContext::Delegate methods.
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual gfx::NativeView GetParentView() OVERRIDE { return NULL; }
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetAppLocale() OVERRIDE {
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return g_browser_process->GetApplicationLocale();
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size GetDefaultPdfMediaSizeMicrons() {
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrintingContextDelegate delegate;
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<printing::PrintingContext> printing_context(
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      printing::PrintingContext::Create(&delegate));
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (printing::PrintingContext::OK != printing_context->UsePdfSettings() ||
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing_context->settings().device_units_per_inch() <= 0) {
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return gfx::Size();
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Size pdf_media_size = printing_context->GetPdfPaperSizeDeviceUnits();
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  float deviceMicronsPerDeviceUnit =
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (printing::kHundrethsMMPerInch * 10.0f) /
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing_context->settings().device_units_per_inch();
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return gfx::Size(pdf_media_size.width() * deviceMicronsPerDeviceUnit,
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   pdf_media_size.height() * deviceMicronsPerDeviceUnit);
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)typedef base::Callback<void(const base::DictionaryValue*)>
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetPdfCapabilitiesCallback;
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_ptr<base::DictionaryValue> GetPdfCapabilitiesOnFileThread(
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& locale) {
331e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  cloud_devices::CloudDeviceDescription description;
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  using namespace cloud_devices::printer;
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OrientationCapability orientation;
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.AddOption(cloud_devices::printer::PORTRAIT);
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.AddOption(cloud_devices::printer::LANDSCAPE);
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.AddDefaultOption(AUTO_ORIENTATION, true);
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  orientation.SaveTo(&description);
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ColorCapability color;
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Color standard_color(STANDARD_COLOR);
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    standard_color.vendor_id = base::IntToString(printing::COLOR);
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    color.AddDefaultOption(standard_color, true);
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  color.SaveTo(&description);
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const cloud_devices::printer::MediaType kPdfMedia[] = {
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ISO_A4,
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ISO_A3,
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NA_LETTER,
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NA_LEGAL,
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    NA_LEDGER
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const gfx::Size default_media_size = GetDefaultPdfMediaSizeMicrons();
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Media default_media(
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "", "", default_media_size.width(), default_media_size.height());
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!default_media.MatchBySize() ||
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::find(kPdfMedia,
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                kPdfMedia + arraysize(kPdfMedia),
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                default_media.type) == kPdfMedia + arraysize(kPdfMedia)) {
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default_media = Media(locale == "en-US" ? NA_LETTER : ISO_A4);
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MediaCapability media;
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kPdfMedia); ++i) {
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Media media_option(kPdfMedia[i]);
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    media.AddDefaultOption(media_option,
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           default_media.type == media_option.type);
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  media.SaveTo(&description);
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy());
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<base::DictionaryValue> GetLocalPrinterCapabilitiesOnFileThread(
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string& printer_name) {
37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend(
38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL));
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  VLOG(1) << "Get printer capabilities start for " << printer_name;
38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  crash_keys::ScopedPrinterInfo crash_key(
38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      print_backend->GetPrinterDriverInfo(printer_name));
38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!print_backend->IsValidPrinter(printer_name)) {
38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LOG(WARNING) << "Invalid printer " << printer_name;
39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<base::DictionaryValue>();
39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  printing::PrinterSemanticCapsAndDefaults info;
39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, &info)) {
39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LOG(WARNING) << "Failed to get capabilities for " << printer_name;
39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<base::DictionaryValue>();
39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> description(
40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      cloud_print::PrinterSemanticCapsAndDefaultsToCdd(info));
40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!description) {
40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    LOG(WARNING) << "Failed to convert capabilities for " << printer_name;
40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<base::DictionaryValue>();
40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return description.Pass();
40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void EnumeratePrintersOnFileThread(base::ListValue* printers) {
410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<printing::PrintBackend> print_backend(
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      printing::PrintBackend::CreateInstance(NULL));
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Enumerate printers start";
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  printing::PrinterList printer_list;
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  print_backend->EnumeratePrinters(&printer_list);
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  for (printing::PrinterList::iterator it = printer_list.begin();
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)       it != printer_list.end(); ++it) {
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::DictionaryValue* printer_info = new base::DictionaryValue;
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printers->Append(printer_info);
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string printer_name;
424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string printer_description;
4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX)
4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // On Mac, |it->printer_description| specifies the printer name and
4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // |it->printer_name| specifies the device name / printer queue name.
4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_name = it->printer_description;
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!it->options[kDriverNameTagName].empty())
430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      printer_description = it->options[kDriverNameTagName];
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_name = it->printer_name;
433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_description = it->printer_description;
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    printer_info->SetString(printing::kSettingDeviceName, it->printer_name);
436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->SetString(printing::kSettingPrinterDescription,
437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                            printer_description);
438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->SetString(printing::kSettingPrinterName, printer_name);
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    VLOG(1) << "Found printer " << printer_name
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            << " with device name " << it->printer_name;
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::DictionaryValue* options = new base::DictionaryValue;
443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    printer_info->Set(printing::kSettingPrinterOptions, options);
444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (std::map<std::string, std::string>::iterator opt = it->options.begin();
445effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         opt != it->options.end();
446effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch         ++opt) {
447effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      options->SetString(opt->first, opt->second);
448effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
449effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
450effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VLOG(1) << "Found printer " << printer_name << " with device name "
451effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            << it->printer_name;
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VLOG(1) << "Enumerate printers finished, found " << printers->GetSize()
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          << " printers";
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef base::Callback<void(const base::DictionaryValue*)>
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetPrinterCapabilitiesSuccessCallback;
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef base::Callback<void(const std::string&)>
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GetPrinterCapabilitiesFailureCallback;
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GetPrinterCapabilitiesOnFileThread(
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& printer_name,
464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string& locale,
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GetPrinterCapabilitiesSuccessCallback& success_cb,
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const GetPrinterCapabilitiesFailureCallback& failure_cb) {
467e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::FILE);
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!printer_name.empty());
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> printer_capabilities(
47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      printer_name == kLocalPdfPrinterId ?
47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetPdfCapabilitiesOnFileThread(locale) :
47346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetLocalPrinterCapabilitiesOnFileThread(printer_name));
47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!printer_capabilities) {
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            base::Bind(failure_cb, printer_name));
4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
48046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<base::DictionaryValue> printer_info(new base::DictionaryValue);
48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  printer_info->SetString(kPrinterId, printer_name);
48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  printer_info->Set(kPrinterCapabilities, printer_capabilities.release());
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTask(
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      BrowserThread::UI, FROM_HERE,
48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Bind(success_cb, base::Owned(printer_info.release())));
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)base::LazyInstance<printing::StickySettings> g_sticky_settings =
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)printing::StickySettings* GetStickySettings() {
4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return g_sticky_settings.Pointer();
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrintPreviewHandler::AccessTokenService
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public OAuth2TokenService::Consumer {
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit AccessTokenService(PrintPreviewHandler* handler)
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : OAuth2TokenService::Consumer("print_preview"),
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        handler_(handler) {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RequestToken(const std::string& type) {
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (requests_.find(type) != requests_.end())
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return;  // Already in progress.
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OAuth2TokenService* service = NULL;
51168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string account_id;
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (type == "profile") {
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      Profile* profile = Profile::FromWebUI(handler_->web_ui());
51468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (profile) {
51568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ProfileOAuth2TokenService* token_service =
51668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        SigninManagerBase* signin_manager =
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            SigninManagerFactory::GetInstance()->GetForProfile(profile);
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        account_id = signin_manager->GetAuthenticatedAccountId();
52068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        service = token_service;
52168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      }
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else if (type == "device") {
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      chromeos::DeviceOAuth2TokenService* token_service =
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          chromeos::DeviceOAuth2TokenServiceFactory::Get();
5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      account_id = token_service->GetRobotAccountId();
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      service = token_service;
5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (service) {
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OAuth2TokenService::ScopeSet oauth_scopes;
5330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      oauth_scopes.insert(cloud_devices::kCloudPrintAuthScope);
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<OAuth2TokenService::Request> request(
53568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          service->StartRequest(account_id, oauth_scopes, this));
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      requests_[type].reset(request.release());
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      handler_->SendAccessToken(type, std::string());  // Unknown type.
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& access_token,
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const base::Time& expiration_time) OVERRIDE {
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, access_token);
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const GoogleServiceAuthError& error) OVERRIDE {
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    OnServiceResponce(request, std::string());
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnServiceResponce(const OAuth2TokenService::Request* request,
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         const std::string& access_token) {
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) {
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (i->second == request) {
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        handler_->SendAccessToken(i->first, access_token);
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        requests_.erase(i);
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return;
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef std::map<std::string,
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   linked_ptr<OAuth2TokenService::Request> > Requests;
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Requests requests_;
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PrintPreviewHandler* handler_;
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AccessTokenService);
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::PrintPreviewHandler()
575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : regenerate_preview_request_count_(0),
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_printers_dialog_request_count_(0),
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manage_cloud_printers_dialog_request_count_(0),
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reported_failed_preview_(false),
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      has_logged_printers_count_(false),
580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      reconcilor_(NULL),
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      weak_factory_(this) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_STARTED);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::~PrintPreviewHandler() {
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (select_file_dialog_.get())
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_->ListenerDestroyed();
588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  UnregisterForMergeSession();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::RegisterMessages() {
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinters",
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinters,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPreview",
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPreview,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("print",
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrint,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrinterCapabilities",
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrinterCapabilities,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_BASIC_PRINTING)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("showSystemDialog",
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleShowSystemDialog,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // !DISABLE_BASIC_PRINTING
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("signIn",
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSignin,
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getAccessToken",
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetAccessToken,
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 base::Unretained(this)));
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageCloudPrinters",
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManageCloudPrint,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("manageLocalPrinters",
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleManagePrinters,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("closePrintPreviewDialog",
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleClosePreviewDialog,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("hidePreview",
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleHidePreview,
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("cancelPendingPrintRequest",
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("saveAppState",
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleSaveAppState,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("getInitialSettings",
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetInitialSettings,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  web_ui()->RegisterMessageCallback("printWithCloudPrintDialog",
63890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->RegisterMessageCallback("forceOpenNewTab",
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab,
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrivetPrinters",
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrivetPrinters,
645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->RegisterMessageCallback("stopGetPrivetPrinters",
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleStopGetPrivetPrinters,
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 base::Unretained(this)));
649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->RegisterMessageCallback("getPrivetPrinterCapabilities",
650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::HandleGetPrivetPrinterCapabilities,
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RegisterForMergeSession();
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::PrivetPrintingEnabled() {
65623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
6576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return true;
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return false;
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PrintPreviewHandler::preview_web_contents() const {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_ui()->GetWebContents();
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinters(const base::ListValue* /*args*/) {
6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::ListValue* results = new base::ListValue;
6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTaskAndReply(
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&EnumeratePrintersOnFileThread,
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Unretained(results)),
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SetupPrinterList,
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 base::Owned(results)));
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::HandleGetPrivetPrinters(const base::ListValue* args) {
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!PrivetPrintingEnabled())
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone");
68123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  local_discovery::ServiceDiscoverySharedClient::GetInstanceWithoutAlert(
6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&PrintPreviewHandler::StartPrivetLister,
6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 weak_factory_.GetWeakPtr()));
6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // ENABLE_SERVICE_DISCOVERY
686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleStopGetPrivetPrinters(
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
69023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (PrivetPrintingEnabled() && printer_lister_) {
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    printer_lister_->Stop();
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities(
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::ListValue* args) {
69923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string name;
701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool success = args->GetString(0, &name);
702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(success);
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreatePrivetHTTP(
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name,
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient,
707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 base::Unretained(this)));
708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(3U, args->GetSize());
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(GetSettingsDictionary(args));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int request_id = -1;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetInteger(printing::kPreviewRequestID, &request_id))
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnPrintPreviewRequest(request_id);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an additional key in order to identify |print_preview_ui| later on
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread.
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(printing::kPreviewUIID,
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       print_preview_ui->GetIDForPrintPreviewUI());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment request count.
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++regenerate_preview_request_count_;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
733ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator) {
734ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ReportUserActionHistogram(INITIATOR_CLOSED);
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnClosePrintPreviewDialog();
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the page title and url and send it to the renderer process if
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // headers and footers are to be displayed.
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool display_header_footer = false;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled,
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            &display_header_footer)) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (display_header_footer) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterTitle,
748ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                        initiator->GetTitle());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string url;
7501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    content::NavigationEntry* entry =
751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        initiator->GetController().GetLastCommittedEntry();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url = entry->GetVirtualURL().spec();
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->SetString(printing::kSettingHeaderFooterURL, url);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool generate_draft_data = false;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = settings->GetBoolean(printing::kSettingGenerateDraftData,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &generate_draft_data);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(success);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!generate_draft_data) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double draft_page_count_double = -1;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetDouble(1, &draft_page_count_double);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int draft_page_count = static_cast<int>(draft_page_count_double);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool preview_modifiable = false;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success = args->GetBoolean(2, &preview_modifiable);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(success);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (draft_page_count != -1 && preview_modifiable &&
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        print_preview_ui->GetAvailableDraftPageCount() != draft_page_count) {
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      settings->SetBoolean(printing::kSettingGenerateDraftData, true);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Print preview request start";
779ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderViewHost* rvh = initiator->GetRenderViewHost();
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before printing.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint",
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> settings(GetSettingsDictionary(args));
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!settings.get())
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReportPrintSettingsStats(*settings);
7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Never try to add headers/footers here. It's already in the generated PDF.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_to_pdf = false;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_cloud_printer = false;
802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool print_with_privet = false;
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool open_pdf_in_preview = false;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!open_pdf_in_preview) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    settings->GetBoolean(printing::kSettingPrintWithPrivet, &print_with_privet);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int page_count = 0;
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings->GetInteger(printing::kSettingPreviewPageCount, &page_count);
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_to_pdf) {
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count);
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_TO_PDF);
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintToPdf();
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (print_with_privet && PrivetPrintingEnabled()) {
827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string printer_name;
828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string print_ticket;
829effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string capabilities;
830f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet", page_count);
831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_PRIVET);
832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
833f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int width = 0;
834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int height = 0;
835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (!settings->GetString(printing::kSettingDeviceName, &printer_name) ||
836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetString(printing::kSettingTicket, &print_ticket) ||
837effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        !settings->GetString(printing::kSettingCapabilities, &capabilities) ||
838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetInteger(printing::kSettingPageWidth, &width) ||
839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !settings->GetInteger(printing::kSettingPageHeight, &height) ||
840effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        width <= 0 || height <= 0) {
841f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTREACHED();
842f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FundamentalValue http_code_value(-1);
843f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return;
845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
847effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PrintToPrivetPrinter(
848effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        printer_name, print_ticket, capabilities, gfx::Size(width, height));
849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_cloud_printer) {
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint",
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         page_count);
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT);
864868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SendCloudPrintJob(data.get());
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool system_dialog = false;
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    settings->GetBoolean(printing::kSettingShowSystemDialog, &system_dialog);
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (system_dialog) {
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", page_count);
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else {
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count);
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ReportUserActionHistogram(PRINT_TO_PRINTER);
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
876ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This tries to activate the initiator as well, so do not clear the
877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // association with the initiator yet.
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        web_ui()->GetController());
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    print_preview_ui->OnHidePreviewDialog();
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Do this so the initiator can open a new print preview dialog, while the
883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // current print preview dialog is still handling its print job.
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WebContents* initiator = GetInitiator();
8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (initiator) {
8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Save initiator IDs. |PrintingMessageFilter::OnUpdatePrintSettings|
8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // would be called when initiator info is cleared.
8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      settings->SetInteger(printing::kPreviewInitiatorHostId,
8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           initiator->GetRenderProcessHost()->GetID());
8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      settings->SetInteger(printing::kPreviewInitiatorRoutingId,
8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           initiator->GetRoutingID());
8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The PDF being printed contains only the pages that the user selected,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so ignore the page range and print all pages.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->Remove(printing::kSettingPageRange, NULL);
8991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Reset selection only flag for the same reason.
9001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    settings->SetBoolean(printing::kSettingShouldPrintSelectionOnly, false);
901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Set ID to know whether printing is for preview.
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings->SetInteger(printing::kPreviewUIID,
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         print_preview_ui->GetIDForPrintPreviewUI());
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost();
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(),
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                *settings));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // For all other cases above, the preview dialog will stay open until the
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // printing has finished. Then the dialog closes and PrintPreviewDone() gets
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // called. In the case below, since the preview dialog will be hidden and
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // not closed, we need to make this call.
913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (initiator) {
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      printing::PrintViewManager* print_view_manager =
915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          printing::PrintViewManager::FromWebContents(initiator);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print_view_manager->PrintPreviewDone();
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PrintToPdf() {
9221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!print_to_pdf_path_.empty()) {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // User has already selected a path, no need to show the dialog again.
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PostPrintToPdfTask();
925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (!select_file_dialog_.get() ||
926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             !select_file_dialog_->IsRunning(platform_util::GetTopLevel(
927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 preview_web_contents()->GetNativeView()))) {
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_ui()->GetController());
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pre-populating select file dialog with print job title.
931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 print_job_title_utf16 = print_preview_ui->initiator_title();
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title(print_job_title_utf16);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath::StringType print_job_title =
9375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(print_job_title_utf16);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::i18n::ReplaceIllegalCharactersInPath(&print_job_title, '_');
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath default_filename(print_job_title);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_filename =
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf"));
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SelectFile(default_filename);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleHidePreview(const base::ListValue* /*args*/) {
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnHidePreviewDialog();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleCancelPendingPrintRequest(
9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
957ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
958ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (initiator)
959ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ClearInitiatorDetails();
960a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  chrome::ShowPrintErrorDialog();
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleSaveAppState(const base::ListValue* args) {
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_to_save;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetString(0, &data_to_save) && !data_to_save.empty())
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreAppState(data_to_save);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinterCapabilities(
9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* args) {
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string printer_name;
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ret = args->GetString(0, &printer_name);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ret || printer_name.empty())
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetPrinterCapabilitiesSuccessCallback success_cb =
9804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendPrinterCapabilities,
9814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr());
9824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GetPrinterCapabilitiesFailureCallback failure_cb =
9834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendFailedToGetPrinterCapabilities,
9844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr());
985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          base::Bind(&GetPrinterCapabilitiesOnFileThread,
987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     printer_name,
988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     g_browser_process->GetApplicationLocale(),
989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     success_cb, failure_cb));
9904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PrintPreviewHandler::OnSigninComplete() {
9934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
9944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
9954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (print_preview_ui)
9964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    print_preview_ui->OnReloadPrintersList();
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
999e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid PrintPreviewHandler::HandleSignin(const base::ListValue* args) {
1000e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool add_account = false;
1001e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool success = args->GetBoolean(0, &add_account);
1002e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK(success);
1003e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chrome::ScopedTabbedBrowserDisplayer displayer(
10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      profile, chrome::GetActiveDesktop());
10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  print_dialog_cloud::CreateCloudPrintSigninTab(
10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      displayer.browser(),
1010e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      add_account,
10114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::OnSigninComplete,
10124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) {
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string type;
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!args->GetString(0, &type))
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!token_service_)
1020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    token_service_.reset(new AccessTokenService(this));
1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  token_service_->RequestToken(type);
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::PrintWithCloudPrintDialog() {
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user asks to print via cloud print
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instead of the print preview dialog.
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1030a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
103190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
103290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Nothing to print, no preview available.
103390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return;
103490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
103590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeWindow modal_parent = platform_util::GetTopLevel(
1037010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      preview_web_contents()->GetNativeView());
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_dialog_cloud::CreatePrintDialogForBytes(
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext(),
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      modal_parent,
1041868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      data.get(),
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      title,
1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string("application/pdf"));
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once the cloud print dialog comes up we're no longer in a background
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // printing situation.  Close the print preview.
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(abodenha@chromium.org) The flow should be changed as described in
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://code.google.com/p/chromium/issues/detail?id=44093
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleManageCloudPrint(
10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_cloud_printers_dialog_request_count_;
10560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  preview_web_contents()->OpenURL(content::OpenURLParams(
10570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      cloud_devices::GetCloudPrintRelativeURL("manage.html"),
10580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      content::Referrer(),
10590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      NEW_FOREGROUND_TAB,
10601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PAGE_TRANSITION_LINK,
10610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      false));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_BASIC_PRINTING)
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleShowSystemDialog(
10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1070ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1071ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
1075ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(this);
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->PrintForSystemDialogNow();
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the pending preview request if exists.
10801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrintPreviewUI* print_preview_ui =
10811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      static_cast<PrintPreviewUI*>(web_ui()->GetController());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnCancelPendingPreviewRequest();
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // !DISABLE_BASIC_PRINTING
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleManagePrinters(
10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++manage_printers_dialog_request_count_;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrinterManagerDialog::ShowPrinterManagerDialog();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::HandlePrintWithCloudPrintDialog(
109390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::ListValue* args) {
109490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int page_count = 0;
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!args || !args->GetInteger(0, &page_count))
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog",
109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       page_count);
109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  PrintWithCloudPrintDialog();
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleClosePreviewDialog(
11045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportStats();
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(CANCEL);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record the number of times the user requests to regenerate preview data
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // before cancelling.
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel",
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       regenerate_preview_request_count_);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ReportStats() {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters",
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_printers_dialog_request_count_);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS("PrintPreview.ManageCloudPrinters",
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       manage_cloud_printers_dialog_request_count_);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem(
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* settings) {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the measurement system based on the locale.
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode errorCode = U_ZERO_ERROR;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* locale = g_browser_process->GetApplicationLocale().c_str();
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMeasurementSystem system = ulocdata_getMeasurementSystem(locale, &errorCode);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    system = UMS_SI;
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the number formatting based on the locale and writing to
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dictionary.
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2));
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings->SetInteger(kMeasurementSystem, system);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleGetInitialSettings(
11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* /*args*/) {
1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Send before SendInitialSettings to allow cloud printer auto select.
1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SendCloudPrintEnabled();
11414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::FILE, FROM_HERE,
1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Bind(&GetDefaultPrinterOnFileThread),
11444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::SendInitialSettings,
11454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 weak_factory_.GetWeakPtr()));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrintPreviewHandler::HandleForceOpenNewTab(const base::ListValue* args) {
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string url;
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!args->GetString(0, &url))
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  Browser* browser = chrome::FindBrowserWithWebContents(GetInitiator());
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!browser)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AddSelectedTabWithURL(browser,
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                GURL(url),
11571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendInitialSettings(
11614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string& default_printer) {
11624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
11634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue initial_settings;
1166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  initial_settings.SetString(kInitiatorTitle,
1167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             print_preview_ui->initiator_title());
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingPreviewModifiable,
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              print_preview_ui->source_is_modifiable());
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetString(printing::kSettingPrinterName, default_printer);
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kDocumentHasSelection,
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->source_has_selection());
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly,
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              print_preview_ui->print_selection_only());
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext(
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
117846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (sticky_settings->printer_app_state()) {
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_settings.SetString(kAppState,
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               *sticky_settings->printer_app_state());
118146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode,
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              cmdline->HasSwitch(switches::kKioskModePrinting));
1186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  initial_settings.SetBoolean(kAppKioskMode,
1187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              chrome::IsRunningInForcedAppMode());
11884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
11894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In Win8 metro, the system print dialog can only open on the desktop.  Doing
11904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // so will cause the browser to appear hung, so we don't show the link in
11914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // metro.
11924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool is_ash = (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH);
11934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  initial_settings.SetBoolean(kHidePrintWithSystemDialogLink, is_ash);
11944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (print_preview_ui->source_is_modifiable())
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumberFormatAndMeasurementSystem(&initial_settings);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::ClosePreviewDialog() {
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui =
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<PrintPreviewUI*>(web_ui()->GetController());
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->OnClosePrintPreviewDialog();
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::SendAccessToken(const std::string& type,
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          const std::string& access_token) {
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(1) << "Get getAccessToken finished";
12105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_ui()->CallJavascriptFunction("onDidGetAccessToken",
12115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::StringValue(type),
12125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::StringValue(access_token));
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendPrinterCapabilities(
12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* settings_info) {
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities finished";
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities",
12194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                   *settings_info);
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendFailedToGetPrinterCapabilities(
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& printer_name) {
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Get printer capabilities failed";
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue printer_name_value(printer_name);
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities",
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   printer_name_value);
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void PrintPreviewHandler::SetupPrinterList(const base::ListValue* printers) {
12314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!has_logged_printers_count_) {
12324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    UMA_HISTOGRAM_COUNTS("PrintPreview.NumberOfPrinters", printers->GetSize());
12334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    has_logged_printers_count_ = true;
12344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
12354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
12364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_ui()->CallJavascriptFunction("setPrinters", *printers);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendCloudPrintEnabled() {
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext());
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) {
1244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::DictionaryValue settings;
1245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    settings.SetString(kCloudPrintUrl,
1246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       GURL(cloud_devices::GetCloudPrintURL()).spec());
1247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    settings.SetBoolean(kAppKioskMode, chrome::IsRunningInForcedAppMode());
1248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    web_ui()->CallJavascriptFunction("setUseCloudPrint", settings);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) {
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BASE64 encode the job data.
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string raw_data(reinterpret_cast<const char*>(data->front()),
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       data->size());
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string base64_data;
1257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Base64Encode(raw_data, &base64_data);
12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::StringValue data_value(base64_data);
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("printToCloud", data_value);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebContents* PrintPreviewHandler::GetInitiator() const {
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dialog_controller)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1268ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return dialog_controller->GetInitiator(preview_web_contents());
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintDialogShown() {
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintPreviewHandler::MergeSessionCompleted(
1276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& account_id,
1277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GoogleServiceAuthError& error) {
1278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  OnSigninComplete();
1279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SelectFile(const base::FilePath& default_filename) {
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo file_type_info;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions.resize(1);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Initializing |save_path_| if it is not already initialized.
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!sticky_settings->save_path()) {
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allowing IO operation temporarily. It is ok to do so here because
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the select file dialog performs IO anyway in order to display the
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // folders and also it is modal.
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ThreadRestrictions::ScopedAllowIO allow_io;
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path);
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->StoreSavePath(file_path);
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        preview_web_contents()->GetBrowserContext())->GetPrefs());
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(preview_web_contents())),
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_->SelectFile(
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_SAVEAS_FILE,
1304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16(),
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sticky_settings->save_path()->Append(default_filename),
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &file_type_info,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,
1308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::StringType(),
1309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      platform_util::GetTopLevel(preview_web_contents()->GetNativeView()),
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewDialogDestroyed() {
1314ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1315ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrintViewManager* print_view_manager =
1319ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      printing::PrintViewManager::FromWebContents(initiator);
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_view_manager->set_observer(NULL);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewFailed() {
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (reported_failed_preview_)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reported_failed_preview_ = true;
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReportUserActionHistogram(PREVIEW_FAILED);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(DISABLE_BASIC_PRINTING)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ShowSystemDialog() {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleShowSystemDialog(NULL);
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // !DISABLE_BASIC_PRINTING
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::FileSelected(const base::FilePath& path,
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int index, void* params) {
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updating |save_path_| to the newly selected folder.
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::StickySettings* sticky_settings = GetStickySettings();
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->StoreSavePath(path.DirName());
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preview_web_contents()->GetBrowserContext())->GetPrefs());
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_ui()->CallJavascriptFunction("fileSelectionCompleted");
13441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_to_pdf_path_ = path;
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PostPrintToPdfTask();
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PostPrintToPdfTask() {
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Preview data was checked before file dialog.";
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(BrowserThread::FILE,
13561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          FROM_HERE,
13571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::Bind(&PrintToPdfCallback,
13581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     data,
13591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     print_to_pdf_path_,
13601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     pdf_file_saved_closure_));
13611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  print_to_pdf_path_ = base::FilePath();
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClosePreviewDialog();
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::FileSelectionCanceled(void* params) {
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_ui()->GetController());
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print_preview_ui->OnFileSelectionCancelled();
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PrintPreviewHandler::ClearInitiatorDetails() {
1372ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WebContents* initiator = GetInitiator();
1373ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!initiator)
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1376ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // We no longer require the initiator details. Remove those details associated
1377ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // with the preview dialog to allow the initiator to create another preview
1378ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // dialog.
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  printing::PrintPreviewDialogController* dialog_controller =
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::PrintPreviewDialogController::GetInstance();
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (dialog_controller)
1382ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    dialog_controller->EraseInitiatorInfo(preview_web_contents());
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrintPreviewHandler::GetPreviewDataAndTitle(
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::RefCountedBytes>* data,
1387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* title) const {
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_ui()->GetController());
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> tmp_data;
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  print_preview_ui->GetPrintPreviewDataForIndex(
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &tmp_data);
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!tmp_data.get()) {
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Nothing to print, no preview available.
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(tmp_data->size() && tmp_data->front());
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *data = tmp_data;
1401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *title = print_preview_ui->initiator_title();
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
140523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if defined(ENABLE_SERVICE_DISCOVERY)
14061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PrintPreviewHandler::StartPrivetLister(const scoped_refptr<
14081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    local_discovery::ServiceDiscoverySharedClient>& client) {
14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!PrivetPrintingEnabled())
14101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone");
14111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
14121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = Profile::FromWebUI(web_ui());
14131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!service_discovery_client_.get() ||
14141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         service_discovery_client_.get() == client.get());
14151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_discovery_client_ = client;
14161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  printer_lister_.reset(new local_discovery::PrivetLocalPrinterLister(
14171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      service_discovery_client_.get(), profile->GetRequestContext(), this));
14181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  printer_lister_->Start();
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
14201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterChanged(
1422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool added,
1423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool has_local_printing,
1425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::DeviceDescription& description) {
142646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (has_local_printing ||
1428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos)) {
1429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::DictionaryValue info;
1430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    FillPrinterDescription(name, description, has_local_printing, &info);
1431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrinterChanged", info);
1432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterRemoved(const std::string& name) {
1436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::LocalPrinterCacheFlushed() {
1439f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::PrivetCapabilitiesUpdateClient(
1442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetUpdateClient(http_client.Pass()))
1444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_ =
1447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      privet_http_client_->CreateCapabilitiesOperation(
14485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::Bind(&PrintPreviewHandler::OnPrivetCapabilities,
14495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     base::Unretained(this)));
1450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_->Start();
1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::PrivetUpdateClient(
1454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!http_client) {
1456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(privet_http_resolution_->GetName());
1457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    privet_http_resolution_.reset();
1458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
1459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_.reset();
1462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_.reset();
1463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  privet_http_client_ =
1464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      local_discovery::PrivetV1HTTPClient::CreateDefault(http_client.Pass());
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_.reset();
1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
1469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::PrivetLocalPrintUpdateClient(
1472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string print_ticket,
1473effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string capabilities,
1474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    gfx::Size page_size,
1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!PrivetUpdateClient(http_client.Pass()))
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1479effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  StartPrivetLocalPrint(print_ticket, capabilities, page_size);
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1482effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrintPreviewHandler::StartPrivetLocalPrint(const std::string& print_ticket,
1483effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                const std::string& capabilities,
1484effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                const gfx::Size& page_size) {
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_ =
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      privet_http_client_->CreateLocalPrintOperation(this);
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->SetTicket(print_ticket);
1489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  privet_local_print_operation_->SetCapabilities(capabilities);
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<base::RefCountedBytes> data;
1492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!GetPreviewDataAndTitle(&data, &title)) {
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::FundamentalValue http_code_value(-1);
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_local_print_operation_->SetJobname(base::UTF16ToUTF8(title));
15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_local_print_operation_->SetPageSize(page_size);
15021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  privet_local_print_operation_->SetData(data.get());
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SigninManagerBase* signin_manager =
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SigninManagerFactory::GetForProfileIfExists(profile);
1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (signin_manager) {
1509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    privet_local_print_operation_->SetUsername(
1510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        signin_manager->GetAuthenticatedUsername());
1511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_local_print_operation_->Start();
1514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetCapabilities(
1518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const base::DictionaryValue* capabilities) {
15195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string name = privet_capabilities_operation_->GetHTTPClient()->GetName();
1520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!capabilities || capabilities->HasKey(local_discovery::kPrivetKeyError) ||
15221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !printer_lister_) {
1523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::DictionaryValue printer_info;
1528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const local_discovery::DeviceDescription* description =
1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_lister_->GetDeviceDescription(name);
1530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!description) {
1532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return;
1534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FillPrinterDescription(name, *description, true, &printer_info);
1537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "onPrivetCapabilitiesSet",
1540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printer_info,
1541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      *capabilities);
1542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_capabilities_operation_.reset();
1544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::SendPrivetCapabilitiesError(
1547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& device_name) {
1548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::StringValue name_value(device_name);
1549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction(
1550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "failedToGetPrivetPrinterCapabilities",
1551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      name_value);
1552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid PrintPreviewHandler::PrintToPrivetPrinter(const std::string& device_name,
1555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const std::string& ticket,
1556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const std::string& capabilities,
1557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                               const gfx::Size& page_size) {
1558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CreatePrivetHTTP(
1559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      device_name,
1560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient,
1561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 base::Unretained(this),
1562effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 ticket,
1563effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 capabilities,
1564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                 page_size));
1565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PrintPreviewHandler::CreatePrivetHTTP(
1568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetHTTPAsynchronousFactory::ResultCallback&
1570f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        callback) {
1571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const local_discovery::DeviceDescription* device_description =
15721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      printer_lister_ ? printer_lister_->GetDeviceDescription(name) : NULL;
1573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!device_description) {
1575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SendPrivetCapabilitiesError(name);
1576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
1577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_factory_ =
1580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
15811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          service_discovery_client_.get(),
1582f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          Profile::FromWebUI(web_ui())->GetRequestContext());
1583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
1584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      name, device_description->address, callback);
1585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_http_resolution_->Start();
1586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
1588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetPrintingDone(
1591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetLocalPrintOperation* print_operation) {
1592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClosePreviewDialog();
1593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::OnPrivetPrintingError(
1596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::PrivetLocalPrintOperation* print_operation,
1597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    int http_code) {
1598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::FundamentalValue http_code_value(http_code);
1599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PrintPreviewHandler::FillPrinterDescription(
1603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const std::string& name,
1604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const local_discovery::DeviceDescription& description,
1605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool has_local_printing,
1606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::DictionaryValue* printer_value) {
160746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
1608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printer_value->SetString("serviceName", name);
1610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printer_value->SetString("name", description.name);
1611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  printer_value->SetBoolean("hasLocalPrinting", has_local_printing);
16125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_value->SetBoolean(
16135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "isUnregistered",
1614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      description.id.empty() &&
1615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      command_line->HasSwitch(switches::kEnablePrintPreviewRegisterPromos));
16165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  printer_value->SetString("cloudID", description.id);
1617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
161946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // defined(ENABLE_SERVICE_DISCOVERY)
1620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1621116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintPreviewHandler::RegisterForMergeSession() {
1622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!reconcilor_);
1623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Profile* profile = Profile::FromWebUI(web_ui());
1624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (switches::IsEnableAccountConsistency() && !profile->IsOffTheRecord()) {
1625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    reconcilor_ = AccountReconcilorFactory::GetForProfile(profile);
1626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (reconcilor_)
1627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      reconcilor_->AddMergeSessionObserver(this);
1628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
1629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1631116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PrintPreviewHandler::UnregisterForMergeSession() {
1632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (reconcilor_)
1633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    reconcilor_->RemoveMergeSessionObserver(this);
1634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
16355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
16365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void PrintPreviewHandler::SetPdfSavedClosureForTesting(
16375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::Closure& closure) {
16385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pdf_file_saved_closure_ = closure;
16395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1640