Partial cleanup use of base::Value in printing backend.

Bug: 660612
Change-Id: I75404c19cf794abee8eff74e78005226139682b9
Reviewed-on: https://chromium-review.googlesource.com/c/1387467
Reviewed-by: Rebekah Potter <[email protected]>
Reviewed-by: Jan Wilken Dörrie <[email protected]>
Commit-Queue: Vladislav Kuzkokov <[email protected]>
Cr-Commit-Position: refs/heads/master@{#623194}
diff --git a/chrome/browser/printing/print_job_worker.cc b/chrome/browser/printing/print_job_worker.cc
index 1e2d43f..49f5881 100644
--- a/chrome/browser/printing/print_job_worker.cc
+++ b/chrome/browser/printing/print_job_worker.cc
@@ -211,8 +211,7 @@
   }
 }
 
-void PrintJobWorker::SetSettings(
-    std::unique_ptr<base::DictionaryValue> new_settings) {
+void PrintJobWorker::SetSettings(base::Value new_settings) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(query_);
 
@@ -239,11 +238,10 @@
 }
 #endif
 
-void PrintJobWorker::UpdatePrintSettings(
-    std::unique_ptr<base::DictionaryValue> new_settings) {
+void PrintJobWorker::UpdatePrintSettings(base::Value new_settings) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PrintingContext::Result result =
-      printing_context_->UpdatePrintSettings(*new_settings);
+      printing_context_->UpdatePrintSettings(std::move(new_settings));
   GetSettingsDone(result);
 }
 
diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h
index 182f756..95341c40 100644
--- a/chrome/browser/printing/print_job_worker.h
+++ b/chrome/browser/printing/print_job_worker.h
@@ -11,6 +11,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/printing/printer_query.h"
 #include "content/public/browser/browser_thread.h"
@@ -18,10 +19,6 @@
 #include "printing/print_job_constants.h"
 #include "printing/printing_context.h"
 
-namespace base {
-class DictionaryValue;
-}
-
 namespace printing {
 
 class PrintJob;
@@ -57,7 +54,7 @@
                    bool is_modifiable);
 
   // Set the new print settings from a dictionary value.
-  void SetSettings(std::unique_ptr<base::DictionaryValue> new_settings);
+  void SetSettings(base::Value new_settings);
 
 #if defined(OS_CHROMEOS)
   // Set the new print settings from a POD type.
@@ -139,7 +136,7 @@
       bool is_scripted);
 
   // Called on the UI thread to update the print settings.
-  void UpdatePrintSettings(std::unique_ptr<base::DictionaryValue> new_settings);
+  void UpdatePrintSettings(base::Value new_settings);
 
 #if defined(OS_CHROMEOS)
   // Called on the UI thread to update the print settings.
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index 620c890..73419c0 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -78,12 +78,11 @@
 }
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
-void CreateQueryWithSettings(
-    std::unique_ptr<base::DictionaryValue> job_settings,
-    int render_process_id,
-    int render_frame_id,
-    scoped_refptr<PrintQueriesQueue> queue,
-    PrintSettingsCallback callback) {
+void CreateQueryWithSettings(base::Value job_settings,
+                             int render_process_id,
+                             int render_frame_id,
+                             scoped_refptr<PrintQueriesQueue> queue,
+                             PrintSettingsCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   scoped_refptr<printing::PrinterQuery> printer_query =
       queue->CreatePrinterQuery(render_process_id, render_frame_id);
@@ -133,16 +132,15 @@
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 void PrintViewManagerBase::PrintForPrintPreview(
-    std::unique_ptr<base::DictionaryValue> job_settings,
-    const scoped_refptr<base::RefCountedMemory>& print_data,
+    base::Value job_settings,
+    scoped_refptr<base::RefCountedMemory> print_data,
     content::RenderFrameHost* rfh,
     PrinterHandler::PrintCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  int page_count;
-  job_settings->GetInteger(kSettingPreviewPageCount, &page_count);
   PrintSettingsCallback settings_callback =
       base::BindOnce(&PrintViewManagerBase::OnPrintSettingsDone,
-                     weak_ptr_factory_.GetWeakPtr(), print_data, page_count,
+                     weak_ptr_factory_.GetWeakPtr(), print_data,
+                     job_settings.FindIntKey(kSettingPreviewPageCount).value(),
                      std::move(callback));
   base::PostTaskWithTraits(
       FROM_HERE, {content::BrowserThread::IO},
diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h
index fa8d5a17..a2569836 100644
--- a/chrome/browser/printing/print_view_manager_base.h
+++ b/chrome/browser/printing/print_view_manager_base.h
@@ -55,11 +55,10 @@
   // |job_settings|. Runs |callback| with an error string on failure and with an
   // empty string if the print job is started successfully. |rfh| is the render
   // frame host for the preview initiator contents respectively.
-  void PrintForPrintPreview(
-      std::unique_ptr<base::DictionaryValue> job_settings,
-      const scoped_refptr<base::RefCountedMemory>& print_data,
-      content::RenderFrameHost* rfh,
-      PrinterHandler::PrintCallback callback);
+  void PrintForPrintPreview(base::Value job_settings,
+                            scoped_refptr<base::RefCountedMemory> print_data,
+                            content::RenderFrameHost* rfh,
+                            PrinterHandler::PrintCallback callback);
 #endif
 
   // Whether printing is enabled or not.
diff --git a/chrome/browser/printing/print_view_manager_unittest.cc b/chrome/browser/printing/print_view_manager_unittest.cc
index 9591235..470c8e2 100644
--- a/chrome/browser/printing/print_view_manager_unittest.cc
+++ b/chrome/browser/printing/print_view_manager_unittest.cc
@@ -135,17 +135,13 @@
   print_view_manager->PrintPreviewNow(web_contents->GetMainFrame(), false);
 
   base::Value print_ticket = GetPrintTicket(printing::kLocalPrinter, false);
-  std::unique_ptr<base::DictionaryValue> job_settings =
-      base::DictionaryValue::From(
-          base::Value::ToUniquePtrValue(std::move(print_ticket)));
-
   const char kTestData[] = "abc";
   auto print_data = base::MakeRefCounted<base::RefCountedStaticMemory>(
       kTestData, sizeof(kTestData));
   PrinterHandler::PrintCallback callback =
       base::BindOnce(&TestPrintViewManager::FakePrintCallback,
                      base::Unretained(print_view_manager.get()));
-  print_view_manager->PrintForPrintPreview(std::move(job_settings), print_data,
+  print_view_manager->PrintForPrintPreview(std::move(print_ticket), print_data,
                                            web_contents->GetMainFrame(),
                                            std::move(callback));
   print_view_manager->WaitForCallback();
diff --git a/chrome/browser/printing/printer_query.cc b/chrome/browser/printing/printer_query.cc
index 09f8e164..06461a0 100644
--- a/chrome/browser/printing/printer_query.cc
+++ b/chrome/browser/printing/printer_query.cc
@@ -97,9 +97,8 @@
                      has_selection, margin_type, is_scripted, is_modifiable));
 }
 
-void PrinterQuery::SetSettings(
-    std::unique_ptr<base::DictionaryValue> new_settings,
-    base::OnceClosure callback) {
+void PrinterQuery::SetSettings(base::Value new_settings,
+                               base::OnceClosure callback) {
   StartWorker(std::move(callback));
 
   worker_->PostTask(FROM_HERE, base::BindOnce(&PrintJobWorker::SetSettings,
diff --git a/chrome/browser/printing/printer_query.h b/chrome/browser/printing/printer_query.h
index 64db84f..3b17390 100644
--- a/chrome/browser/printing/printer_query.h
+++ b/chrome/browser/printing/printer_query.h
@@ -10,12 +10,12 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/values.h"
 #include "printing/print_job_constants.h"
 #include "printing/print_settings.h"
 #include "printing/printing_context.h"
 
 namespace base {
-class DictionaryValue;
 class Location;
 class SequencedTaskRunner;
 }
@@ -60,7 +60,7 @@
                    base::OnceClosure callback);
 
   // Updates the current settings with |new_settings| dictionary values.
-  virtual void SetSettings(std::unique_ptr<base::DictionaryValue> new_settings,
+  virtual void SetSettings(base::Value new_settings,
                            base::OnceClosure callback);
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc
index e415483..8cf82aaf 100644
--- a/chrome/browser/printing/printing_message_filter.cc
+++ b/chrome/browser/printing/printing_message_filter.cc
@@ -305,11 +305,9 @@
 }
 #endif
 
-void PrintingMessageFilter::OnUpdatePrintSettings(
-    int document_cookie, const base::DictionaryValue& job_settings,
-    IPC::Message* reply_msg) {
-  std::unique_ptr<base::DictionaryValue> new_settings(job_settings.DeepCopy());
-
+void PrintingMessageFilter::OnUpdatePrintSettings(int document_cookie,
+                                                  base::Value job_settings,
+                                                  IPC::Message* reply_msg) {
   scoped_refptr<PrinterQuery> printer_query;
   if (!is_printing_enabled_.GetValue()) {
     // Reply with NULL query.
@@ -322,7 +320,7 @@
         content::ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE);
   }
   printer_query->SetSettings(
-      std::move(new_settings),
+      std::move(job_settings),
       base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsReply, this,
                  printer_query, reply_msg));
 }
diff --git a/chrome/browser/printing/printing_message_filter.h b/chrome/browser/printing/printing_message_filter.h
index a881a85..63b71257 100644
--- a/chrome/browser/printing/printing_message_filter.h
+++ b/chrome/browser/printing/printing_message_filter.h
@@ -11,6 +11,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "components/keyed_service/core/keyed_service_shutdown_notifier.h"
 #include "components/prefs/pref_member.h"
@@ -22,12 +23,11 @@
 struct PrintHostMsg_ScriptedPrint_Params;
 class Profile;
 
-namespace base {
-class DictionaryValue;
 #if defined(OS_ANDROID)
+namespace base {
 struct FileDescriptor;
-#endif
 }
+#endif
 
 namespace printing {
 
@@ -88,7 +88,7 @@
   // handled by the print worker thread and the UI thread. The reply occurs on
   // the IO thread.
   void OnUpdatePrintSettings(int document_cookie,
-                             const base::DictionaryValue& job_settings,
+                             base::Value job_settings,
                              IPC::Message* reply_msg);
   void OnUpdatePrintSettingsReply(scoped_refptr<PrinterQuery> printer_query,
                                   IPC::Message* reply_msg);
diff --git a/chrome/browser/printing/test_printer_query.cc b/chrome/browser/printing/test_printer_query.cc
index 7234d78..6d26be12 100644
--- a/chrome/browser/printing/test_printer_query.cc
+++ b/chrome/browser/printing/test_printer_query.cc
@@ -47,9 +47,8 @@
 
 TestPrinterQuery::~TestPrinterQuery() {}
 
-void TestPrinterQuery::SetSettings(
-    std::unique_ptr<base::DictionaryValue> new_settings,
-    base::OnceClosure callback) {
+void TestPrinterQuery::SetSettings(base::Value new_settings,
+                                   base::OnceClosure callback) {
   DCHECK(offsets_);
 #if defined(OS_WIN)
   DCHECK(printer_type_);
@@ -57,7 +56,7 @@
   set_callback(std::move(callback));
   PrintSettings settings;
   PrintingContext::Result result =
-      PrintSettingsFromJobSettings(*new_settings, &settings)
+      PrintSettingsFromJobSettings(new_settings, &settings)
           ? PrintingContext::OK
           : PrintingContext::FAILED;
 
diff --git a/chrome/browser/printing/test_printer_query.h b/chrome/browser/printing/test_printer_query.h
index 934fc99d..9bc62d1 100644
--- a/chrome/browser/printing/test_printer_query.h
+++ b/chrome/browser/printing/test_printer_query.h
@@ -9,14 +9,11 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/printing/print_job_manager.h"
 #include "chrome/browser/printing/printer_query.h"
 
-namespace base {
-class DictionaryValue;
-}
-
 namespace printing {
 
 class TestPrintQueriesQueue : public PrintQueriesQueue {
@@ -60,7 +57,7 @@
   // Updates the current settings with |new_settings| dictionary values. Also
   // fills in the settings with values from |offsets_| and |printer_type_| that
   // would normally be filled in by the PrintingContext.
-  void SetSettings(std::unique_ptr<base::DictionaryValue> new_settings,
+  void SetSettings(base::Value new_settings,
                    base::OnceClosure callback) override;
 
 #if defined(OS_WIN)
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
index 1504269..81bd450 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/bind_helpers.h"
+#include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/task/post_task.h"
@@ -239,9 +240,10 @@
     PrintCallback callback) {
   size_t size_in_kb = print_data->size() / 1024;
   UMA_HISTOGRAM_MEMORY_KB("Printing.CUPS.PrintDocumentSize", size_in_kb);
-
-  StartLocalPrint(ticket_json, print_data, preview_web_contents_,
-                  std::move(callback));
+  std::unique_ptr<base::Value> job_settings =
+      base::JSONReader::Read(ticket_json);
+  StartLocalPrint(base::Value::FromUniquePtrValue(std::move(job_settings)),
+                  print_data, preview_web_contents_, std::move(callback));
 }
 
 }  // namespace printing
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
index dc23201..8b767a7c 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -7,8 +7,10 @@
 #include <string>
 #include <utility>
 
+#include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/ref_counted_memory.h"
 #include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "build/build_config.h"
@@ -124,8 +126,10 @@
     const gfx::Size& page_size,
     const scoped_refptr<base::RefCountedMemory>& print_data,
     PrintCallback callback) {
-  StartLocalPrint(ticket_json, print_data, preview_web_contents_,
-                  std::move(callback));
+  std::unique_ptr<base::Value> job_settings =
+      base::JSONReader::Read(ticket_json);
+  StartLocalPrint(base::Value::FromUniquePtrValue(std::move(job_settings)),
+                  print_data, preview_web_contents_, std::move(callback));
 }
 
 }  // namespace printing
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
index 48eca940..8bcf51f 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
@@ -9,7 +9,6 @@
 #include <utility>
 #include <vector>
 
-#include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/stl_util.h"
@@ -180,17 +179,10 @@
   std::move(done_callback).Run();
 }
 
-void StartLocalPrint(const std::string& ticket_json,
-                     const scoped_refptr<base::RefCountedMemory>& print_data,
+void StartLocalPrint(base::Value job_settings,
+                     scoped_refptr<base::RefCountedMemory> print_data,
                      content::WebContents* preview_web_contents,
                      PrinterHandler::PrintCallback callback) {
-  std::unique_ptr<base::DictionaryValue> job_settings =
-      base::DictionaryValue::From(base::JSONReader::Read(ticket_json));
-  if (!job_settings) {
-    std::move(callback).Run(base::Value("Invalid settings"));
-    return;
-  }
-
   // Get print view manager.
   PrintPreviewDialogController* dialog_controller =
       PrintPreviewDialogController::GetInstance();
@@ -204,11 +196,8 @@
     return;
   }
 
-  bool system_dialog = false;
-  job_settings->GetBoolean(kSettingShowSystemDialog, &system_dialog);
-  bool open_in_pdf = false;
-  job_settings->GetBoolean(kSettingOpenPDFInPreview, &open_in_pdf);
-  if (system_dialog || open_in_pdf) {
+  if (job_settings.FindBoolKey(kSettingShowSystemDialog).value_or(false) ||
+      job_settings.FindBoolKey(kSettingOpenPDFInPreview).value_or(false)) {
     // Run the callback early, or the modal dialogs will prevent the preview
     // from closing until they do.
     std::move(callback).Run(base::Value());
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.h b/chrome/browser/ui/webui/print_preview/print_preview_utils.h
index 92016d22..ed8a23fa 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_utils.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.h
@@ -41,9 +41,9 @@
     const base::DictionaryValue& cdd);
 
 // Starts a local print of |print_data| with print settings dictionary
-// |ticket_json|. Runs |callback| on failure or success.
-void StartLocalPrint(const std::string& ticket_json,
-                     const scoped_refptr<base::RefCountedMemory>& print_data,
+// |job_settings|. Runs |callback| on failure or success.
+void StartLocalPrint(base::Value job_settings,
+                     scoped_refptr<base::RefCountedMemory> print_data,
                      content::WebContents* preview_web_contents,
                      PrinterHandler::PrintCallback callback);
 
diff --git a/printing/print_settings_conversion.cc b/printing/print_settings_conversion.cc
index 0bdc246..4ae32548 100644
--- a/printing/print_settings_conversion.cc
+++ b/printing/print_settings_conversion.cc
@@ -17,7 +17,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "printing/page_size_margins.h"
 #include "printing/print_job_constants.h"
 #include "printing/print_settings.h"
 #include "printing/units.h"
@@ -26,20 +25,21 @@
 
 namespace {
 
-void GetCustomMarginsFromJobSettings(const base::DictionaryValue& settings,
-                                     PageSizeMargins* page_size_margins) {
-  const base::DictionaryValue* custom_margins;
-  if (!settings.GetDictionary(kSettingMarginsCustom, &custom_margins) ||
-      !custom_margins->GetDouble(kSettingMarginTop,
-                                 &page_size_margins->margin_top) ||
-      !custom_margins->GetDouble(kSettingMarginBottom,
-                                 &page_size_margins->margin_bottom) ||
-      !custom_margins->GetDouble(kSettingMarginLeft,
-                                 &page_size_margins->margin_left) ||
-      !custom_margins->GetDouble(kSettingMarginRight,
-                                 &page_size_margins->margin_right)) {
+void GetCustomMarginsFromJobSettings(const base::Value& settings,
+                                     PageMargins* page_size_margins) {
+  const base::Value* custom_margins = settings.FindKey(kSettingMarginsCustom);
+  if (!custom_margins) {
     NOTREACHED();
+    return;
   }
+  page_size_margins->top =
+      custom_margins->FindKey(kSettingMarginTop)->GetDouble();
+  page_size_margins->bottom =
+      custom_margins->FindKey(kSettingMarginBottom)->GetDouble();
+  page_size_margins->left =
+      custom_margins->FindKey(kSettingMarginLeft)->GetDouble();
+  page_size_margins->right =
+      custom_margins->FindKey(kSettingMarginRight)->GetDouble();
 }
 
 void SetMarginsToJobSettings(const std::string& json_path,
@@ -75,150 +75,139 @@
 
 }  // namespace
 
-bool PrintSettingsFromJobSettings(const base::DictionaryValue& job_settings,
+bool PrintSettingsFromJobSettings(const base::Value& job_settings,
                                   PrintSettings* settings) {
-  bool display_header_footer = false;
-  if (!job_settings.GetBoolean(kSettingHeaderFooterEnabled,
-                               &display_header_footer)) {
+  base::Optional<bool> display_header_footer =
+      job_settings.FindBoolKey(kSettingHeaderFooterEnabled);
+  if (!display_header_footer.has_value())
     return false;
-  }
-  settings->set_display_header_footer(display_header_footer);
 
+  settings->set_display_header_footer(display_header_footer.value());
   if (settings->display_header_footer()) {
-    base::string16 title;
-    base::string16 url;
-    if (!job_settings.GetString(kSettingHeaderFooterTitle, &title) ||
-        !job_settings.GetString(kSettingHeaderFooterURL, &url)) {
+    const std::string* title =
+        job_settings.FindStringKey(kSettingHeaderFooterTitle);
+    const std::string* url =
+        job_settings.FindStringKey(kSettingHeaderFooterURL);
+    if (!title || !url)
       return false;
-    }
-    settings->set_title(title);
-    settings->set_url(url);
+
+    settings->set_title(base::UTF8ToUTF16(*title));
+    settings->set_url(base::UTF8ToUTF16(*url));
   }
 
-  bool backgrounds = false;
-  bool selection_only = false;
-  if (!job_settings.GetBoolean(kSettingShouldPrintBackgrounds, &backgrounds) ||
-      !job_settings.GetBoolean(kSettingShouldPrintSelectionOnly,
-                               &selection_only)) {
+  base::Optional<bool> backgrounds =
+      job_settings.FindBoolKey(kSettingShouldPrintBackgrounds);
+  base::Optional<bool> selection_only =
+      job_settings.FindBoolKey(kSettingShouldPrintSelectionOnly);
+  if (!backgrounds.has_value() || !selection_only.has_value())
     return false;
-  }
-  settings->set_should_print_backgrounds(backgrounds);
-  settings->set_selection_only(selection_only);
+
+  settings->set_should_print_backgrounds(backgrounds.value());
+  settings->set_selection_only(selection_only.value());
 
   PrintSettings::RequestedMedia requested_media;
-  const base::DictionaryValue* media_size_value = NULL;
-  if (job_settings.GetDictionary(kSettingMediaSize, &media_size_value)) {
-    int width_microns = 0;
-    int height_microns = 0;
-    if (media_size_value->GetInteger(kSettingMediaSizeWidthMicrons,
-                                     &width_microns) &&
-        media_size_value->GetInteger(kSettingMediaSizeHeightMicrons,
-                                     &height_microns)) {
-      requested_media.size_microns = gfx::Size(width_microns, height_microns);
+  const base::Value* media_size_value = job_settings.FindKeyOfType(
+      kSettingMediaSize, base::Value::Type::DICTIONARY);
+  if (media_size_value) {
+    base::Optional<int> width_microns =
+        media_size_value->FindIntKey(kSettingMediaSizeWidthMicrons);
+    base::Optional<int> height_microns =
+        media_size_value->FindIntKey(kSettingMediaSizeHeightMicrons);
+    if (width_microns.has_value() && height_microns.has_value()) {
+      requested_media.size_microns =
+          gfx::Size(width_microns.value(), height_microns.value());
     }
-    std::string vendor_id;
-    if (media_size_value->GetString(kSettingMediaSizeVendorId, &vendor_id) &&
-        !vendor_id.empty()) {
-      requested_media.vendor_id = vendor_id;
-    }
+
+    const std::string* vendor_id =
+        media_size_value->FindStringKey(kSettingMediaSizeVendorId);
+    if (vendor_id && !vendor_id->empty())
+      requested_media.vendor_id = *vendor_id;
   }
   settings->set_requested_media(requested_media);
 
-  int margin_type = DEFAULT_MARGINS;
-  if (!job_settings.GetInteger(kSettingMarginsType, &margin_type) ||
-      (margin_type != DEFAULT_MARGINS &&
-       margin_type != NO_MARGINS &&
-       margin_type != CUSTOM_MARGINS &&
-       margin_type != PRINTABLE_AREA_MARGINS)) {
+  int margin_type =
+      job_settings.FindIntKey(kSettingMarginsType).value_or(DEFAULT_MARGINS);
+  if (margin_type != DEFAULT_MARGINS && margin_type != NO_MARGINS &&
+      margin_type != CUSTOM_MARGINS && margin_type != PRINTABLE_AREA_MARGINS) {
     margin_type = DEFAULT_MARGINS;
   }
   settings->set_margin_type(static_cast<MarginType>(margin_type));
 
   if (margin_type == CUSTOM_MARGINS) {
-    PageSizeMargins page_size_margins;
-    GetCustomMarginsFromJobSettings(job_settings, &page_size_margins);
-
     PageMargins margins_in_points;
     margins_in_points.Clear();
-    margins_in_points.top = page_size_margins.margin_top;
-    margins_in_points.bottom = page_size_margins.margin_bottom;
-    margins_in_points.left = page_size_margins.margin_left;
-    margins_in_points.right = page_size_margins.margin_right;
-
+    GetCustomMarginsFromJobSettings(job_settings, &margins_in_points);
     settings->SetCustomMargins(margins_in_points);
   }
 
   PageRanges new_ranges;
-  const base::ListValue* page_range_array = NULL;
-  if (job_settings.GetList(kSettingPageRange, &page_range_array)) {
-    for (size_t index = 0; index < page_range_array->GetSize(); ++index) {
-      const base::DictionaryValue* dict;
-      if (!page_range_array->GetDictionary(index, &dict))
+  const base::Value* page_range_array =
+      job_settings.FindKeyOfType(kSettingPageRange, base::Value::Type::LIST);
+  if (page_range_array) {
+    for (const base::Value& value : page_range_array->GetList()) {
+      if (!value.is_dict())
         continue;
 
-      PageRange range;
-      if (!dict->GetInteger(kSettingPageRangeFrom, &range.from) ||
-          !dict->GetInteger(kSettingPageRangeTo, &range.to)) {
+      base::Optional<int> from = value.FindIntKey(kSettingPageRangeFrom);
+      base::Optional<int> to = value.FindIntKey(kSettingPageRangeTo);
+      if (!from.has_value() || !to.has_value())
         continue;
-      }
 
       // Page numbers are 1-based in the dictionary.
       // Page numbers are 0-based for the printing context.
-      range.from--;
-      range.to--;
-      new_ranges.push_back(range);
+      new_ranges.push_back(PageRange{from.value() - 1, to.value() - 1});
     }
   }
   settings->set_ranges(new_ranges);
 
-  int color = 0;
-  bool landscape = false;
-  int duplex_mode = 0;
-  base::string16 device_name;
-  bool collate = false;
-  int copies = 1;
-  int scale_factor = 100;
-  bool rasterize_pdf = false;
-  int pages_per_sheet = 1;
+  base::Optional<bool> collate = job_settings.FindBoolKey(kSettingCollate);
+  base::Optional<int> copies = job_settings.FindIntKey(kSettingCopies);
+  base::Optional<int> color = job_settings.FindIntKey(kSettingColor);
+  base::Optional<int> duplex_mode = job_settings.FindIntKey(kSettingDuplexMode);
+  base::Optional<bool> landscape = job_settings.FindBoolKey(kSettingLandscape);
+  const std::string* device_name =
+      job_settings.FindStringKey(kSettingDeviceName);
+  base::Optional<int> scale_factor =
+      job_settings.FindIntKey(kSettingScaleFactor);
+  base::Optional<bool> rasterize_pdf =
+      job_settings.FindBoolKey(kSettingRasterizePdf);
+  base::Optional<int> pages_per_sheet =
+      job_settings.FindIntKey(kSettingPagesPerSheet);
 
-  if (!job_settings.GetBoolean(kSettingCollate, &collate) ||
-      !job_settings.GetInteger(kSettingCopies, &copies) ||
-      !job_settings.GetInteger(kSettingColor, &color) ||
-      !job_settings.GetInteger(kSettingDuplexMode, &duplex_mode) ||
-      !job_settings.GetBoolean(kSettingLandscape, &landscape) ||
-      !job_settings.GetString(kSettingDeviceName, &device_name) ||
-      !job_settings.GetInteger(kSettingScaleFactor, &scale_factor) ||
-      !job_settings.GetBoolean(kSettingRasterizePdf, &rasterize_pdf) ||
-      !job_settings.GetInteger(kSettingPagesPerSheet, &pages_per_sheet)) {
+  if (!collate.has_value() || !copies.has_value() || !color.has_value() ||
+      !duplex_mode.has_value() || !landscape.has_value() || !device_name ||
+      !scale_factor.has_value() || !rasterize_pdf.has_value() ||
+      !pages_per_sheet.has_value()) {
     return false;
   }
 #if defined(OS_WIN)
-  int dpi_horizontal = 0;
-  int dpi_vertical = 0;
-  if (!job_settings.GetInteger(kSettingDpiHorizontal, &dpi_horizontal) ||
-      !job_settings.GetInteger(kSettingDpiVertical, &dpi_vertical)) {
+  base::Optional<int> dpi_horizontal =
+      job_settings.FindIntKey(kSettingDpiHorizontal);
+  base::Optional<int> dpi_vertical =
+      job_settings.FindIntKey(kSettingDpiVertical);
+  if (!dpi_horizontal.has_value() || !dpi_vertical.has_value())
     return false;
-  }
-  settings->set_dpi_xy(dpi_horizontal, dpi_vertical);
+
+  settings->set_dpi_xy(dpi_horizontal.value(), dpi_vertical.value());
 #endif
 
-  settings->set_collate(collate);
-  settings->set_copies(copies);
-  settings->SetOrientation(landscape);
-  settings->set_device_name(device_name);
-  settings->set_duplex_mode(static_cast<DuplexMode>(duplex_mode));
-  settings->set_color(static_cast<ColorModel>(color));
-  settings->set_scale_factor(static_cast<double>(scale_factor) / 100.0);
-  settings->set_rasterize_pdf(rasterize_pdf);
-  settings->set_pages_per_sheet(pages_per_sheet);
-  bool is_modifiable = false;
-  if (job_settings.GetBoolean(kSettingPreviewModifiable, &is_modifiable)) {
-    settings->set_is_modifiable(is_modifiable);
+  settings->set_collate(collate.value());
+  settings->set_copies(copies.value());
+  settings->SetOrientation(landscape.value());
+  settings->set_device_name(base::UTF8ToUTF16(*device_name));
+  settings->set_duplex_mode(static_cast<DuplexMode>(duplex_mode.value()));
+  settings->set_color(static_cast<ColorModel>(color.value()));
+  settings->set_scale_factor(static_cast<double>(scale_factor.value()) / 100.0);
+  settings->set_rasterize_pdf(rasterize_pdf.value());
+  settings->set_pages_per_sheet(pages_per_sheet.value());
+  base::Optional<bool> is_modifiable =
+      job_settings.FindBoolKey(kSettingPreviewModifiable);
+  if (is_modifiable.has_value()) {
+    settings->set_is_modifiable(is_modifiable.value());
 #if defined(OS_WIN)
-    settings->set_print_text_with_gdi(is_modifiable);
+    settings->set_print_text_with_gdi(is_modifiable.value());
 #endif
   }
-
   return true;
 }
 
diff --git a/printing/print_settings_conversion.h b/printing/print_settings_conversion.h
index 283c0ff..07b6b03 100644
--- a/printing/print_settings_conversion.h
+++ b/printing/print_settings_conversion.h
@@ -11,6 +11,7 @@
 
 namespace base {
 class DictionaryValue;
+class Value;
 }
 
 namespace printing {
@@ -18,7 +19,7 @@
 class PrintSettings;
 
 PRINTING_EXPORT bool PrintSettingsFromJobSettings(
-    const base::DictionaryValue& job_settings,
+    const base::Value& job_settings,
     PrintSettings* print_settings);
 
 // Use for debug only, because output is not completely consistent with format
diff --git a/printing/printing_context.cc b/printing/printing_context.cc
index 289b44b..1939a761 100644
--- a/printing/printing_context.cc
+++ b/printing/printing_context.cc
@@ -56,32 +56,31 @@
 }
 
 PrintingContext::Result PrintingContext::UsePdfSettings() {
-  std::unique_ptr<base::DictionaryValue> pdf_settings(
-      new base::DictionaryValue);
-  pdf_settings->SetBoolean(kSettingHeaderFooterEnabled, false);
-  pdf_settings->SetBoolean(kSettingShouldPrintBackgrounds, false);
-  pdf_settings->SetBoolean(kSettingShouldPrintSelectionOnly, false);
-  pdf_settings->SetInteger(kSettingMarginsType, printing::NO_MARGINS);
-  pdf_settings->SetBoolean(kSettingCollate, true);
-  pdf_settings->SetInteger(kSettingCopies, 1);
-  pdf_settings->SetInteger(kSettingColor, printing::COLOR);
-  pdf_settings->SetInteger(kSettingDpiHorizontal, kPointsPerInch);
-  pdf_settings->SetInteger(kSettingDpiVertical, kPointsPerInch);
-  pdf_settings->SetInteger(kSettingDuplexMode, printing::SIMPLEX);
-  pdf_settings->SetBoolean(kSettingLandscape, false);
-  pdf_settings->SetString(kSettingDeviceName, "");
-  pdf_settings->SetBoolean(kSettingPrintToPDF, true);
-  pdf_settings->SetBoolean(kSettingCloudPrintDialog, false);
-  pdf_settings->SetBoolean(kSettingPrintWithPrivet, false);
-  pdf_settings->SetBoolean(kSettingPrintWithExtension, false);
-  pdf_settings->SetInteger(kSettingScaleFactor, 100);
-  pdf_settings->SetBoolean(kSettingRasterizePdf, false);
-  pdf_settings->SetInteger(kSettingPagesPerSheet, 1);
-  return UpdatePrintSettings(*pdf_settings);
+  base::Value pdf_settings(base::Value::Type::DICTIONARY);
+  pdf_settings.SetKey(kSettingHeaderFooterEnabled, base::Value(false));
+  pdf_settings.SetKey(kSettingShouldPrintBackgrounds, base::Value(false));
+  pdf_settings.SetKey(kSettingShouldPrintSelectionOnly, base::Value(false));
+  pdf_settings.SetKey(kSettingMarginsType, base::Value(printing::NO_MARGINS));
+  pdf_settings.SetKey(kSettingCollate, base::Value(true));
+  pdf_settings.SetKey(kSettingCopies, base::Value(1));
+  pdf_settings.SetKey(kSettingColor, base::Value(printing::COLOR));
+  pdf_settings.SetKey(kSettingDpiHorizontal, base::Value(kPointsPerInch));
+  pdf_settings.SetKey(kSettingDpiVertical, base::Value(kPointsPerInch));
+  pdf_settings.SetKey(kSettingDuplexMode, base::Value(printing::SIMPLEX));
+  pdf_settings.SetKey(kSettingLandscape, base::Value(false));
+  pdf_settings.SetKey(kSettingDeviceName, base::Value(""));
+  pdf_settings.SetKey(kSettingPrintToPDF, base::Value(true));
+  pdf_settings.SetKey(kSettingCloudPrintDialog, base::Value(false));
+  pdf_settings.SetKey(kSettingPrintWithPrivet, base::Value(false));
+  pdf_settings.SetKey(kSettingPrintWithExtension, base::Value(false));
+  pdf_settings.SetKey(kSettingScaleFactor, base::Value(100));
+  pdf_settings.SetKey(kSettingRasterizePdf, base::Value(false));
+  pdf_settings.SetKey(kSettingPagesPerSheet, base::Value(1));
+  return UpdatePrintSettings(std::move(pdf_settings));
 }
 
 PrintingContext::Result PrintingContext::UpdatePrintSettings(
-    const base::DictionaryValue& job_settings) {
+    base::Value job_settings) {
   ResetSettings();
 
   if (!PrintSettingsFromJobSettings(job_settings, &settings_)) {
@@ -89,23 +88,29 @@
     return OnError();
   }
 
-  bool print_to_pdf = false;
-  bool is_cloud_dialog = false;
-  bool print_with_privet = false;
-  bool print_with_extension = false;
+  base::Optional<bool> print_to_pdf_opt =
+      job_settings.FindBoolKey(kSettingPrintToPDF);
+  base::Optional<bool> is_cloud_dialog_opt =
+      job_settings.FindBoolKey(kSettingCloudPrintDialog);
+  base::Optional<bool> print_with_privet_opt =
+      job_settings.FindBoolKey(kSettingPrintWithPrivet);
+  base::Optional<bool> print_with_extension_opt =
+      job_settings.FindBoolKey(kSettingPrintWithExtension);
 
-  if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) ||
-      !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog) ||
-      !job_settings.GetBoolean(kSettingPrintWithPrivet, &print_with_privet) ||
-      !job_settings.GetBoolean(kSettingPrintWithExtension,
-                               &print_with_extension)) {
+  if (!print_to_pdf_opt || !is_cloud_dialog_opt || !print_with_privet_opt ||
+      !print_with_extension_opt) {
     NOTREACHED();
     return OnError();
   }
 
-  bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId);
+  bool print_to_pdf = print_to_pdf_opt.value();
+  bool is_cloud_dialog = is_cloud_dialog_opt.value();
+  bool print_with_privet = print_with_privet_opt.value();
+  bool print_with_extension = print_with_extension_opt.value();
+
+  bool print_to_cloud = job_settings.FindKey(kSettingCloudPrintId) != nullptr;
   bool open_in_external_preview =
-      job_settings.HasKey(kSettingOpenPDFInPreview);
+      job_settings.FindKey(kSettingOpenPDFInPreview) != nullptr;
 
   if (!open_in_external_preview &&
       (print_to_pdf || print_to_cloud || is_cloud_dialog || print_with_privet ||
@@ -131,14 +136,10 @@
     return OK;
   }
 
-  bool show_system_dialog = false;
-  job_settings.GetBoolean(kSettingShowSystemDialog, &show_system_dialog);
-
-  int page_count = 0;
-  job_settings.GetInteger(kSettingPreviewPageCount, &page_count);
-
-  return UpdatePrinterSettings(open_in_external_preview, show_system_dialog,
-                               page_count);
+  return UpdatePrinterSettings(
+      open_in_external_preview,
+      job_settings.FindBoolKey(kSettingShowSystemDialog).value_or(false),
+      job_settings.FindIntKey(kSettingPreviewPageCount).value_or(0));
 }
 
 #if defined(OS_CHROMEOS)
diff --git a/printing/printing_context.h b/printing/printing_context.h
index 88593790..1704d5a 100644
--- a/printing/printing_context.h
+++ b/printing/printing_context.h
@@ -11,14 +11,11 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/strings/string16.h"
+#include "base/values.h"
 #include "printing/native_drawing_context.h"
 #include "printing/print_settings.h"
 #include "ui/gfx/native_widget_types.h"
 
-namespace base {
-class DictionaryValue;
-}
-
 namespace printing {
 
 // An abstraction of a printer context, implemented by objects that describe the
@@ -83,8 +80,8 @@
                                        int page_count) = 0;
 
   // Updates Print Settings. |job_settings| contains all print job
-  // settings information. |ranges| has the new page range settings.
-  Result UpdatePrintSettings(const base::DictionaryValue& job_settings);
+  // settings information.
+  Result UpdatePrintSettings(base::Value job_settings);
 
 #if defined(OS_CHROMEOS)
   // Updates Print Settings.