From 7945eecc379adfc824c90fc55e378bee64eccd71 Mon Sep 17 00:00:00 2001 From: Grzegorz Czajkowski Date: Fri, 6 Nov 2015 13:04:53 +0100 Subject: [PATCH] Ewk_Settings are not preserved after domain change By default, Chromium creates a renderer process for each instance of a site the user visits [1]. This result in creating a new instance of |content::WebPreferences|. Those preferences are mostly determined on command switches: WebPreferences RenderViewHostImpl::ComputeWebkitPrefs() { WebPreferences prefs; prefs.web_security_enabled = !command_line.HasSwitch(switches::kDisableWebSecurity); ... GetContentClient()->browser()->OverrideWebkitPrefs(this, &prefs); return prefs; } After that, newly determined |prefs| are sent to renderer. The problem is that |Ewk_Settings| has own instance of |content::WebPreferences| which client (through ewk_settings* API) is able to change. Once renderer gets changed, RVHImpl calls ComputeWebkitPrefs() not including client changes at all. In consequence, settings are not sync between Browser and Renderer. This patch ensures creation of Ewk_Settings during EWebView initializaion. First call to ContentBrowserClientEfl::OverrideWebkitPrefs allows using default WebPreferences values which are computed based on command line switches. Successive, override RHVImpl's prefs in favour of Ewk_Settings. Since Ewk_Setings has own store for EFL specific prefs [2] there is a need to handle them separately when renderer (RenderView) is created. What's crucial there, is to send the message to proper |RVH| which is passed via RenderViewCreated. Using |RVH| from EWebView/WebContents at that time would result in sending message to outgoing process. [1] https://www.chromium.org/developers/design-documents/process-models [2] http://165.213.202.130/gerrit/#/c/92971/ Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=14661 Reviewed by: a1.gomes, d.waslicki, sns.park Change-Id: I53f42080243ae6087c05435d586862c2022f7575 Signed-off-by: Grzegorz Czajkowski --- .../efl_integration/content_browser_client_efl.cc | 14 +++++++++-- tizen_src/ewk/efl_integration/eweb_view.cc | 27 +++++++++++----------- tizen_src/ewk/efl_integration/eweb_view.h | 4 +++- .../renderer/render_view_observer_efl.cc | 3 --- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/tizen_src/ewk/efl_integration/content_browser_client_efl.cc b/tizen_src/ewk/efl_integration/content_browser_client_efl.cc index b630887..1a5e040 100644 --- a/tizen_src/ewk/efl_integration/content_browser_client_efl.cc +++ b/tizen_src/ewk/efl_integration/content_browser_client_efl.cc @@ -272,8 +272,18 @@ bool ContentBrowserClientEfl::AllowSetCookie(const GURL& url, } void ContentBrowserClientEfl::OverrideWebkitPrefs( - content::RenderViewHost* render_view_host, - content::WebPreferences* prefs) { + RenderViewHost* render_view_host, + WebPreferences* prefs) { + WebContents* contents = WebContents::FromRenderViewHost(render_view_host); + if (contents) { + EWebView* wv = WebViewFromWebContents(contents); + if (wv->GetSettings()) { + // Since Ewk_Settings has a separate store for EFL specific preferences + // they are handled by EWebView::RenderViewCreated to make sure they will + // not go to outgoing process. + *prefs = wv->GetSettings()->getPreferences(); + } + } // TODO(dennis.oh): See http://107.108.218.239/bugzilla/show_bug.cgi?id=9507 // This pref should be set to false again someday. // This pref is set to true by default diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 064c213..cd070b6 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -308,6 +308,12 @@ void EWebView::Initialize() { new WebViewUserMediaPermissionCallback(NULL, NULL)); unfocus_allow_cb_.reset(new WebViewUnfocusAllowCallback(NULL, NULL)); + DCHECK(web_contents_->GetRenderViewHost()); + // Settings (content::WebPreferences) will be initalized by + // RenderViewHostImpl::ComputeWebkitPrefs() based on command line switches. + settings_.reset(new Ewk_Settings(evas_object_, + web_contents_->GetRenderViewHost()->GetWebkitPreferences())); + base::CommandLine *cmdline = base::CommandLine::ForCurrentProcess(); if (cmdline->HasSwitch(switches::kTouchEvents)) SetTouchEventsEnabled(true); @@ -856,17 +862,6 @@ const char* EWebView::GetSelectedText() const { return UTF16ToUTF8(rwhv()->GetSelectedText()).c_str(); } -Ewk_Settings* EWebView::GetSettings() { - RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); - if (!render_view_host) - return NULL; - - if (!settings_) - settings_.reset(new Ewk_Settings(evas_object_, render_view_host->GetWebkitPreferences())); - - return settings_.get(); -} - _Ewk_Frame* EWebView::GetMainFrame() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); @@ -890,6 +885,12 @@ void EWebView::UpdateWebKitPreferences() { web_contents_delegate_->OnUpdateSettings(settings_.get()); render_view_host->UpdateWebkitPreferences(settings_->getPreferences()); + UpdateWebkitPreferencesEfl(render_view_host); +} + +void EWebView::UpdateWebkitPreferencesEfl(RenderViewHost* render_view_host) { + DCHECK(render_view_host); + IPC::Message* message = new EwkSettingsMsg_UpdateWebKitPreferencesEfl(render_view_host->GetRoutingID(), settings_->getPreferencesEfl()); @@ -1257,8 +1258,7 @@ void EWebView::MoveCaret(const gfx::Point& point) { } void EWebView::QuerySelectionStyle() { - Ewk_Settings* settings = GetSettings(); - if (settings->textStyleStateState()) { + if (GetSettings()->textStyleStateState()) { RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); render_view_host->Send(new EwkViewMsg_GetSelectionStyle(render_view_host->GetRoutingID())); } @@ -1445,6 +1445,7 @@ void EWebView::OnCopyFromBackingStore(bool success, const SkBitmap& bitmap) { void EWebView::RenderViewCreated(RenderViewHost* render_view_host) { SendDelayedMessages(render_view_host); + UpdateWebkitPreferencesEfl(render_view_host); RenderWidgetHostViewEfl* view = static_cast(render_view_host->GetView()); if (view) view->SetEvasHandler(evas_event_handler_); diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 217eb10..c578b8d 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -265,7 +265,7 @@ class EWebView { const char* GetUserAgent() const; const char* GetUserAgentAppName() const; const char* GetSelectedText() const; - Ewk_Settings* GetSettings(); + Ewk_Settings* GetSettings() { return settings_.get(); } _Ewk_Frame* GetMainFrame(); void UpdateWebKitPreferences(); void LoadHTMLString(const char* html, const char* base_uri, const char* unreachable_uri); @@ -480,6 +480,8 @@ class EWebView { void ShowContextMenuInternal(const content::ContextMenuParams&); + void UpdateWebkitPreferencesEfl(content::RenderViewHost*); + scoped_refptr evas_event_handler_; scoped_refptr context_; scoped_refptr old_context_; diff --git a/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc b/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc index 8295088..935c4d0 100644 --- a/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc +++ b/tizen_src/ewk/efl_integration/renderer/render_view_observer_efl.cc @@ -603,9 +603,6 @@ void RenderViewObserverEfl::OnSetViewMode(blink::WebViewMode view_mode) { void RenderViewObserverEfl::OnUpdateWebKitPreferencesEfl(const WebPreferencesEfl& web_preferences_efl) { - // FIXME(g.czajkowski@samsung.com) web_preferences_efl should be probably stored - // to be restored when new RenderView is being created. - // Otherwise, changed settings will *do not* apply to newly created WebView. blink::WebView* view = render_view()->GetWebView(); if (view && view->settings()) { view->settings()->setShrinksViewportContentToFit(web_preferences_efl.shrinks_viewport_content_to_fit); -- 2.7.4