From b92f912c42eb8101c06122030157c225d4224cb8 Mon Sep 17 00:00:00 2001 From: Arnaud Renevier Date: Tue, 31 Mar 2015 11:53:35 -0700 Subject: [PATCH] Settings are not applied if set before an url is loaded When applying settings (for example by calling ewk_settings_scripts_window_open_set) before an url has been set, the settings are not applied. This is because RenderView has not been created in the render process. And therefore, the ipc messages are not catched. This patch fixes the problem by using using a set of delayed messages in EWebView. Those messages will be send once RenderView is created. ewk_view_mode_set also has the same issue, and the patch fixes the problem. Some actions do not make sense if no url is loaded (for example setting scroll position). For some other actions, I don't have an opinion at the moment (for example setting scale). Change-Id: I4940d25a998c3f1bd7d940285a851dbd645e27bf Signed-off-by: Arnaud Renevier --- tizen_src/ewk/efl_integration/eweb_view.cc | 66 ++++++++++++++++++---- tizen_src/ewk/efl_integration/eweb_view.h | 4 ++ .../efl_integration/web_contents_delegate_efl.cc | 4 ++ .../efl_integration/web_contents_delegate_efl.h | 1 + 4 files changed, 65 insertions(+), 10 deletions(-) diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 1bf2b4a..1c0fcba 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -365,12 +365,20 @@ void EWebView::Initialize() { EWebView::~EWebView() { - std::map::iterator it; - for (it = hit_test_callback_.begin(); it != hit_test_callback_.end(); it++) - delete it->second; - + std::map::iterator hit_test_callback_iterator; + for (hit_test_callback_iterator = hit_test_callback_.begin(); + hit_test_callback_iterator != hit_test_callback_.end(); + hit_test_callback_iterator++) + delete hit_test_callback_iterator->second; hit_test_callback_.clear(); + std::set::iterator delayed_messages_iterator; + for (delayed_messages_iterator = delayed_messages_.begin(); + delayed_messages_iterator != delayed_messages_.end(); + ++delayed_messages_iterator) + delete (*delayed_messages_iterator); + delayed_messages_.clear(); + if (!is_initialized_) { return; } @@ -1019,8 +1027,6 @@ _Ewk_Frame* EWebView::GetMainFrame() { void EWebView::UpdateWebKitPreferences() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - if (!web_contents_ || !web_contents_delegate_) - return; RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); if (!render_view_host) @@ -1028,9 +1034,22 @@ void EWebView::UpdateWebKitPreferences() { web_contents_delegate_->OnUpdateSettings(settings_.get()); render_view_host->UpdateWebkitPreferences(settings_->getPreferences()); - render_view_host->Send( + + IPC::Message* message = new EflViewMsg_UpdateSettings(render_view_host->GetRoutingID(), - settings_->getWebViewSettings())); + settings_->getWebViewSettings()); + + if (render_view_host->IsRenderViewLive()) { + render_view_host->Send(message); + } else { + delayed_messages_.insert(message); + // this message is send in UpdateWebkitPreferences and would otherwise be + // lost + delayed_messages_.insert( + new ViewMsg_UpdateWebPreferences(render_view_host->GetRoutingID(), + settings_->getPreferences())); + } + } void EWebView::SetContentSecurityPolicy(const char* policy, Ewk_CSP_Header_Type type) { @@ -2070,8 +2089,16 @@ void EWebView::ShowFileChooser(const content::FileChooserParams& params) { } void EWebView::SetViewMode(blink::WebViewMode view_mode) { - WebContentsImpl* wci = static_cast(web_contents_.get()); - wci->Send(new ViewMsg_SetViewMode(wci->GetRoutingID(), view_mode)); + RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); + if (!render_view_host) + return; + + IPC::Message* message = new ViewMsg_SetViewMode(render_view_host->GetRoutingID(), view_mode); + if (render_view_host->IsRenderViewLive()) { + render_view_host->Send(message); + } else { + delayed_messages_.insert(message); + } } gfx::Point EWebView::GetContextMenuPosition() const { @@ -2357,3 +2384,22 @@ bool EWebView::HandleTextSelectionUp(int x, int y) { return false; return selection_controller_->TextSelectionUp(x, y); } + +void EWebView::SendDelayedMessages(RenderViewHost* render_view_host) { + DCHECK(render_view_host); + + if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::Bind(&EWebView::SendDelayedMessages, base::Unretained(this), render_view_host)); + return; + } + + for (std::set::iterator iter = delayed_messages_.begin(); + iter != delayed_messages_.end(); ++iter) { + IPC::Message* message = *iter; + message->set_routing_id(render_view_host->GetRoutingID()); + render_view_host->Send(message); + } + + delayed_messages_.clear(); +} diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 3f7e491..e4b3b85 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -445,6 +445,8 @@ class EWebView { gfx::Point GetContextMenuPosition() const; + void SendDelayedMessages(content::RenderViewHost* render_view_host); + /// ---- Event handling bool HandleShow(); bool HandleHide(); @@ -561,6 +563,8 @@ private: gfx::Point context_menu_position_; + std::set delayed_messages_; + std::map hit_test_callback_; // only tizen_webview::WebView can create and delete this EWebView(tizen_webview::WebView* owner, tizen_webview::WebContext*, Evas_Object* smart_object); diff --git a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc index 688930e..08adf82 100644 --- a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc +++ b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc @@ -554,6 +554,10 @@ void WebContentsDelegateEfl::NavigationEntryCommitted(const LoadCommittedDetails web_view_->InvokeBackForwardListChangedCallback(); } +void WebContentsDelegateEfl::RenderViewCreated(RenderViewHost* render_view_host) { + web_view_->SendDelayedMessages(render_view_host); +} + void WebContentsDelegateEfl::RenderProcessGone(base::TerminationStatus status) { // See RenderWidgetHostViewEfl::RenderProcessGone. if (status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION diff --git a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h index 2fb1b23..2ad4f2e 100644 --- a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h +++ b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h @@ -142,6 +142,7 @@ class WebContentsDelegateEfl bool OnMessageReceived(const IPC::Message& message) override; void OnPrintedMetafileReceived(const DidPrintPagesParams& params); void NavigationEntryCommitted(const LoadCommittedDetails& load_details) override; + void RenderViewCreated(RenderViewHost* render_view_host) override; void RenderProcessGone(base::TerminationStatus status) override; bool AddMessageToConsole(WebContents* source, int32 level, -- 2.7.4