Settings are not applied if set before an url is loaded
authorArnaud Renevier <a.renevier@samsung.com>
Tue, 31 Mar 2015 18:53:35 +0000 (11:53 -0700)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 06:57:09 +0000 (06:57 +0000)
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 <a.renevier@samsung.com>
tizen_src/ewk/efl_integration/eweb_view.cc
tizen_src/ewk/efl_integration/eweb_view.h
tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc
tizen_src/ewk/efl_integration/web_contents_delegate_efl.h

index 1bf2b4a..1c0fcba 100644 (file)
@@ -365,12 +365,20 @@ void EWebView::Initialize() {
 
 EWebView::~EWebView()
 {
-  std::map<int64_t, WebViewAsyncRequestHitTestDataCallback*>::iterator it;
-  for (it = hit_test_callback_.begin(); it != hit_test_callback_.end(); it++)
-    delete it->second;
-
+  std::map<int64_t, WebViewAsyncRequestHitTestDataCallback*>::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<IPC::Message*>::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<WebContentsImpl*>(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<IPC::Message*>::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();
+}
index 3f7e491..e4b3b85 100644 (file)
@@ -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<IPC::Message*> delayed_messages_;
+
   std::map<int64_t, WebViewAsyncRequestHitTestDataCallback*> hit_test_callback_;
   // only tizen_webview::WebView can create and delete this
   EWebView(tizen_webview::WebView* owner, tizen_webview::WebContext*, Evas_Object* smart_object);
index 688930e..08adf82 100644 (file)
@@ -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
index 2fb1b23..2ad4f2e 100644 (file)
@@ -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,