Merge branch 'tizen_30' into tizen_40 submit/tizen/20170109.135547
authorjaekuk, lee <juku1999@samsung.com>
Mon, 9 Jan 2017 13:55:28 +0000 (22:55 +0900)
committerjaekuk, lee <juku1999@samsung.com>
Mon, 9 Jan 2017 13:55:28 +0000 (22:55 +0900)
runtime/browser/native_window.cc
runtime/browser/native_window.h
runtime/browser/runtime_process.cc
runtime/browser/web_application.cc
runtime/browser/web_application.h

index 5712dff..9350c66 100755 (executable)
@@ -72,6 +72,7 @@ NativeWindow::NativeWindow()
     : window_(NULL),
       window_type_(Type::NORMAL),
       initialized_(false),
+      currentViewModeFullScreen_(false),
       focus_(NULL),
       content_(NULL),
       rotation_(0),
@@ -271,6 +272,10 @@ void NativeWindow::SetAutoRotation() {
   rotation_ = elm_win_rotation_get(window_);
 }
 
+void NativeWindow::SetCurrentViewModeFullScreen(bool mode) {
+  currentViewModeFullScreen_ = mode;
+}
+
 void NativeWindow::Show() {
   evas_object_show(window_);
 }
@@ -285,7 +290,7 @@ void NativeWindow::InActive() {
 
 void NativeWindow::FullScreen(bool enable) {
   elm_win_indicator_opacity_set(window_,
-      enable ? ELM_WIN_INDICATOR_TRANSPARENT : ELM_WIN_INDICATOR_OPAQUE);
+      (enable || currentViewModeFullScreen_) ? ELM_WIN_INDICATOR_TRANSPARENT : ELM_WIN_INDICATOR_OPAQUE);
 }
 
 #ifdef MANUAL_ROTATE_FEATURE_SUPPORT
index e939a01..7d23aa0 100755 (executable)
@@ -50,6 +50,7 @@ class NativeWindow {
   void SetRotationLock(int degree);
   void SetRotationLock(ScreenOrientation orientation);
   void SetAutoRotation();
+  void SetCurrentViewModeFullScreen(bool mode);
   int AddRotationHandler(RotationHandler handler);
   void RemoveRotationHandler(int id);
   int rotation() const { return rotation_; }
@@ -78,6 +79,7 @@ class NativeWindow {
   void DidFocusChanged(bool got);
 
   bool initialized_;
+  bool currentViewModeFullScreen_;
   Evas_Object* focus_;
   Evas_Object* content_;
   int rotation_;
index 1d01b99..859aa3a 100755 (executable)
@@ -133,6 +133,7 @@ int real_main(int argc, char* argv[]) {
         runtime::Runtime::MakeRuntime(appdata);
     ret = runtime->Exec(argc, argv);
     if (runtime->is_on_terminate_called) {
+      LOGGER(INFO) << "Defer termination of main loop";
       ecore_main_loop_begin();
     }
     runtime.reset();
index 4d8fe2c..9a5d50b 100755 (executable)
@@ -222,16 +222,8 @@ static void InitializeNotificationCallback(Ewk_Context* ewk_context,
 static Eina_Bool ExitAppIdlerCallback(void* data) {
   WebApplication* app = static_cast<WebApplication*>(data);
 
-  if (app) {
-    std::list<WebView*> vstack = app->view_stack();
-    auto it = vstack.begin();
-
-    for (; it != vstack.end(); ++it) {
-      vstack.front()->SetVisibility(false);
-      (*it)->Suspend();
-      ewk_view_page_close((*it)->evas_object());
-    }
-  }
+  if (app)
+    app->Terminate();
 
   return ECORE_CALLBACK_CANCEL;
 }
@@ -296,7 +288,6 @@ WebApplication::WebApplication(
       ewk_context_(
           ewk_context_new_with_injected_bundle_path(INJECTED_BUNDLE_PATH)),
       has_ownership_of_ewk_context_(true),
-      is_terminated_by_callback_(false),
       window_(window),
       appid_(app_data->app_id()),
       app_data_(app_data),
@@ -314,7 +305,6 @@ WebApplication::WebApplication(
       verbose_mode_(false),
       ewk_context_(context),
       has_ownership_of_ewk_context_(false),
-      is_terminated_by_callback_(false),
       window_(window),
       appid_(app_data->app_id()),
       app_data_(app_data),
@@ -441,6 +431,7 @@ bool WebApplication::Initialize() {
 
   if (app_data_->widget_info() != NULL &&
         app_data_->widget_info()->view_modes() == "fullscreen") {
+      window_->SetCurrentViewModeFullScreen(true);
       window_->FullScreen(true);
   }
 
@@ -495,7 +486,7 @@ void WebApplication::Launch(std::unique_ptr<common::AppControl> appcontrol) {
   // Setup View
   WebView* view = new WebView(window_, ewk_context_);
   SetupWebView(view);
-  SetupWebViewTizenApplicationInfo(view);
+  SetupWebViewCompatibilitySettings(view);
 
   std::unique_ptr<common::ResourceManager::Resource> res =
       resource_manager_->GetStartResource(appcontrol.get());
@@ -579,7 +570,7 @@ void WebApplication::AppControl(
     ClearViewStack();
     WebView* view = view_stack_.front();
     SetupWebView(view);
-    SetupWebViewTizenApplicationInfo(view);
+    SetupWebViewCompatibilitySettings(view);
     view->SetDefaultEncoding(res->encoding());
     view->LoadUrl(res->uri(), res->mime());
     window_->SetContent(view->evas_object());
@@ -646,13 +637,13 @@ void WebApplication::Suspend() {
 }
 
 void WebApplication::Terminate() {
-  is_terminated_by_callback_ = false;
   if (terminator_) {
     terminator_();
   } else {
     elm_exit();
   }
   auto extension_server = extensions::XWalkExtensionServer::GetInstance();
+  LOGGER(INFO) << "Shutdown extension server";
   extension_server->Shutdown();
 }
 
@@ -673,42 +664,35 @@ void WebApplication::OnCreatedNewWebView(WebView* /*view*/, WebView* new_view) {
     view_stack_.front()->SetVisibility(false);
 
   SetupWebView(new_view);
-  SetupWebViewTizenApplicationInfo(new_view);
+  SetupWebViewCompatibilitySettings(new_view);
   view_stack_.push_front(new_view);
   window_->SetContent(new_view->evas_object());
 }
 
 void WebApplication::RemoveWebViewFromStack(WebView* view) {
-  if (view_stack_.size() == 0) {
-    if (is_terminated_by_callback_) {
-      Terminate();
-    } else {
-      return;
-    }
-  }
+  if (view_stack_.size() == 0)
+    return;
 
   WebView* current = view_stack_.front();
   if (current == view) {
+    // In order to prevent the crash issue due to the callback
+    // which occur after destroying WebApplication class,
+    // we have to set the 'SetEventListener' to NULL.
+    view->SetEventListener(NULL);
     view_stack_.pop_front();
   } else {
     auto found = std::find(view_stack_.begin(), view_stack_.end(), view);
     if (found != view_stack_.end()) {
-      view_stack_.erase(found);
-    }
-  }
-
-  if (view_stack_.size() == 0) {
-    if (is_terminated_by_callback_) {
       // In order to prevent the crash issue due to the callback
       // which occur after destroying WebApplication class,
       // we have to set the 'SetEventListener' to NULL.
       view->SetEventListener(NULL);
-      Terminate();
-    } else {
-      view->Suspend();
-      ewk_view_page_close(view->evas_object());
-      return;
+      view_stack_.erase(found);
     }
+  }
+
+  if (view_stack_.size() == 0) {
+    Terminate();
   } else if (current != view_stack_.front()) {
     view_stack_.front()->SetVisibility(true);
     window_->SetContent(view_stack_.front()->evas_object());
@@ -724,12 +708,12 @@ void WebApplication::RemoveWebViewFromStack(WebView* view) {
 }
 
 void WebApplication::OnClosedWebView(WebView* view) {
-  is_terminated_by_callback_ = true;
   // Reply to javascript dialog for preventing freeze issue.
   view->ReplyToJavascriptDialog();
   RemoveWebViewFromStack(view);
 
   if (runtime::Runtime::is_on_terminate_called) {
+    LOGGER(INFO) << "Execute deferred termination of main loop";
     ecore_main_loop_quit();
   }
 }
@@ -847,7 +831,7 @@ void WebApplication::OnHardwareKey(WebView* view, const std::string& keyname) {
       if(enabled)
         view->EvalJavascript(kBackKeyEventScript);
       if (!view->Backward()) {
-        RemoveWebViewFromStack(view_stack_.front());
+        Terminate();
       }
     }
     return;
@@ -862,7 +846,7 @@ void WebApplication::OnHardwareKey(WebView* view, const std::string& keyname) {
         (app_data_->widget_info() != NULL &&
          app_data_->widget_info()->view_modes() == "windowed")) {
       if (!view->Backward()) {
-        RemoveWebViewFromStack(view_stack_.front());
+        Terminate();
       }
     }
   } else if (enabled && kKeyNameMenu == keyname) {
@@ -1067,14 +1051,15 @@ void WebApplication::SetupWebView(WebView* view) {
   }
 }
 
-void WebApplication::SetupWebViewTizenApplicationInfo(WebView* view) {
+void WebApplication::SetupWebViewCompatibilitySettings(WebView* view) {
   if (tizenWebKitCompatibilityEnabled()) {
     Ewk_Settings* settings = ewk_view_settings_get(view->evas_object());
     ewk_settings_tizen_compatibility_mode_set(settings,
             m_tizenCompatibilitySettings.m_major,
             m_tizenCompatibilitySettings.m_minor,
             m_tizenCompatibilitySettings.m_release);
-    }
+    ewk_settings_text_autosizing_enabled_set(settings, EINA_FALSE);
+  }
 }
 
 bool WebApplication::OnDidNavigation(WebView* /*view*/,
index 1c31d21..751e809 100755 (executable)
@@ -114,7 +114,7 @@ class WebApplication : public WebView::EventListener {
   void SendAppControlEvent();
   void LaunchInspector(common::AppControl* appcontrol);
   void SetupWebView(WebView* view);
-  void SetupWebViewTizenApplicationInfo(WebView* view);
+  void SetupWebViewCompatibilitySettings(WebView* view);
   void RemoveWebViewFromStack(WebView* view);
 
   void SetupTizenVersion();
@@ -132,7 +132,6 @@ class WebApplication : public WebView::EventListener {
   bool lang_changed_mode_;
   Ewk_Context* ewk_context_;
   bool has_ownership_of_ewk_context_;
-  bool is_terminated_by_callback_;
   NativeWindow* window_;
   std::string appid_;
   std::string app_data_path_;