[M85 Migration] Update Accept-Language field on platform language change 73/247373/1
authorGajendra N <gajendra.n@samsung.com>
Mon, 2 Nov 2020 16:54:35 +0000 (22:24 +0530)
committerGajendra N <gajendra.n@samsung.com>
Tue, 10 Nov 2020 07:34:39 +0000 (13:04 +0530)
The original patch[1] updated accept languages only for http header.
However we should update it for RendererPreferences as well, because
it can be required by JS script, such as navigator.language.

This patch moves listener for accept languages from
HttpUserAgentSettingsEfl to ContentBrowserClientEfl and stores it.

Plus, sychronizes with renderer whenever accept language or preferred
language is changed.

[1]: https://review.tizen.org/gerrit/#/c/95478/

Reference:
https://review.tizen.org/gerrit/229501

(Cherry-picked from 21f645fc7510973ce8b636f9e9f597c877281ad2)

Change-Id: I509663a5bfb398ca7797426bfd277ae03738695c
Signed-off-by: Gajendra N <gajendra.n@samsung.com>
tizen_src/ewk/efl_integration/content_browser_client_efl.cc
tizen_src/ewk/efl_integration/content_browser_client_efl.h
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/http_user_agent_settings_efl.cc
tizen_src/ewk/efl_integration/http_user_agent_settings_efl.h
tizen_src/ewk/efl_integration/public/ewk_context.cc

index 7ba928f..85f3601 100644 (file)
@@ -32,6 +32,7 @@
 #if !defined(EWK_BRINGUP)
 #include "browser/geolocation/location_provider_efl.h"
 #endif
+#include <vconf.h>
 #include "content/browser/speech/tts_message_filter_efl.h"
 #endif
 
@@ -48,17 +49,52 @@ using content::BrowserThread;
 
 namespace content {
 
+namespace {
+
+const char* const kDefaultAcceptLanguages = "en-us,en";
+
+#if defined(OS_TIZEN)
+void PlatformLanguageChanged(keynode_t* keynode, void* data) {
+  char* lang = vconf_get_str(VCONFKEY_LANGSET);
+  if (!lang)
+    return;
+
+  std::string accept_languages(lang);
+  std::replace(accept_languages.begin(), accept_languages.end(), '_', '-');
+
+  size_t dot_position = accept_languages.find('.');
+  if (dot_position != std::string::npos)
+    accept_languages = accept_languages.substr(0, dot_position);
+
+  static_cast<content::ContentBrowserClientEfl*>(data)->SetAcceptLangs(
+      accept_languages);
+
+  free(lang);
+}
+#endif  // defined(OS_TIZEN)
+
+}  // namespace
+
 ContentBrowserClientEfl::ContentBrowserClientEfl()
     : browser_main_parts_efl_(nullptr),
 #if defined(ENABLE_NOTIFICATIONS)
       notification_controller_(new NotificationControllerEfl),
 #endif
-      browser_context_efl_(nullptr) {
+      browser_context_efl_(nullptr),
+      accept_langs_(kDefaultAcceptLanguages) {
+#if defined(OS_TIZEN)
+  PlatformLanguageChanged(nullptr, this);
+  vconf_notify_key_changed(VCONFKEY_LANGSET, PlatformLanguageChanged, this);
+#endif
 }
 
 ContentBrowserClientEfl::~ContentBrowserClientEfl() {
   if (browser_context_efl_)
     delete browser_context_efl_;
+
+#if defined(OS_TIZEN)
+  vconf_ignore_key_changed(VCONFKEY_LANGSET, PlatformLanguageChanged);
+#endif
 }
 
 std::unique_ptr<BrowserMainParts>
@@ -361,4 +397,60 @@ std::string ContentBrowserClientEfl::GetProduct() {
 std::string ContentBrowserClientEfl::GetUserAgent() {
   return EflWebView::VersionInfo::GetInstance()->DefaultUserAgent();
 }
+
+std::string ContentBrowserClientEfl::GetAcceptLangs(BrowserContext* context) {
+  if (!preferred_langs_.empty())
+    return preferred_langs_;
+
+  return accept_langs_;
+}
+
+void ContentBrowserClientEfl::SetAcceptLangs(const std::string& accept_langs) {
+  if (accept_langs.empty() || accept_langs_ == accept_langs)
+    return;
+
+  accept_langs_ = accept_langs;
+
+  if (preferred_langs_.empty())
+    NotifyAcceptLangsChanged();
+}
+
+void ContentBrowserClientEfl::SetPreferredLangs(
+    const std::string& preferred_langs) {
+  if (preferred_langs_ == preferred_langs)
+    return;
+
+  preferred_langs_ = preferred_langs;
+
+  NotifyAcceptLangsChanged();
+}
+
+void ContentBrowserClientEfl::AddAcceptLangsChangedCallback(
+    const AcceptLangsChangedCallback& callback) {
+  accept_langs_changed_callbacks_.push_back(callback);
+}
+
+void ContentBrowserClientEfl::RemoveAcceptLangsChangedCallback(
+    const AcceptLangsChangedCallback& callback) {
+  for (size_t i = 0; i < accept_langs_changed_callbacks_.size(); ++i) {
+    if (accept_langs_changed_callbacks_[i] == callback) {
+      accept_langs_changed_callbacks_.erase(
+          accept_langs_changed_callbacks_.begin() + i);
+      return;
+    }
+  }
+}
+
+void ContentBrowserClientEfl::NotifyAcceptLangsChanged() {
+  for (const AcceptLangsChangedCallback& callback :
+       accept_langs_changed_callbacks_) {
+    if (!callback.is_null()) {
+      if (preferred_langs_.empty())
+        callback.Run(accept_langs_);
+      else
+        callback.Run(preferred_langs_);
+    }
+  }
+}
+
 }
index 13823a6..7494684 100644 (file)
@@ -33,6 +33,7 @@ class ContentBrowserClientEfl : public ContentBrowserClient {
 
   ContentBrowserClientEfl();
   ~ContentBrowserClientEfl() override;
+  typedef base::Callback<void(const std::string&)> AcceptLangsChangedCallback;
 
   std::unique_ptr<BrowserMainParts> CreateBrowserMainParts(
       const MainFunctionParams& parameters) override;
@@ -111,6 +112,14 @@ class ContentBrowserClientEfl : public ContentBrowserClient {
   std::string GetProduct() override;
   std::string GetUserAgent() override;
 
+  std::string GetAcceptLangs(BrowserContext* context) override;
+  void SetAcceptLangs(const std::string& accept_langs);
+  void SetPreferredLangs(const std::string& preferred_langs);
+  void AddAcceptLangsChangedCallback(
+      const AcceptLangsChangedCallback& callback);
+  void RemoveAcceptLangsChangedCallback(
+      const AcceptLangsChangedCallback& callback);
+
  private:
   scoped_refptr<network::SharedURLLoaderFactory>
   GetSystemSharedURLLoaderFactory() override;
@@ -121,6 +130,8 @@ class ContentBrowserClientEfl : public ContentBrowserClient {
   static void DispatchPopupBlockedOnUIThread(int render_process_id,
                                              const GURL& target_url);
 
+  void NotifyAcceptLangsChanged();
+
   BrowserMainPartsEfl* browser_main_parts_efl_;
 
 #if defined(ENABLE_NOTIFICATIONS)
@@ -132,6 +143,9 @@ class ContentBrowserClientEfl : public ContentBrowserClient {
   // URLLoaderFactory backed by the NetworkContext returned by GetContext(), so
   // consumers don't all need to create their own factory.
   scoped_refptr<SharedURLLoaderFactoryEfl> shared_url_loader_factory_;
+  std::string accept_langs_;
+  std::string preferred_langs_;
+  std::vector<AcceptLangsChangedCallback> accept_langs_changed_callbacks_;
 
   DISALLOW_COPY_AND_ASSIGN(ContentBrowserClientEfl);
 };
index 5960294..bace01b 100644 (file)
@@ -213,9 +213,21 @@ void EWebView::Initialize() {
   // allow this object and its children to get a focus
   elm_object_tree_focus_allow_set(native_view_, EINA_TRUE);
   is_initialized_ = true;
+
+  auto cbce = static_cast<ContentBrowserClientEfl*>(
+      content::GetContentClientExport()->browser());
+  // Initialize accept languages
+  SyncAcceptLanguages(cbce->GetAcceptLangs(nullptr));
+  accept_langs_changed_callback_ =
+      base::Bind(&EWebView::SyncAcceptLanguages, base::Unretained(this));
+  cbce->AddAcceptLangsChangedCallback(accept_langs_changed_callback_);
 }
 
 EWebView::~EWebView() {
+  auto cbce = static_cast<ContentBrowserClientEfl*>(
+      content::GetContentClientExport()->browser());
+  cbce->RemoveAcceptLangsChangedCallback(accept_langs_changed_callback_);
+
   std::map<int64_t, WebViewAsyncRequestHitTestDataCallback*>::iterator
       hit_test_callback_iterator;
   for (hit_test_callback_iterator = hit_test_callback_.begin();
@@ -2121,6 +2133,11 @@ void EWebView::InvokeWebProcessCrashedCallback() {
                    last_url.possibly_invalid_spec().c_str());
 }
 
+void EWebView::SyncAcceptLanguages(const std::string& accept_languages) {
+  web_contents_->GetMutableRendererPrefs()->accept_languages = accept_languages;
+  web_contents_->SyncRendererPrefs();
+}
+
 void EWebView::HandleRendererProcessCrash() {
   base::PostTask(FROM_HERE, {BrowserThread::UI},
                  base::Bind(&EWebView::InvokeWebProcessCrashedCallback,
index 071ba8d..9d3a3fc 100644 (file)
@@ -31,6 +31,7 @@
 #include "content/public/browser/web_contents_efl_delegate.h"
 #include "content/public/common/input_event_ack_state.h"
 #include "content/public/common/menu_item.h"
+#include "content_browser_client_efl.h"
 #include "context_menu_controller_efl.h"
 #include "eweb_context.h"
 #include "eweb_view_callbacks.h"
@@ -474,6 +475,8 @@ class EWebView {
   void HandleZoomGesture(blink::WebGestureEvent& event);
   void ClosePage();
 
+  void SyncAcceptLanguages(const std::string& accept_languages);
+
  private:
   void InitializeContent();
   void SendDelayedMessages(content::RenderViewHost* render_view_host);
@@ -610,6 +613,9 @@ class EWebView {
   std::vector<IPC::Message*> delayed_messages_;
 
   std::map<int64_t, WebViewAsyncRequestHitTestDataCallback*> hit_test_callback_;
+
+  content::ContentBrowserClientEfl::AcceptLangsChangedCallback
+      accept_langs_changed_callback_;
 };
 
 const unsigned int g_default_tilt_motion_sensitivity = 3;
index 738aa0f..0f33529 100644 (file)
@@ -5,12 +5,7 @@
 #include "http_user_agent_settings_efl.h"
 
 #include "content/common/content_client_export.h"
-#include "content/public/common/content_client.h"
-
-namespace {
-  const std::string ACCEPT_LANGUAGES_DEFAULT_VALUE = "en-us,en";
-  std::string accept_language_ = ACCEPT_LANGUAGES_DEFAULT_VALUE;
-}
+#include "content/public/browser/content_browser_client.h"
 
 HttpUserAgentSettingsEfl::HttpUserAgentSettingsEfl() {
 }
@@ -18,15 +13,8 @@ HttpUserAgentSettingsEfl::HttpUserAgentSettingsEfl() {
 HttpUserAgentSettingsEfl::~HttpUserAgentSettingsEfl() {
 }
 
-void HttpUserAgentSettingsEfl::SetAcceptLanguage(const std::string& accept_language) {
-  if (accept_language.length() == 0) {
-    return;
-  }
-  accept_language_ = accept_language;
-}
-
 std::string HttpUserAgentSettingsEfl::GetAcceptLanguage() const {
-  return accept_language_;
+  return content::GetContentClientExport()->browser()->GetAcceptLangs(nullptr);
 }
 
 std::string HttpUserAgentSettingsEfl::GetUserAgent() const {
index db45c98..0365e89 100644 (file)
 class HttpUserAgentSettingsEfl : public net::HttpUserAgentSettings {
  public:
   HttpUserAgentSettingsEfl();
-  virtual ~HttpUserAgentSettingsEfl();
-
-  // Set Accept language. In case when empty argument is passed keep previously assigned.
-  static void SetAcceptLanguage(const std::string&);
+  ~HttpUserAgentSettingsEfl() override;
 
   // HttpUserAgentSettings implementation
-  virtual std::string GetAcceptLanguage() const override;
-  virtual std::string GetUserAgent() const override;
+  std::string GetAcceptLanguage() const override;
+  std::string GetUserAgent() const override;
 
+ private:
   DISALLOW_COPY_AND_ASSIGN(HttpUserAgentSettingsEfl);
 };
 
index d4da429..89c0f12 100644 (file)
@@ -29,7 +29,9 @@
 #include "browser/favicon/favicon_database_p.h"
 #include "browser/vibration/vibration_provider_client.h"
 #include "browser_context_efl.h"
-#include "http_user_agent_settings_efl.h"
+#include "content_browser_client_efl.h"
+#include "content_main_delegate_efl.h"
+#include "ewk_global_data.h"
 #include "public/ewk_security_origin.h"
 #include "private/ewk_context_private.h"
 #include "private/ewk_private.h"
 #include "private/ewk_cookie_manager_private.h"
 #include "private/ewk_context_form_autofill_profile_private.h"
 
+using content::ContentBrowserClientEfl;
+using content::ContentMainDelegateEfl;
+
+namespace {
+ContentBrowserClientEfl* GetContentBrowserClient() {
+  if (!EwkGlobalData::IsInitialized()) {
+    return nullptr;
+  }
+
+  ContentMainDelegateEfl& cmde =
+      EwkGlobalData::GetInstance()->GetContentMainDelegateEfl();
+  ContentBrowserClientEfl* cbce =
+      static_cast<ContentBrowserClientEfl*>(cmde.GetContentBrowserClient());
+
+  return cbce;
+}
+}
+
 Ewk_Context *ewk_context_ref(Ewk_Context *context)
 {
   EINA_SAFETY_ON_NULL_RETURN_VAL(context, NULL);
@@ -608,22 +628,29 @@ Eina_Bool ewk_context_favicon_database_directory_set(Ewk_Context* ewkContext, co
 
 void ewk_context_preferred_languages_set(Eina_List* languages)
 {
-  std::string preferredLanguages;
+  ContentBrowserClientEfl* cbce = GetContentBrowserClient();
+  EINA_SAFETY_ON_NULL_RETURN(cbce);
+
+  std::string preferred_languages;
 
   Eina_List* it;
   void* data;
 
   EINA_LIST_FOREACH(languages, it, data) {
     if (data) {
-      preferredLanguages.append(static_cast<char*>(data));
+      preferred_languages.append(static_cast<char*>(data));
       if (it->next) {
-        preferredLanguages.append(",");
+        preferred_languages.append(",");
       }
     }
   }
-  std::transform(preferredLanguages.begin(), preferredLanguages.end(), preferredLanguages.begin(), ::tolower);
-  std::replace(preferredLanguages.begin(), preferredLanguages.end(), '_', '-');
-  HttpUserAgentSettingsEfl::SetAcceptLanguage(preferredLanguages);
+  std::transform(preferred_languages.begin(),
+                 preferred_languages.end(),
+                 preferred_languages.begin(), ::tolower);
+  std::replace(preferred_languages.begin(),
+               preferred_languages.end(), '_', '-');
+
+  cbce->SetPreferredLangs(preferred_languages);
 }
 
 Ewk_Storage_Manager* ewk_context_storage_manager_get(const Ewk_Context* ewkContext)