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