| 
									
										
										
										
											2015-09-05 01:44:22 +09:00
										 |  |  | // Copyright (c) 2015 GitHub, Inc.
 | 
					
						
							|  |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "atom/browser/web_contents_preferences.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2015-09-05 19:47:44 +08:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2018-09-12 19:25:56 -05:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2015-09-05 19:47:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-14 10:50:07 +09:00
										 |  |  | #include "atom/browser/native_window.h"
 | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  | #include "atom/browser/web_view_manager.h"
 | 
					
						
							| 
									
										
										
										
											2015-11-11 10:32:25 +08:00
										 |  |  | #include "atom/common/native_mate_converters/value_converter.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-05 02:04:09 +09:00
										 |  |  | #include "atom/common/options_switches.h"
 | 
					
						
							|  |  |  | #include "base/command_line.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-07 23:30:03 +03:00
										 |  |  | #include "base/memory/ptr_util.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-05 02:33:13 +09:00
										 |  |  | #include "base/strings/string_number_conversions.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | #include "base/strings/utf_string_conversions.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-26 15:30:02 -07:00
										 |  |  | #include "cc/base/switches.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-12 17:27:43 +09:00
										 |  |  | #include "content/public/browser/render_frame_host.h"
 | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  | #include "content/public/browser/render_process_host.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-07 12:49:00 +08:00
										 |  |  | #include "content/public/common/content_switches.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-05 02:12:32 +09:00
										 |  |  | #include "content/public/common/web_preferences.h"
 | 
					
						
							| 
									
										
										
										
											2015-11-11 10:32:25 +08:00
										 |  |  | #include "native_mate/dictionary.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-05 10:57:39 +09:00
										 |  |  | #include "net/base/filename_util.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-14 17:07:49 -07:00
										 |  |  | #include "services/service_manager/sandbox/switches.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-05 02:04:09 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if defined(OS_WIN)
 | 
					
						
							|  |  |  | #include "ui/gfx/switches.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool GetAsString(const base::Value* val, | 
					
						
							|  |  |  |                  const base::StringPiece& path, | 
					
						
							|  |  |  |                  std::string* out) { | 
					
						
							|  |  |  |   if (val) { | 
					
						
							|  |  |  |     auto* found = val->FindKeyOfType(path, base::Value::Type::STRING); | 
					
						
							|  |  |  |     if (found) { | 
					
						
							|  |  |  |       *out = found->GetString(); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool GetAsString(const base::Value* val, | 
					
						
							|  |  |  |                  const base::StringPiece& path, | 
					
						
							|  |  |  |                  base::string16* out) { | 
					
						
							|  |  |  |   if (val) { | 
					
						
							|  |  |  |     auto* found = val->FindKeyOfType(path, base::Value::Type::STRING); | 
					
						
							|  |  |  |     if (found) { | 
					
						
							|  |  |  |       *out = base::UTF8ToUTF16(found->GetString()); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool GetAsInteger(const base::Value* val, | 
					
						
							|  |  |  |                   const base::StringPiece& path, | 
					
						
							|  |  |  |                   int* out) { | 
					
						
							|  |  |  |   if (val) { | 
					
						
							|  |  |  |     auto* found = val->FindKey(path); | 
					
						
							|  |  |  |     if (found && found->is_int()) { | 
					
						
							|  |  |  |       *out = found->GetInt(); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } else if (found && found->is_string()) { | 
					
						
							|  |  |  |       return base::StringToInt(found->GetString(), out); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-15 11:30:34 -08:00
										 |  |  | bool GetAsAutoplayPolicy(const base::Value* val, | 
					
						
							|  |  |  |                          const base::StringPiece& path, | 
					
						
							|  |  |  |                          content::AutoplayPolicy* out) { | 
					
						
							|  |  |  |   std::string policy_str; | 
					
						
							|  |  |  |   if (GetAsString(val, path, &policy_str)) { | 
					
						
							|  |  |  |     if (policy_str == "no-user-gesture-required") { | 
					
						
							|  |  |  |       *out = content::AutoplayPolicy::kNoUserGestureRequired; | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } else if (policy_str == "user-gesture-required") { | 
					
						
							|  |  |  |       *out = content::AutoplayPolicy::kUserGestureRequired; | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } else if (policy_str == "document-user-activation-required") { | 
					
						
							|  |  |  |       *out = content::AutoplayPolicy::kDocumentUserActivationRequired; | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return false; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | }  // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 01:44:22 +09:00
										 |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  | // static
 | 
					
						
							|  |  |  | std::vector<WebContentsPreferences*> WebContentsPreferences::instances_; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 01:44:22 +09:00
										 |  |  | WebContentsPreferences::WebContentsPreferences( | 
					
						
							|  |  |  |     content::WebContents* web_contents, | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  |     const mate::Dictionary& web_preferences) | 
					
						
							|  |  |  |     : web_contents_(web_contents) { | 
					
						
							| 
									
										
										
										
											2015-11-11 10:32:25 +08:00
										 |  |  |   v8::Isolate* isolate = web_preferences.isolate(); | 
					
						
							|  |  |  |   mate::Dictionary copied(isolate, web_preferences.GetHandle()->Clone()); | 
					
						
							|  |  |  |   // Following fields should not be stored.
 | 
					
						
							|  |  |  |   copied.Delete("embedder"); | 
					
						
							|  |  |  |   copied.Delete("session"); | 
					
						
							| 
									
										
										
										
											2019-05-20 12:55:46 +02:00
										 |  |  |   copied.Delete("type"); | 
					
						
							| 
									
										
										
										
											2015-11-11 10:32:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   mate::ConvertFromV8(isolate, copied.GetHandle(), &preference_); | 
					
						
							| 
									
										
										
										
											2017-08-07 23:30:03 +03:00
										 |  |  |   web_contents->SetUserData(UserDataKey(), base::WrapUnique(this)); | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   instances_.push_back(this); | 
					
						
							| 
									
										
										
										
											2018-03-15 13:56:46 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Set WebPreferences defaults onto the JS object
 | 
					
						
							| 
									
										
										
										
											2018-05-29 10:09:51 +02:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kPlugins, false); | 
					
						
							| 
									
										
										
										
											2018-03-15 13:56:46 +09:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kExperimentalFeatures, false); | 
					
						
							| 
									
										
										
										
											2019-01-07 20:19:27 +01:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kNodeIntegration, false); | 
					
						
							| 
									
										
										
										
											2019-01-22 11:24:46 -08:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kNodeIntegrationInSubFrames, false); | 
					
						
							| 
									
										
										
										
											2018-03-15 13:56:46 +09:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kNodeIntegrationInWorker, false); | 
					
						
							| 
									
										
										
										
											2019-03-07 18:29:37 -05:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kDisableHtmlFullscreenWindowResize, false); | 
					
						
							| 
									
										
										
										
											2019-01-07 20:19:27 +01:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kWebviewTag, false); | 
					
						
							| 
									
										
										
										
											2018-05-29 10:09:51 +02:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kSandbox, false); | 
					
						
							|  |  |  |   SetDefaultBoolIfUndefined(options::kNativeWindowOpen, false); | 
					
						
							| 
									
										
										
										
											2019-02-11 21:42:37 +01:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kEnableRemoteModule, true); | 
					
						
							| 
									
										
										
										
											2018-08-30 09:57:49 +12:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kContextIsolation, false); | 
					
						
							| 
									
										
										
										
											2019-04-23 18:14:18 +02:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kJavaScript, true); | 
					
						
							|  |  |  |   SetDefaultBoolIfUndefined(options::kImages, true); | 
					
						
							|  |  |  |   SetDefaultBoolIfUndefined(options::kTextAreasAreResizable, true); | 
					
						
							|  |  |  |   SetDefaultBoolIfUndefined(options::kWebGL, true); | 
					
						
							| 
									
										
										
										
											2018-04-16 23:28:54 +10:00
										 |  |  |   bool webSecurity = true; | 
					
						
							| 
									
										
										
										
											2018-05-29 10:09:51 +02:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kWebSecurity, webSecurity); | 
					
						
							| 
									
										
										
										
											2018-04-16 23:28:54 +10:00
										 |  |  |   // If webSecurity was explicity set to false, let's inherit that into
 | 
					
						
							|  |  |  |   // insecureContent
 | 
					
						
							| 
									
										
										
										
											2018-05-29 10:09:51 +02:00
										 |  |  |   if (web_preferences.Get(options::kWebSecurity, &webSecurity) && | 
					
						
							|  |  |  |       !webSecurity) { | 
					
						
							|  |  |  |     SetDefaultBoolIfUndefined(options::kAllowRunningInsecureContent, true); | 
					
						
							| 
									
										
										
										
											2018-04-16 23:28:54 +10:00
										 |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2018-05-29 10:09:51 +02:00
										 |  |  |     SetDefaultBoolIfUndefined(options::kAllowRunningInsecureContent, false); | 
					
						
							| 
									
										
										
										
											2018-04-16 23:28:54 +10:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | #if defined(OS_MACOSX)
 | 
					
						
							| 
									
										
										
										
											2018-03-15 13:56:46 +09:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kScrollBounce, false); | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-05-29 10:09:51 +02:00
										 |  |  |   SetDefaultBoolIfUndefined(options::kOffscreen, false); | 
					
						
							| 
									
										
										
										
											2018-03-08 16:05:12 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 02:44:54 +02:00
										 |  |  |   SetDefaults(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-19 12:55:20 -07:00
										 |  |  |   // If this is a <webview> tag, and the embedder is offscreen-rendered, then
 | 
					
						
							|  |  |  |   // this WebContents is also offscreen-rendered.
 | 
					
						
							|  |  |  |   int guest_instance_id = 0; | 
					
						
							|  |  |  |   if (web_preferences.Get(options::kGuestInstanceID, &guest_instance_id)) { | 
					
						
							|  |  |  |     auto* manager = WebViewManager::GetWebViewManager(web_contents); | 
					
						
							|  |  |  |     if (manager) { | 
					
						
							|  |  |  |       auto* embedder = manager->GetEmbedder(guest_instance_id); | 
					
						
							|  |  |  |       if (embedder) { | 
					
						
							|  |  |  |         auto* embedder_preferences = WebContentsPreferences::From(embedder); | 
					
						
							|  |  |  |         if (embedder_preferences && | 
					
						
							|  |  |  |             embedder_preferences->IsEnabled(options::kOffscreen)) { | 
					
						
							|  |  |  |           preference_.SetKey(options::kOffscreen, base::Value(true)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   last_preference_ = preference_.Clone(); | 
					
						
							| 
									
										
										
										
											2015-09-05 01:44:22 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebContentsPreferences::~WebContentsPreferences() { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |   instances_.erase(std::remove(instances_.begin(), instances_.end(), this), | 
					
						
							|  |  |  |                    instances_.end()); | 
					
						
							| 
									
										
										
										
											2015-09-05 01:44:22 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 02:44:54 +02:00
										 |  |  | void WebContentsPreferences::SetDefaults() { | 
					
						
							|  |  |  |   if (IsEnabled(options::kSandbox)) { | 
					
						
							|  |  |  |     SetBool(options::kNativeWindowOpen, true); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-08 16:36:21 +09:00
										 |  |  | bool WebContentsPreferences::SetDefaultBoolIfUndefined( | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |     const base::StringPiece& key, | 
					
						
							| 
									
										
										
										
											2018-08-30 09:57:49 +12:00
										 |  |  |     bool val) { | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   auto* current_value = | 
					
						
							|  |  |  |       preference_.FindKeyOfType(key, base::Value::Type::BOOLEAN); | 
					
						
							|  |  |  |   if (current_value) { | 
					
						
							|  |  |  |     return current_value->GetBool(); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     preference_.SetKey(key, base::Value(val)); | 
					
						
							| 
									
										
										
										
											2018-08-30 09:57:49 +12:00
										 |  |  |     return val; | 
					
						
							| 
									
										
										
										
											2018-03-15 13:56:46 +09:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 02:44:54 +02:00
										 |  |  | void WebContentsPreferences::SetBool(const base::StringPiece& key, bool value) { | 
					
						
							|  |  |  |   preference_.SetKey(key, base::Value(value)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-08 16:36:21 +09:00
										 |  |  | bool WebContentsPreferences::IsEnabled(const base::StringPiece& name, | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |                                        bool default_value) const { | 
					
						
							|  |  |  |   auto* current_value = | 
					
						
							|  |  |  |       preference_.FindKeyOfType(name, base::Value::Type::BOOLEAN); | 
					
						
							|  |  |  |   if (current_value) | 
					
						
							|  |  |  |     return current_value->GetBool(); | 
					
						
							|  |  |  |   return default_value; | 
					
						
							| 
									
										
										
										
											2018-03-08 16:36:21 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 11:43:30 +09:00
										 |  |  | void WebContentsPreferences::Merge(const base::DictionaryValue& extend) { | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (preference_.is_dict()) | 
					
						
							|  |  |  |     static_cast<base::DictionaryValue*>(&preference_)->MergeDictionary(&extend); | 
					
						
							| 
									
										
										
										
											2019-05-27 02:44:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   SetDefaults(); | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebContentsPreferences::Clear() { | 
					
						
							|  |  |  |   if (preference_.is_dict()) | 
					
						
							|  |  |  |     static_cast<base::DictionaryValue*>(&preference_)->Clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool WebContentsPreferences::GetPreference(const base::StringPiece& name, | 
					
						
							|  |  |  |                                            std::string* value) const { | 
					
						
							|  |  |  |   return GetAsString(&preference_, name, value); | 
					
						
							| 
									
										
										
										
											2015-09-05 11:43:30 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  | bool WebContentsPreferences::IsRemoteModuleEnabled() const { | 
					
						
							|  |  |  |   return IsEnabled(options::kEnableRemoteModule, true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-11 00:19:49 +02:00
										 |  |  | bool WebContentsPreferences::GetPreloadPath( | 
					
						
							|  |  |  |     base::FilePath::StringType* path) const { | 
					
						
							|  |  |  |   DCHECK(path); | 
					
						
							|  |  |  |   base::FilePath::StringType preload; | 
					
						
							|  |  |  |   if (GetAsString(&preference_, options::kPreloadScript, &preload)) { | 
					
						
							|  |  |  |     if (base::FilePath(preload).IsAbsolute()) { | 
					
						
							|  |  |  |       *path = std::move(preload); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       LOG(ERROR) << "preload script must have absolute path."; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else if (GetAsString(&preference_, options::kPreloadURL, &preload)) { | 
					
						
							|  |  |  |     // Translate to file path if there is "preload-url" option.
 | 
					
						
							|  |  |  |     base::FilePath preload_path; | 
					
						
							|  |  |  |     if (net::FileURLToFilePath(GURL(preload), &preload_path)) { | 
					
						
							|  |  |  |       *path = std::move(preload_path.value()); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       LOG(ERROR) << "preload url must be file:// protocol."; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  | // static
 | 
					
						
							|  |  |  | content::WebContents* WebContentsPreferences::GetWebContentsFromProcessID( | 
					
						
							|  |  |  |     int process_id) { | 
					
						
							|  |  |  |   for (WebContentsPreferences* preferences : instances_) { | 
					
						
							|  |  |  |     content::WebContents* web_contents = preferences->web_contents_; | 
					
						
							| 
									
										
										
										
											2017-12-18 13:46:23 +11:00
										 |  |  |     if (web_contents->GetMainFrame()->GetProcess()->GetID() == process_id) | 
					
						
							| 
									
										
										
										
											2016-03-09 21:34:51 +09:00
										 |  |  |       return web_contents; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return nullptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-08 16:12:45 +09:00
										 |  |  | // static
 | 
					
						
							|  |  |  | WebContentsPreferences* WebContentsPreferences::From( | 
					
						
							|  |  |  |     content::WebContents* web_contents) { | 
					
						
							|  |  |  |   if (!web_contents) | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  |   return FromWebContents(web_contents); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  | void WebContentsPreferences::AppendCommandLineSwitches( | 
					
						
							|  |  |  |     base::CommandLine* command_line) { | 
					
						
							| 
									
										
										
										
											2015-09-05 02:04:09 +09:00
										 |  |  |   // Check if plugins are enabled.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (IsEnabled(options::kPlugins)) | 
					
						
							| 
									
										
										
										
											2015-09-05 02:04:09 +09:00
										 |  |  |     command_line->AppendSwitch(switches::kEnablePlugins); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-07 12:49:00 +08:00
										 |  |  |   // Experimental flags.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (IsEnabled(options::kExperimentalFeatures)) | 
					
						
							| 
									
										
										
										
											2016-01-07 12:49:00 +08:00
										 |  |  |     command_line->AppendSwitch( | 
					
						
							|  |  |  |         ::switches::kEnableExperimentalWebPlatformFeatures); | 
					
						
							| 
									
										
										
										
											2015-09-05 02:33:13 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Check if we have node integration specified.
 | 
					
						
							| 
									
										
										
										
											2019-01-03 17:22:34 +01:00
										 |  |  |   if (IsEnabled(options::kNodeIntegration)) | 
					
						
							|  |  |  |     command_line->AppendSwitch(switches::kNodeIntegration); | 
					
						
							| 
									
										
										
										
											2015-09-05 02:33:13 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-15 18:51:21 +09:00
										 |  |  |   // Whether to enable node integration in Worker.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (IsEnabled(options::kNodeIntegrationInWorker)) | 
					
						
							| 
									
										
										
										
											2017-03-15 18:51:21 +09:00
										 |  |  |     command_line->AppendSwitch(switches::kNodeIntegrationInWorker); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 13:09:24 -07:00
										 |  |  |   // Check if webview tag creation is enabled, default to nodeIntegration value.
 | 
					
						
							| 
									
										
										
										
											2019-01-03 17:22:34 +01:00
										 |  |  |   if (IsEnabled(options::kWebviewTag)) | 
					
						
							|  |  |  |     command_line->AppendSwitch(switches::kWebviewTag); | 
					
						
							| 
									
										
										
										
											2017-05-06 22:10:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-15 07:59:08 -03:00
										 |  |  |   // If the `sandbox` option was passed to the BrowserWindow's webPreferences,
 | 
					
						
							|  |  |  |   // pass `--enable-sandbox` to the renderer so it won't have any node.js
 | 
					
						
							|  |  |  |   // integration.
 | 
					
						
							| 
									
										
										
										
											2018-12-05 17:42:12 -08:00
										 |  |  |   if (IsEnabled(options::kSandbox)) { | 
					
						
							| 
									
										
										
										
											2016-08-15 07:59:08 -03:00
										 |  |  |     command_line->AppendSwitch(switches::kEnableSandbox); | 
					
						
							| 
									
										
										
										
											2018-12-05 17:42:12 -08:00
										 |  |  |   } else if (!command_line->HasSwitch(switches::kEnableSandbox)) { | 
					
						
							| 
									
										
										
										
											2018-09-14 17:07:49 -07:00
										 |  |  |     command_line->AppendSwitch(service_manager::switches::kNoSandbox); | 
					
						
							| 
									
										
										
										
											2018-12-05 17:42:12 -08:00
										 |  |  |     command_line->AppendSwitch(::switches::kNoZygote); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Check if nativeWindowOpen is enabled.
 | 
					
						
							|  |  |  |   if (IsEnabled(options::kNativeWindowOpen)) | 
					
						
							| 
									
										
										
										
											2017-03-19 17:41:20 +09:00
										 |  |  |     command_line->AppendSwitch(switches::kNativeWindowOpen); | 
					
						
							| 
									
										
										
										
											2016-08-15 07:59:08 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 02:33:13 +09:00
										 |  |  |   // The preload script.
 | 
					
						
							|  |  |  |   base::FilePath::StringType preload; | 
					
						
							| 
									
										
										
										
											2018-08-11 00:19:49 +02:00
										 |  |  |   if (GetPreloadPath(&preload)) | 
					
						
							|  |  |  |     command_line->AppendSwitchNative(switches::kPreloadScript, preload); | 
					
						
							| 
									
										
										
										
											2015-09-05 02:33:13 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-13 04:54:31 +11:00
										 |  |  |   // Custom args for renderer process
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   auto* customArgs = | 
					
						
							|  |  |  |       preference_.FindKeyOfType(options::kCustomArgs, base::Value::Type::LIST); | 
					
						
							|  |  |  |   if (customArgs) { | 
					
						
							|  |  |  |     for (const auto& customArg : customArgs->GetList()) { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |       if (customArg.is_string()) | 
					
						
							| 
									
										
										
										
											2018-02-13 04:54:31 +11:00
										 |  |  |         command_line->AppendArg(customArg.GetString()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 19:50:07 +02:00
										 |  |  |   // Whether to enable the remote module
 | 
					
						
							|  |  |  |   if (!IsRemoteModuleEnabled()) | 
					
						
							|  |  |  |     command_line->AppendSwitch(switches::kDisableRemoteModule); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-08 15:33:51 -08:00
										 |  |  |   // Run Electron APIs and preload script in isolated world
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (IsEnabled(options::kContextIsolation)) | 
					
						
							| 
									
										
										
										
											2016-12-15 13:20:17 -08:00
										 |  |  |     command_line->AppendSwitch(switches::kContextIsolation); | 
					
						
							| 
									
										
										
										
											2016-12-08 15:33:51 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-02 20:35:57 +09:00
										 |  |  |   // --background-color.
 | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |   std::string s; | 
					
						
							| 
									
										
										
										
											2018-10-03 12:09:18 +09:00
										 |  |  |   if (GetAsString(&preference_, options::kBackgroundColor, &s)) { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |     command_line->AppendSwitchASCII(switches::kBackgroundColor, s); | 
					
						
							| 
									
										
										
										
											2018-10-03 12:09:18 +09:00
										 |  |  |   } else if (!IsEnabled(options::kOffscreen)) { | 
					
						
							|  |  |  |     // For non-OSR WebContents, we expect to have white background, see
 | 
					
						
							|  |  |  |     // https://github.com/electron/electron/issues/13764 for more.
 | 
					
						
							|  |  |  |     command_line->AppendSwitchASCII(switches::kBackgroundColor, "#fff"); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-04-02 20:35:57 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-19 12:55:20 -07:00
										 |  |  |   // --offscreen
 | 
					
						
							|  |  |  |   if (IsEnabled(options::kOffscreen)) { | 
					
						
							|  |  |  |     command_line->AppendSwitch(options::kOffscreen); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 11:43:30 +09:00
										 |  |  |   // --guest-instance-id, which is used to identify guest WebContents.
 | 
					
						
							| 
									
										
										
										
											2016-05-25 18:05:37 -07:00
										 |  |  |   int guest_instance_id = 0; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsInteger(&preference_, options::kGuestInstanceID, &guest_instance_id)) | 
					
						
							| 
									
										
										
										
											2016-04-13 22:56:11 +09:00
										 |  |  |     command_line->AppendSwitchASCII(switches::kGuestInstanceID, | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |                                     base::NumberToString(guest_instance_id)); | 
					
						
							| 
									
										
										
										
											2015-12-17 21:27:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Pass the opener's window id.
 | 
					
						
							|  |  |  |   int opener_id; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsInteger(&preference_, options::kOpenerID, &opener_id)) | 
					
						
							| 
									
										
										
										
											2016-04-13 22:56:11 +09:00
										 |  |  |     command_line->AppendSwitchASCII(switches::kOpenerID, | 
					
						
							| 
									
										
										
										
											2019-04-20 13:20:37 -04:00
										 |  |  |                                     base::NumberToString(opener_id)); | 
					
						
							| 
									
										
										
										
											2016-01-07 14:10:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 14:57:43 +09:00
										 |  |  | #if defined(OS_MACOSX)
 | 
					
						
							|  |  |  |   // Enable scroll bounce.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (IsEnabled(options::kScrollBounce)) | 
					
						
							| 
									
										
										
										
											2016-05-06 14:57:43 +09:00
										 |  |  |     command_line->AppendSwitch(switches::kScrollBounce); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 10:34:53 +09:00
										 |  |  |   // Custom command line switches.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   auto* args = | 
					
						
							|  |  |  |       preference_.FindKeyOfType("commandLineSwitches", base::Value::Type::LIST); | 
					
						
							|  |  |  |   if (args) { | 
					
						
							|  |  |  |     for (const auto& arg : args->GetList()) { | 
					
						
							|  |  |  |       if (arg.is_string()) { | 
					
						
							|  |  |  |         const auto& arg_val = arg.GetString(); | 
					
						
							|  |  |  |         if (!arg_val.empty()) | 
					
						
							|  |  |  |           command_line->AppendSwitch(arg_val); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-05-29 10:34:53 +09:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-07 14:10:18 +08:00
										 |  |  |   // Enable blink features.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsString(&preference_, options::kEnableBlinkFeatures, &s)) | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |     command_line->AppendSwitchASCII(::switches::kEnableBlinkFeatures, s); | 
					
						
							| 
									
										
										
										
											2016-04-13 22:56:11 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-07 13:42:42 -07:00
										 |  |  |   // Disable blink features.
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsString(&preference_, options::kDisableBlinkFeatures, &s)) | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |     command_line->AppendSwitchASCII(::switches::kDisableBlinkFeatures, s); | 
					
						
							| 
									
										
										
										
											2016-06-07 13:42:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-22 21:10:10 +03:00
										 |  |  |   if (guest_instance_id) { | 
					
						
							|  |  |  |     // Webview `document.visibilityState` tracks window visibility so we need
 | 
					
						
							|  |  |  |     // to let it know if the window happens to be hidden right now.
 | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |     auto* manager = WebViewManager::GetWebViewManager(web_contents_); | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  |     if (manager) { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |       auto* embedder = manager->GetEmbedder(guest_instance_id); | 
					
						
							| 
									
										
										
										
											2017-05-22 21:10:10 +03:00
										 |  |  |       if (embedder) { | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |         auto* relay = NativeWindowRelay::FromWebContents(embedder); | 
					
						
							| 
									
										
										
										
											2018-03-06 15:18:45 +09:00
										 |  |  |         if (relay) { | 
					
						
							| 
									
										
										
										
											2018-10-02 15:14:43 -07:00
										 |  |  |           auto* window = relay->GetNativeWindow(); | 
					
						
							| 
									
										
										
										
											2018-03-06 15:18:45 +09:00
										 |  |  |           if (window) { | 
					
						
							|  |  |  |             const bool visible = window->IsVisible() && !window->IsMinimized(); | 
					
						
							|  |  |  |             if (!visible) { | 
					
						
							|  |  |  |               command_line->AppendSwitch(switches::kHiddenPage); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-06-06 17:02:23 -07:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2017-05-22 21:10:10 +03:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-22 11:24:46 -08:00
										 |  |  |   if (IsEnabled(options::kNodeIntegrationInSubFrames)) | 
					
						
							|  |  |  |     command_line->AppendSwitch(switches::kNodeIntegrationInSubFrames); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-07 18:29:37 -05:00
										 |  |  |   if (IsEnabled(options::kDisableHtmlFullscreenWindowResize)) | 
					
						
							|  |  |  |     command_line->AppendSwitch(switches::kDisableHtmlFullscreenWindowResize); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |   // We are appending args to a webContents so let's save the current state
 | 
					
						
							|  |  |  |   // of our preferences object so that during the lifetime of the WebContents
 | 
					
						
							|  |  |  |   // we can fetch the options used to initally configure the WebContents
 | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   last_preference_ = preference_.Clone(); | 
					
						
							| 
									
										
										
										
											2015-09-05 02:04:09 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 02:12:32 +09:00
										 |  |  | void WebContentsPreferences::OverrideWebkitPrefs( | 
					
						
							| 
									
										
										
										
											2018-03-08 17:01:54 +09:00
										 |  |  |     content::WebPreferences* prefs) { | 
					
						
							| 
									
										
										
										
											2019-04-23 18:14:18 +02:00
										 |  |  |   prefs->javascript_enabled = | 
					
						
							|  |  |  |       IsEnabled(options::kJavaScript, true /* default_value */); | 
					
						
							|  |  |  |   prefs->images_enabled = IsEnabled(options::kImages, true /* default_value */); | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   prefs->text_areas_are_resizable = | 
					
						
							| 
									
										
										
										
											2019-04-23 18:14:18 +02:00
										 |  |  |       IsEnabled(options::kTextAreasAreResizable, true /* default_value */); | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   prefs->navigate_on_drag_drop = | 
					
						
							| 
									
										
										
										
											2019-04-23 18:14:18 +02:00
										 |  |  |       IsEnabled(options::kNavigateOnDragDrop, false /* default_value */); | 
					
						
							| 
									
										
										
										
											2019-01-15 11:30:34 -08:00
										 |  |  |   if (!GetAsAutoplayPolicy(&preference_, "autoplayPolicy", | 
					
						
							|  |  |  |                            &prefs->autoplay_policy)) { | 
					
						
							|  |  |  |     prefs->autoplay_policy = content::AutoplayPolicy::kNoUserGestureRequired; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Check if webgl should be enabled.
 | 
					
						
							| 
									
										
										
										
											2019-04-23 18:14:18 +02:00
										 |  |  |   bool is_webgl_enabled = IsEnabled(options::kWebGL, true /* default_value */); | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   prefs->webgl1_enabled = is_webgl_enabled; | 
					
						
							|  |  |  |   prefs->webgl2_enabled = is_webgl_enabled; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Check if web security should be enabled.
 | 
					
						
							|  |  |  |   bool is_web_security_enabled = | 
					
						
							|  |  |  |       IsEnabled(options::kWebSecurity, true /* default_value */); | 
					
						
							|  |  |  |   prefs->web_security_enabled = is_web_security_enabled; | 
					
						
							|  |  |  |   prefs->allow_running_insecure_content = | 
					
						
							|  |  |  |       IsEnabled(options::kAllowRunningInsecureContent, | 
					
						
							|  |  |  |                 !is_web_security_enabled /* default_value */); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto* fonts_dict = preference_.FindKeyOfType("defaultFontFamily", | 
					
						
							|  |  |  |                                                base::Value::Type::DICTIONARY); | 
					
						
							|  |  |  |   if (fonts_dict) { | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |     base::string16 font; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |     if (GetAsString(fonts_dict, "standard", &font)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |       prefs->standard_font_family_map[content::kCommonScript] = font; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |     if (GetAsString(fonts_dict, "serif", &font)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |       prefs->serif_font_family_map[content::kCommonScript] = font; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |     if (GetAsString(fonts_dict, "sansSerif", &font)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |       prefs->sans_serif_font_family_map[content::kCommonScript] = font; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |     if (GetAsString(fonts_dict, "monospace", &font)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |       prefs->fixed_font_family_map[content::kCommonScript] = font; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |     if (GetAsString(fonts_dict, "cursive", &font)) | 
					
						
							| 
									
										
										
										
											2016-12-28 10:29:55 -08:00
										 |  |  |       prefs->cursive_font_family_map[content::kCommonScript] = font; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |     if (GetAsString(fonts_dict, "fantasy", &font)) | 
					
						
							| 
									
										
										
										
											2016-12-28 10:29:55 -08:00
										 |  |  |       prefs->fantasy_font_family_map[content::kCommonScript] = font; | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |   int size; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsInteger(&preference_, "defaultFontSize", &size)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |     prefs->default_font_size = size; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsInteger(&preference_, "defaultMonospaceFontSize", &size)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |     prefs->default_fixed_font_size = size; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsInteger(&preference_, "minimumFontSize", &size)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |     prefs->minimum_font_size = size; | 
					
						
							|  |  |  |   std::string encoding; | 
					
						
							| 
									
										
										
										
											2018-08-03 14:23:07 -07:00
										 |  |  |   if (GetAsString(&preference_, "defaultEncoding", &encoding)) | 
					
						
							| 
									
										
										
										
											2016-01-19 19:43:23 +05:30
										 |  |  |     prefs->default_encoding = encoding; | 
					
						
							| 
									
										
										
										
											2015-09-05 02:12:32 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-21 22:26:54 +05:30
										 |  |  | WEB_CONTENTS_USER_DATA_KEY_IMPL(WebContentsPreferences) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-05 01:44:22 +09:00
										 |  |  | }  // namespace atom
 |