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