diff --git chrome/browser/ui/BUILD.gn chrome/browser/ui/BUILD.gn
index dfffff81bcf2..a4518ba20aaf 100644
--- chrome/browser/ui/BUILD.gn
+++ chrome/browser/ui/BUILD.gn
@@ -10,6 +10,7 @@ import("//build/config/features.gni")
 import("//build/config/jumbo.gni")
 import("//build/config/linux/gtk/gtk.gni")
 import("//build/config/ui.gni")
+import("//cef/libcef/features/features.gni")
 import("//chrome/browser/buildflags.gni")
 import("//chrome/common/features.gni")
 import("//chromeos/assistant/assistant.gni")
@@ -362,6 +363,10 @@ jumbo_static_library("ui") {
     "//build/config/compiler:wexit_time_destructors",
   ]
 
+  if (enable_cef) {
+    configs += [ "//cef/libcef/features:config" ]
+  }
+
   # Since browser and browser_ui actually depend on each other,
   # we must omit the dependency from browser_ui to browser.
   # However, this means browser_ui and browser should more or less
@@ -383,6 +388,7 @@ jumbo_static_library("ui") {
     "//base/allocator:buildflags",
     "//build:branding_buildflags",
     "//cc/paint",
+    "//cef/libcef/features",
     "//chrome:extra_resources",
     "//chrome:resources",
     "//chrome:strings",
@@ -1470,6 +1476,7 @@ jumbo_static_library("ui") {
       "//components/keep_alive_registry",
       "//components/network_session_configurator/common",
       "//components/page_load_metrics/browser",
+      "//components/printing/common:mojo_interfaces",
       "//components/profile_metrics",
       "//components/search_provider_logos",
       "//components/ui_metrics",
diff --git chrome/browser/ui/webui/net_export_ui.cc chrome/browser/ui/webui/net_export_ui.cc
index 93bfc84f49a1..eeee229e943f 100644
--- chrome/browser/ui/webui/net_export_ui.cc
+++ chrome/browser/ui/webui/net_export_ui.cc
@@ -21,13 +21,12 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
+#include "cef/libcef/features/features.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/net/net_export_helper.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/url_constants.h"
 #include "components/grit/dev_ui_components_resources.h"
@@ -42,7 +41,14 @@
 #include "content/public/browser/web_ui_message_handler.h"
 #include "extensions/buildflags/buildflags.h"
 #include "net/log/net_log_capture_mode.h"
+
+#if !BUILDFLAG(ENABLE_CEF)
+#include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
+#else
+#include "cef/libcef/browser/browser_host_impl.h"
+#endif
 
 #if defined(OS_ANDROID)
 #include "chrome/browser/android/intent_helper.h"
@@ -68,6 +74,7 @@ content::WebUIDataSource* CreateNetExportHTMLSource() {
   return source;
 }
 
+#if !BUILDFLAG(ENABLE_CEF)
 void SetIfNotNull(base::DictionaryValue* dict,
                   const base::StringPiece& path,
                   std::unique_ptr<base::Value> in_value) {
@@ -75,6 +82,7 @@ void SetIfNotNull(base::DictionaryValue* dict,
     dict->Set(path, std::move(in_value));
   }
 }
+#endif  // !BUILDFLAG(ENABLE_CEF)
 
 // This class receives javascript messages from the renderer.
 // Note that the WebUI infrastructure runs on the UI thread, therefore all of
@@ -82,7 +90,9 @@ void SetIfNotNull(base::DictionaryValue* dict,
 class NetExportMessageHandler
     : public WebUIMessageHandler,
       public base::SupportsWeakPtr<NetExportMessageHandler>,
+#if !BUILDFLAG(ENABLE_CEF)
       public ui::SelectFileDialog::Listener,
+#endif
       public net_log::NetExportFileWriter::StateObserver {
  public:
   NetExportMessageHandler();
@@ -98,11 +108,13 @@ class NetExportMessageHandler
   void OnSendNetLog(const base::ListValue* list);
   void OnShowFile(const base::ListValue* list);
 
+#if !BUILDFLAG(ENABLE_CEF)
   // ui::SelectFileDialog::Listener implementation.
   void FileSelected(const base::FilePath& path,
                     int index,
                     void* params) override;
   void FileSelectionCanceled(void* params) override;
+#endif  // !BUILDFLAG(ENABLE_CEF)
 
   // net_log::NetExportFileWriter::StateObserver implementation.
   void OnNewState(const base::DictionaryValue& state) override;
@@ -132,9 +144,16 @@ class NetExportMessageHandler
   // renderer.
   void NotifyUIWithState(std::unique_ptr<base::DictionaryValue> state);
 
+#if !BUILDFLAG(ENABLE_CEF)
   // Opens the SelectFileDialog UI with the default path to save a
   // NetLog file.
   void ShowSelectFileDialog(const base::FilePath& default_path);
+#else
+  void ShowCefSaveAsDialog(content::WebContents* web_contents);
+  void SaveAsDialogDismissed(
+      int selected_accept_filter,
+      const std::vector<base::FilePath>& file_paths);
+#endif
 
   // Cached pointer to SystemNetworkContextManager's NetExportFileWriter.
   net_log::NetExportFileWriter* file_writer_;
@@ -150,7 +169,9 @@ class NetExportMessageHandler
   net::NetLogCaptureMode capture_mode_;
   uint64_t max_log_file_size_;
 
+#if !BUILDFLAG(ENABLE_CEF)
   scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
+#endif
 
   base::WeakPtrFactory<NetExportMessageHandler> weak_ptr_factory_{this};
 
@@ -167,8 +188,10 @@ NetExportMessageHandler::NetExportMessageHandler()
 NetExportMessageHandler::~NetExportMessageHandler() {
   // There may be a pending file dialog, it needs to be told that the user
   // has gone away so that it doesn't try to call back.
+#if !BUILDFLAG(ENABLE_CEF)
   if (select_file_dialog_)
     select_file_dialog_->ListenerDestroyed();
+#endif
 
   file_writer_->StopNetLog(nullptr);
 }
@@ -231,6 +254,7 @@ void NetExportMessageHandler::OnStartNetLog(const base::ListValue* list) {
   if (UsingMobileUI()) {
     StartNetLog(base::FilePath());
   } else {
+#if !BUILDFLAG(ENABLE_CEF)
     base::FilePath initial_dir = last_save_dir.Pointer()->empty() ?
         DownloadPrefs::FromBrowserContext(
             web_ui()->GetWebContents()->GetBrowserContext())->DownloadPath() :
@@ -238,6 +262,9 @@ void NetExportMessageHandler::OnStartNetLog(const base::ListValue* list) {
     base::FilePath initial_path =
         initial_dir.Append(FILE_PATH_LITERAL("chrome-net-export-log.json"));
     ShowSelectFileDialog(initial_path);
+#else  // BUILDFLAG(ENABLE_CEF)
+    ShowCefSaveAsDialog(web_ui()->GetWebContents());
+#endif  // BUILDFLAG(ENABLE_CEF)
   }
 }
 
@@ -247,6 +274,7 @@ void NetExportMessageHandler::OnStopNetLog(const base::ListValue* list) {
   std::unique_ptr<base::DictionaryValue> ui_thread_polled_data(
       new base::DictionaryValue());
 
+#if !BUILDFLAG(ENABLE_CEF)
   Profile* profile = Profile::FromWebUI(web_ui());
   SetIfNotNull(ui_thread_polled_data.get(), "prerenderInfo",
                chrome_browser_net::GetPrerenderInfo(profile));
@@ -256,6 +284,7 @@ void NetExportMessageHandler::OnStopNetLog(const base::ListValue* list) {
   SetIfNotNull(ui_thread_polled_data.get(), "serviceProviders",
                chrome_browser_net::GetWindowsServiceProviders());
 #endif
+#endif  // !BUILDFLAG(ENABLE_CEF)
 
   file_writer_->StopNetLog(std::move(ui_thread_polled_data));
 }
@@ -272,6 +301,7 @@ void NetExportMessageHandler::OnShowFile(const base::ListValue* list) {
       base::Bind(&NetExportMessageHandler::ShowFileInShell, AsWeakPtr()));
 }
 
+#if !BUILDFLAG(ENABLE_CEF)
 void NetExportMessageHandler::FileSelected(const base::FilePath& path,
                                            int index,
                                            void* params) {
@@ -290,6 +320,7 @@ void NetExportMessageHandler::FileSelectionCanceled(void* params) {
   DCHECK(select_file_dialog_);
   select_file_dialog_ = nullptr;
 }
+#endif  // !BUILDFLAG(ENABLE_CEF)
 
 void NetExportMessageHandler::OnNewState(const base::DictionaryValue& state) {
   NotifyUIWithState(state.CreateDeepCopy());
@@ -354,6 +385,7 @@ void NetExportMessageHandler::NotifyUIWithState(
                                          *state);
 }
 
+#if !BUILDFLAG(ENABLE_CEF)
 void NetExportMessageHandler::ShowSelectFileDialog(
     const base::FilePath& default_path) {
   // User may have clicked more than once before the save dialog appears.
@@ -372,6 +404,43 @@ void NetExportMessageHandler::ShowSelectFileDialog(
       ui::SelectFileDialog::SELECT_SAVEAS_FILE, base::string16(), default_path,
       &file_type_info, 0, base::FilePath::StringType(), owning_window, nullptr);
 }
+#endif  // !BUILDFLAG(ENABLE_CEF)
+
+#if BUILDFLAG(ENABLE_CEF)
+
+void NetExportMessageHandler::ShowCefSaveAsDialog(
+    content::WebContents* web_contents) {
+  CefRefPtr<CefBrowserHostImpl> cef_browser =
+      CefBrowserHostImpl::GetBrowserForContents(web_contents);
+  if (!cef_browser)
+    return;
+
+  base::FilePath initial_dir;
+  if (!last_save_dir.Pointer()->empty())
+    initial_dir = *last_save_dir.Pointer();
+  base::FilePath initial_path =
+      initial_dir.Append(FILE_PATH_LITERAL("chrome-net-export-log.json"));
+
+  CefFileDialogRunner::FileChooserParams params;
+  params.mode = blink::mojom::FileChooserParams::Mode::kSave;
+  params.default_file_name = initial_path;
+  params.accept_types.push_back(CefString(initial_path.Extension()));
+
+  cef_browser->RunFileChooser(
+      params, base::Bind(&NetExportMessageHandler::SaveAsDialogDismissed,
+                         weak_ptr_factory_.GetWeakPtr()));
+}
+
+void NetExportMessageHandler::SaveAsDialogDismissed(
+    int selected_accept_filter,
+    const std::vector<base::FilePath>& file_paths) {
+  if (file_paths.size() == 1) {
+    *last_save_dir.Pointer() = file_paths[0].DirName();
+    StartNetLog(file_paths[0]);
+  }
+}
+
+#endif  // BUILDFLAG(ENABLE_CEF)
 
 }  // namespace
 
