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