15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/file_util_icu.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/number_formatting.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/linked_ptr.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/cloud_print/cloud_print_url.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_dialog_cloud.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_error_dialog.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_job_manager.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/printing/print_preview_dialog_controller.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_system_task_proxy.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/print_view_manager.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/printing/printer_manager_dialog.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/oauth2_token_service.h" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service.h" 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/print_preview/sticky_settings.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/print_messages.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_range.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_size_margins.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings.h" 65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/ulocdata.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kinaba): provide more non-intrusive way for handling local/remote 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distinction and remove these ugly #ifdef's. http://crbug.com/140425 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using printing::Metafile; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The cloud print OAuth2 scope. 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kCloudPrintAuth[] = "https://www.googleapis.com/auth/cloudprint"; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UserActionBuckets { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_TO_PRINTER, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_TO_PDF, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CANCEL, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PREVIEW_FAILED, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PREVIEW_STARTED, 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch INITIATOR_CRASHED, // UNUSED 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch INITIATOR_CLOSED, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_WITH_CLOUD_PRINT, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USERACTION_BUCKET_BOUNDARY 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintSettingsBuckets { 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LANDSCAPE = 0, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORTRAIT, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLOR, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BLACK_AND_WHITE, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COLLATE, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIMPLEX, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DUPLEX, 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TOTAL, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HEADERS_AND_FOOTERS, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CSS_BACKGROUND, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SELECTION_ONLY, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_SETTINGS_BUCKET_BOUNDARY 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum UiBucketGroups { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DESTINATION_SEARCH, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GCP_PROMO, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UI_BUCKET_GROUP_BOUNDARY 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum PrintDestinationBuckets { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DESTINATION_SHOWN, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DESTINATION_CLOSED_CHANGED, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DESTINATION_CLOSED_UNCHANGED, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIGNIN_PROMPT, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SIGNIN_TRIGGERED, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_DESTINATION_BUCKET_BOUNDARY 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum GcpPromoBuckets { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROMO_SHOWN, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROMO_CLOSED, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROMO_CLICKED, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GCP_PROMO_BUCKET_BOUNDARY 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportUserActionHistogram(enum UserActionBuckets event) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) USERACTION_BUCKET_BOUNDARY); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingHistogram(enum PrintSettingsBuckets setting) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_SETTINGS_BUCKET_BOUNDARY); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintDestinationHistogram(enum PrintDestinationBuckets event) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.DestinationAction", event, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRINT_DESTINATION_BUCKET_BOUNDARY); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportGcpPromoHistogram(enum GcpPromoBuckets event) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.GcpPromo", event, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GCP_PROMO_BUCKET_BOUNDARY); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding cloud print related data; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kAppState[] = "appState"; 160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Name of a dictionary field holding the initiator title. 161ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kInitiatorTitle[] = "initiatorTitle"; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the measurement system according to the 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// locale. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMeasurementSystem[] = "measurementSystem"; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field holding the number format according to the locale. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNumberFormat[] = "numberFormat"; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Name of a dictionary field specifying whether to print automatically in 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kiosk mode. See http://crbug.com/31395. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintAutomaticallyInKioskMode[] = "printAutomaticallyInKioskMode"; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Name of a dictionary field holding the state of selection for document. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDocumentHasSelection[] = "documentHasSelection"; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the print job settings dictionary from |args|. The caller takes 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ownership of the returned DictionaryValue. Returns NULL on failure. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* GetSettingsDictionary(const ListValue* args) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string json_str; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetString(0, &json_str)) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not read JSON argument"; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (json_str.empty()) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Empty print job settings"; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DictionaryValue> settings(static_cast<DictionaryValue*>( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONReader::Read(json_str))); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!settings.get() || !settings->IsType(Value::TYPE_DICTIONARY)) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Print job settings must be a dictionary."; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings->empty()) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Print job settings dictionary is empty"; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return settings.release(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Track the popularity of print settings and report the stats. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReportPrintSettingsStats(const DictionaryValue& settings) { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ReportPrintSettingHistogram(TOTAL); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool landscape = false; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings.GetBoolean(printing::kSettingLandscape, &landscape)) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportPrintSettingHistogram(landscape ? LANDSCAPE : PORTRAIT); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool collate = false; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings.GetBoolean(printing::kSettingCollate, &collate) && collate) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportPrintSettingHistogram(COLLATE); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int duplex_mode = 0; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings.GetInteger(printing::kSettingDuplexMode, &duplex_mode)) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportPrintSettingHistogram(duplex_mode ? DUPLEX : SIMPLEX); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int color_mode = 0; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings.GetInteger(printing::kSettingColor, &color_mode)) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportPrintSettingHistogram( 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::isColorModelSelected(color_mode) ? COLOR : BLACK_AND_WHITE); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool headers = false; 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (settings.GetBoolean(printing::kSettingHeaderFooterEnabled, &headers) && 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) headers) { 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ReportPrintSettingHistogram(HEADERS_AND_FOOTERS); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool css_background = false; 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (settings.GetBoolean(printing::kSettingShouldPrintBackgrounds, 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &css_background) && css_background) { 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ReportPrintSettingHistogram(CSS_BACKGROUND); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool selection_only = false; 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (settings.GetBoolean(printing::kSettingShouldPrintSelectionOnly, 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &selection_only) && selection_only) { 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ReportPrintSettingHistogram(SELECTION_ONLY); 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback that stores a PDF file on disk. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintToPdfCallback(Metafile* metafile, const base::FilePath& path) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile->SaveTo(path); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |metafile| must be deleted on the UI thread. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&base::DeletePointer<Metafile>, metafile)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintToPdfCallbackWithCheck(Metafile* metafile, 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) drive::FileError error, 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (error != drive::FILE_ERROR_OK) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Save to pdf failed to write: " << error; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile->SaveTo(path); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |metafile| must be deleted on the UI thread. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::UI, FROM_HERE, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&base::DeletePointer<Metafile>, metafile)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::LazyInstance<printing::StickySettings> sticky_settings = 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrintPreviewHandler::AccessTokenService 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public OAuth2TokenService::Consumer { 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit AccessTokenService(PrintPreviewHandler* handler) 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : handler_(handler) { 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RequestToken(const std::string& type) { 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (requests_.find(type) != requests_.end()) 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; // Already in progress. 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OAuth2TokenService* service = NULL; 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (type == "profile") { 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile* profile = Profile::FromWebUI(handler_->web_ui()); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (profile) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service = ProfileOAuth2TokenServiceFactory::GetForProfile(profile); 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (type == "device") { 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service = chromeos::DeviceOAuth2TokenServiceFactory::Get(); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (service) { 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OAuth2TokenService::ScopeSet oauth_scopes; 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth_scopes.insert(kCloudPrintAuth); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<OAuth2TokenService::Request> request( 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service->StartRequest(oauth_scopes, this)); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) requests_[type].reset(request.release()); 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) handler_->SendAccessToken(type, std::string()); // Unknown type. 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& access_token, 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Time& expiration_time) OVERRIDE { 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnServiceResponce(request, access_token); 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GoogleServiceAuthError& error) OVERRIDE { 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OnServiceResponce(request, std::string()); 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnServiceResponce(const OAuth2TokenService::Request* request, 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& access_token) { 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (Requests::iterator i = requests_.begin(); i != requests_.end(); ++i) { 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (i->second == request) { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) handler_->SendAccessToken(i->first, access_token); 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) requests_.erase(i); 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<std::string, 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) linked_ptr<OAuth2TokenService::Request> > Requests; 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Requests requests_; 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PrintPreviewHandler* handler_; 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AccessTokenService); 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printing::StickySettings* PrintPreviewHandler::GetStickySettings() { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sticky_settings.Pointer(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::PrintPreviewHandler() 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : print_backend_(printing::PrintBackend::CreateInstance(NULL)), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regenerate_preview_request_count_(0), 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manage_printers_dialog_request_count_(0), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manage_cloud_printers_dialog_request_count_(0), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reported_failed_preview_(false), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_logged_printers_count_(false) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportUserActionHistogram(PREVIEW_STARTED); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintPreviewHandler::~PrintPreviewHandler() { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (select_file_dialog_.get()) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_->ListenerDestroyed(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::RegisterMessages() { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("getPrinters", 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleGetPrinters, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("getPreview", 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleGetPreview, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("print", 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandlePrint, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("getPrinterCapabilities", 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleGetPrinterCapabilities, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("showSystemDialog", 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleShowSystemDialog, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("signIn", 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleSignin, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_ui()->RegisterMessageCallback("getAccessToken", 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleGetAccessToken, 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this))); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("manageCloudPrinters", 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleManageCloudPrint, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("manageLocalPrinters", 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleManagePrinters, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->RegisterMessageCallback("closePrintPreviewDialog", 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleClosePreviewDialog, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("hidePreview", 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleHidePreview, 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("cancelPendingPrintRequest", 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleCancelPendingPrintRequest, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("saveAppState", 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleSaveAppState, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("getInitialSettings", 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleGetInitialSettings, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback("reportUiEvent", 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleReportUiEvent, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) web_ui()->RegisterMessageCallback("printWithCloudPrintDialog", 40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&PrintPreviewHandler::HandlePrintWithCloudPrintDialog, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->RegisterMessageCallback("forceOpenNewTab", 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PrintPreviewHandler::HandleForceOpenNewTab, 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* PrintPreviewHandler::preview_web_contents() const { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_ui()->GetWebContents(); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinters(const ListValue* /*args*/) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PrintSystemTaskProxy> task = 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PrintSystemTaskProxy(AsWeakPtr(), 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_backend_.get(), 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_logged_printers_count_); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_logged_printers_count_ = true; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintSystemTaskProxy::EnumeratePrinters, task.get())); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetPreview(const ListValue* args) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(3U, args->GetSize()); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!settings.get()) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int request_id = -1; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!settings->GetInteger(printing::kPreviewRequestID, &request_id)) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetController()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->OnPrintPreviewRequest(request_id); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an additional key in order to identify |print_preview_ui| later on 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when calling PrintPreviewUI::GetCurrentPrintPreviewStatus() on the IO 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // thread. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetInteger(printing::kPreviewUIID, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->GetIDForPrintPreviewUI()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Increment request count. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++regenerate_preview_request_count_; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 448ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* initiator = GetInitiator(); 449ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!initiator) { 450ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ReportUserActionHistogram(INITIATOR_CLOSED); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->OnClosePrintPreviewDialog(); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve the page title and url and send it to the renderer process if 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // headers and footers are to be displayed. 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool display_header_footer = false; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!settings->GetBoolean(printing::kSettingHeaderFooterEnabled, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &display_header_footer)) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (display_header_footer) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetString(printing::kSettingHeaderFooterTitle, 464ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch initiator->GetTitle()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url; 466ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch NavigationEntry* entry = initiator->GetController().GetActiveEntry(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = entry->GetVirtualURL().spec(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetString(printing::kSettingHeaderFooterURL, url); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool generate_draft_data = false; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = settings->GetBoolean(printing::kSettingGenerateDraftData, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &generate_draft_data); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(success); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!generate_draft_data) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double draft_page_count_double = -1; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = args->GetDouble(1, &draft_page_count_double); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(success); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int draft_page_count = static_cast<int>(draft_page_count_double); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool preview_modifiable = false; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = args->GetBoolean(2, &preview_modifiable); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(success); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (draft_page_count != -1 && preview_modifiable && 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->GetAvailableDraftPageCount() != draft_page_count) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetBoolean(printing::kSettingGenerateDraftData, true); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Print preview request start"; 494ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RenderViewHost* rvh = initiator->GetRenderViewHost(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->Send(new PrintMsg_PrintPreview(rvh->GetRoutingID(), *settings)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandlePrint(const ListValue* args) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportStats(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record the number of times the user requests to regenerate preview data 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before printing. 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforePrint", 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regenerate_preview_request_count_); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 506ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* initiator = GetInitiator(); 507ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (initiator) { 508ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RenderViewHost* rvh = initiator->GetRenderViewHost(); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->GetRoutingID())); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!settings.get()) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Never try to add headers/footers here. It's already in the generated PDF. 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool print_to_pdf = false; 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_cloud_printer = false; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool open_pdf_in_preview = false; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!open_pdf_in_preview) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int page_count = 0; 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->GetInteger(printing::kSettingPreviewPageCount, &page_count); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (print_to_pdf) { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReportUserActionHistogram(PRINT_TO_PDF); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintToPdf(); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> data; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 title; 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetPreviewDataAndTitle(&data, &title)) { 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Nothing to print, no preview available. 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_cloud_printer) { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint", 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) page_count); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReportUserActionHistogram(PRINT_WITH_CLOUD_PRINT); 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SendCloudPrintJob(data.get()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPrinter", page_count); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportUserActionHistogram(PRINT_TO_PRINTER); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReportPrintSettingsStats(*settings); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 559ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // This tries to activate the initiator as well, so do not clear the 560ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // association with the initiator yet. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetController()); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->OnHidePreviewDialog(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // Do this so the initiator can open a new print preview dialog, while the 566ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // current print preview dialog is still handling its print job. 567ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearInitiatorDetails(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The PDF being printed contains only the pages that the user selected, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so ignore the page range and print all pages. 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->Remove(printing::kSettingPageRange, NULL); 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove selection only flag for the same reason. 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) settings->Remove(printing::kSettingShouldPrintSelectionOnly, NULL); 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set ID to know whether printing is for preview. 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->SetInteger(printing::kPreviewUIID, 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->GetIDForPrintPreviewUI()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = preview_web_contents()->GetRenderViewHost(); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->GetRoutingID(), 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *settings)); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For all other cases above, the preview dialog will stay open until the 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // printing has finished. Then the dialog closes and PrintPreviewDone() gets 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // called. In the case below, since the preview dialog will be hidden and 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not closed, we need to make this call. 586ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (initiator) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrintViewManager* print_view_manager = 588ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch printing::PrintViewManager::FromWebContents(initiator); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_view_manager->PrintPreviewDone(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PrintToPdf() { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (print_to_pdf_path_.get()) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // User has already selected a path, no need to show the dialog again. 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostPrintToPdfTask(); 598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (!select_file_dialog_.get() || 599868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) !select_file_dialog_->IsRunning(platform_util::GetTopLevel( 600868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) preview_web_contents()->GetView()->GetNativeView()))) { 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->GetController()); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pre-populating select file dialog with print job title. 604ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch string16 print_job_title_utf16 = print_preview_ui->initiator_title(); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType print_job_title(print_job_title_utf16); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::StringType print_job_title = 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UTF16ToUTF8(print_job_title_utf16); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_'); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath default_filename(print_job_title); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_filename = 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf")); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectFile(default_filename); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleHidePreview(const ListValue* /*args*/) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetController()); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->OnHidePreviewDialog(); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleCancelPendingPrintRequest( 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* /*args*/) { 630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* initiator = GetInitiator(); 631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (initiator) 632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ClearInitiatorDetails(); 633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch gfx::NativeWindow parent = initiator ? 634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch initiator->GetView()->GetTopLevelNativeWindow() : 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowPrintErrorDialog(parent); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleSaveAppState(const ListValue* args) { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string data_to_save; 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::StickySettings* sticky_settings = GetStickySettings(); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (args->GetString(0, &data_to_save) && !data_to_save.empty()) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->StoreAppState(data_to_save); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->SaveInPrefs(Profile::FromBrowserContext( 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext())->GetPrefs()); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetPrinterCapabilities(const ListValue* args) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string printer_name; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = args->GetString(0, &printer_name); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ret || printer_name.empty()) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PrintSystemTaskProxy> task = 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PrintSystemTaskProxy(AsWeakPtr(), 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_backend_.get(), 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_logged_printers_count_); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintSystemTaskProxy::GetPrinterCapabilities, task.get(), 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer_name)); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnSigninComplete( 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<PrintPreviewHandler>& handler) { 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handler.get()) { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PrintPreviewUI*>(handler->web_ui()->GetController()); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (print_preview_ui) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->OnReloadPrintersList(); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleSignin(const ListValue* /*args*/) { 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow modal_parent = platform_util::GetTopLevel( 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preview_web_contents()->GetView()->GetNativeView()); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_cloud::CreateCloudPrintSigninDialog( 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext(), 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modal_parent, 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintPreviewHandler::OnSigninComplete, AsWeakPtr())); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::HandleGetAccessToken(const base::ListValue* args) { 686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string type; 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!args->GetString(0, &type)) 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!token_service_) 690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) token_service_.reset(new AccessTokenService(this)); 691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) token_service_->RequestToken(type); 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::PrintWithCloudPrintDialog() { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record the number of times the user asks to print via cloud print 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead of the print preview dialog. 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportStats(); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> data; 70090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) string16 title; 70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!GetPreviewDataAndTitle(&data, &title)) { 70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Nothing to print, no preview available. 70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 70490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow modal_parent = platform_util::GetTopLevel( 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preview_web_contents()->GetView()->GetNativeView()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_cloud::CreatePrintDialogForBytes( 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext(), 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modal_parent, 711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) data.get(), 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) title, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("application/pdf")); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Once the cloud print dialog comes up we're no longer in a background 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // printing situation. Close the print preview. 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(abodenha@chromium.org) The flow should be changed as described in 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=44093 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClosePreviewDialog(); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleManageCloudPrint(const ListValue* /*args*/) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++manage_cloud_printers_dialog_request_count_; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext()); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->OpenURL( 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpenURLParams( 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURL(profile).GetCloudPrintServiceManageURL(), 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Referrer(), 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NEW_FOREGROUND_TAB, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* /*args*/) { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportStats(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportUserActionHistogram(FALLBACK_TO_ADVANCED_SETTINGS_DIALOG); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 740ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* initiator = GetInitiator(); 741ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!initiator) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrintViewManager* print_view_manager = 745ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch printing::PrintViewManager::FromWebContents(initiator); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_view_manager->set_observer(this); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_view_manager->PrintForSystemDialogNow(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the pending preview request if exists. 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetController()); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->OnCancelPendingPreviewRequest(); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleManagePrinters(const ListValue* /*args*/) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++manage_printers_dialog_request_count_; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrinterManagerDialog::ShowPrinterManagerDialog(); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PrintPreviewHandler::HandlePrintWithCloudPrintDialog( 76190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::ListValue* args) { 76290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int page_count = 0; 76390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!args || !args->GetInteger(0, &page_count)) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog", 76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) page_count); 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PrintWithCloudPrintDialog(); 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::HandleClosePreviewDialog(const ListValue* /*args*/) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportStats(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportUserActionHistogram(CANCEL); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record the number of times the user requests to regenerate preview data 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before cancelling. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.RegeneratePreviewRequest.BeforeCancel", 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regenerate_preview_request_count_); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ReportStats() { 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters", 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manage_printers_dialog_request_count_); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.ManageCloudPrinters", 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manage_cloud_printers_dialog_request_count_); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::GetNumberFormatAndMeasurementSystem( 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* settings) { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Getting the measurement system based on the locale. 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UErrorCode errorCode = U_ZERO_ERROR; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* locale = g_browser_process->GetApplicationLocale().c_str(); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMeasurementSystem system = ulocdata_getMeasurementSystem(locale, &errorCode); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (errorCode > U_ZERO_ERROR || system == UMS_LIMIT) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system = UMS_SI; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Getting the number formatting based on the locale and writing to 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dictionary. 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetString(kNumberFormat, base::FormatDouble(123456.78, 2)); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->SetInteger(kMeasurementSystem, system); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleGetInitialSettings(const ListValue* /*args*/) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PrintSystemTaskProxy> task = 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PrintSystemTaskProxy(AsWeakPtr(), 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_backend_.get(), 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_logged_printers_count_); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask( 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::FILE, FROM_HERE, 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintSystemTaskProxy::GetDefaultPrinter, task.get())); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendCloudPrintEnabled(); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::HandleReportUiEvent(const ListValue* args) { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int event_group, event_number; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!args->GetInteger(0, &event_group) || !args->GetInteger(1, &event_number)) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum UiBucketGroups ui_bucket_group = 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<enum UiBucketGroups>(event_group); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ui_bucket_group >= UI_BUCKET_GROUP_BOUNDARY) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ui_bucket_group) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DESTINATION_SEARCH: { 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PrintDestinationBuckets event = 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<enum PrintDestinationBuckets>(event_number); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event >= PRINT_DESTINATION_BUCKET_BOUNDARY) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportPrintDestinationHistogram(event); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case GCP_PROMO: { 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum GcpPromoBuckets event = 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<enum GcpPromoBuckets>(event_number); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event >= GCP_PROMO_BUCKET_BOUNDARY) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportGcpPromoHistogram(event); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::HandleForceOpenNewTab(const ListValue* args) { 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string url; 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!args->GetString(0, &url)) 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 851ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch Browser* browser = chrome::FindBrowserWithWebContents(GetInitiator()); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::AddSelectedTabWithURL(browser, 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL(url), 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::PAGE_TRANSITION_LINK); 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendInitialSettings( 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& default_printer, 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cloud_print_data) { 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetController()); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue initial_settings; 866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch initial_settings.SetString(kInitiatorTitle, 867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch print_preview_ui->initiator_title()); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_settings.SetBoolean(printing::kSettingPreviewModifiable, 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->source_is_modifiable()); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initial_settings.SetString(printing::kSettingPrinterName, default_printer); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initial_settings.SetBoolean(kDocumentHasSelection, 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->source_has_selection()); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly, 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->print_selection_only()); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::StickySettings* sticky_settings = GetStickySettings(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->RestoreFromPrefs(Profile::FromBrowserContext( 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext())->GetPrefs()); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sticky_settings->printer_app_state()) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_settings.SetString(kAppState, 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *sticky_settings->printer_app_state()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* cmdline = CommandLine::ForCurrentProcess(); 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initial_settings.SetBoolean(kPrintAutomaticallyInKioskMode, 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cmdline->HasSwitch(switches::kKioskModePrinting)); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (print_preview_ui->source_is_modifiable()) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNumberFormatAndMeasurementSystem(&initial_settings); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("setInitialSettings", initial_settings); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::ClosePreviewDialog() { 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintPreviewUI* print_preview_ui = 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<PrintPreviewUI*>(web_ui()->GetController()); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->OnClosePrintPreviewDialog(); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PrintPreviewHandler::SendAccessToken(const std::string& type, 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& access_token) { 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "Get getAccessToken finished"; 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_ui()->CallJavascriptFunction("onDidGetAccessToken", StringValue(type), 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringValue(access_token)); 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendPrinterCapabilities( 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue& settings_info) { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Get printer capabilities finished"; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("updateWithPrinterCapabilities", 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_info); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendFailedToGetPrinterCapabilities( 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& printer_name) { 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Get printer capabilities failed"; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringValue printer_name_value(printer_name); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("failedToGetPrinterCapabilities", 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer_name_value); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SetupPrinterList(const ListValue& printers) { 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("setPrinters", printers); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::SendCloudPrintEnabled() { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromBrowserContext( 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext()); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled)) { 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gcp_url(CloudPrintURL(profile).GetCloudPrintServiceURL()); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::StringValue gcp_url_value(gcp_url.spec()); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("setUseCloudPrint", gcp_url_value); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SendCloudPrintJob(const base::RefCountedBytes* data) { 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BASE64 encode the job data. 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string raw_data(reinterpret_cast<const char*>(data->front()), 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data->size()); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string base64_data; 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::Base64Encode(raw_data, &base64_data)) { 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Base64 encoding PDF data."; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringValue data_value(base64_data); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->CallJavascriptFunction("printToCloud", data_value); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 947ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochWebContents* PrintPreviewHandler::GetInitiator() const { 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController* dialog_controller = 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController::GetInstance(); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dialog_controller) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 952ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return dialog_controller->GetInitiator(preview_web_contents()); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintDialogShown() { 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClosePreviewDialog(); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::SelectFile(const base::FilePath& default_filename) { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::FileTypeInfo file_type_info; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_type_info.extensions.resize(1); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf")); 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_type_info.support_drive = true; 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializing save_path_ if it is not already initialized. 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::StickySettings* sticky_settings = GetStickySettings(); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sticky_settings->save_path()) { 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allowing IO operation temporarily. It is ok to do so here because 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the select file dialog performs IO anyway in order to display the 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // folders and also it is modal. 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_io; 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_USER_DOCUMENTS, &file_path); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->StoreSavePath(file_path); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->SaveInPrefs(Profile::FromBrowserContext( 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext())->GetPrefs()); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_ = ui::SelectFileDialog::Create( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, new ChromeSelectFilePolicy(preview_web_contents())), 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_file_dialog_->SelectFile( 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::SELECT_SAVEAS_FILE, 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(), 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->save_path()->Append(default_filename), 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &file_type_info, 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath::StringType(), 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) platform_util::GetTopLevel( 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) preview_web_contents()->GetView()->GetNativeView()), 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewDialogDestroyed() { 994ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* initiator = GetInitiator(); 995ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!initiator) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrintViewManager* print_view_manager = 999ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch printing::PrintViewManager::FromWebContents(initiator); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_view_manager->set_observer(NULL); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::OnPrintPreviewFailed() { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reported_failed_preview_) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reported_failed_preview_ = true; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportUserActionHistogram(PREVIEW_FAILED); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::ShowSystemDialog() { 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleShowSystemDialog(NULL); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::FileSelected(const base::FilePath& path, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, void* params) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updating |save_path_| to the newly selected folder. 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::StickySettings* sticky_settings = GetStickySettings(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->StoreSavePath(path.DirName()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sticky_settings->SaveInPrefs(Profile::FromBrowserContext( 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preview_web_contents()->GetBrowserContext())->GetPrefs()); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->CallJavascriptFunction("fileSelectionCompleted"); 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_to_pdf_path_.reset(new base::FilePath(path)); 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostPrintToPdfTask(); 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintPreviewHandler::PostPrintToPdfTask() { 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> data; 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 title; 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!GetPreviewDataAndTitle(&data, &title)) { 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Preview data was checked before file dialog."; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PreviewMetafile* metafile = new printing::PreviewMetafile; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile->InitFromData(static_cast<const void*>(data->front()), data->size()); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrintToPdfCallback takes ownership of |metafile|. 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drive::util::PrepareWritableFileAndRun( 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(preview_web_contents()->GetBrowserContext()), 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *print_to_pdf_path_, 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintToPdfCallbackWithCheck, metafile)); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PrintToPdfCallback, metafile, 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *print_to_pdf_path_)); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_to_pdf_path_.reset(); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClosePreviewDialog(); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintPreviewHandler::FileSelectionCanceled(void* params) { 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->GetController()); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_preview_ui->OnFileSelectionCancelled(); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1058ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid PrintPreviewHandler::ClearInitiatorDetails() { 1059ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch WebContents* initiator = GetInitiator(); 1060ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!initiator) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1063ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // We no longer require the initiator details. Remove those details associated 1064ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // with the preview dialog to allow the initiator to create another preview 1065ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // dialog. 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController* dialog_controller = 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController::GetInstance(); 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dialog_controller) 1069ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch dialog_controller->EraseInitiatorInfo(preview_web_contents()); 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool PrintPreviewHandler::GetPreviewDataAndTitle( 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes>* data, 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16* title) const { 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>( 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui()->GetController()); 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::RefCountedBytes> tmp_data; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) print_preview_ui->GetPrintPreviewDataForIndex( 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::COMPLETE_PREVIEW_DOCUMENT_INDEX, &tmp_data); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!tmp_data.get()) { 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Nothing to print, no preview available. 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(tmp_data->size() && tmp_data->front()); 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *data = tmp_data; 1088ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *title = print_preview_ui->initiator_title(); 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092