#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
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>
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_);
+ }
+ }
+}
+
}
ContentBrowserClientEfl();
~ContentBrowserClientEfl() override;
+ typedef base::Callback<void(const std::string&)> AcceptLangsChangedCallback;
std::unique_ptr<BrowserMainParts> CreateBrowserMainParts(
const MainFunctionParams& parameters) override;
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;
static void DispatchPopupBlockedOnUIThread(int render_process_id,
const GURL& target_url);
+ void NotifyAcceptLangsChanged();
+
BrowserMainPartsEfl* browser_main_parts_efl_;
#if defined(ENABLE_NOTIFICATIONS)
// 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);
};
// 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();
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,
#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"
void HandleZoomGesture(blink::WebGestureEvent& event);
void ClosePage();
+ void SyncAcceptLanguages(const std::string& accept_languages);
+
private:
void InitializeContent();
void SendDelayedMessages(content::RenderViewHost* render_view_host);
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;
#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() {
}
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 {
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);
};
#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);
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)