From 59ae4dd584ee0f23a9f27928984b8c10ae8d1fc2 Mon Sep 17 00:00:00 2001 From: Zhang-hoon Oh Date: Tue, 28 Oct 2014 18:20:40 +0900 Subject: [PATCH] [M34-Merge] Add CSS view-mode media feature support (chromium-efl) To achieve Web App compatibility for Blink on Tizen, CSS "view-mode" media feature support should be resurrected. There is a strong requirement from WRT developers. This patch is the "chromium-efl" side of a two-sided patch. "s-blink" side change-id: I38ce341531cba1069f407d41ef8a5f90f3cd0c71 About M34 Patches: * M34 patches are reorganized. * Commits: ** http://suprem.sec.samsung.net/gerrit/#/c/1047/ ** http://suprem.sec.samsung.net/gerrit/#/c/1906/ ** http://suprem.sec.samsung.net/gerrit/#/c/1907/ * Original Author: ** The original author was kaka.park@samsung.com. Spec.: http://www.w3.org/TR/view-mode/ (http://www.w3.org/TR/2012/REC-view-mode-20120619/) Bug: http://107.108.218.239/bugzilla/show_bug.cgi?id=7803 Reviewed by: Balazs Kelemen, SeungSeop Park, Yi Shen Reviewed by: Balazs Kelemen, SeungSeop Park Change-Id: Ic4fcdecd58d493f190bab4fb6c268c9b2f41f845 Signed-off-by: Zhang-hoon Oh --- .../ewk/efl_integration/private/chromium_glue.cc | 26 ++++++++++++++++++++++ .../ewk/efl_integration/private/chromium_glue.h | 4 ++++ tizen_src/ewk/efl_integration/public/ewk_view.cc | 25 ++++++++------------- .../renderer_host/render_widget_host_view_efl.cc | 12 ++++++++++ .../renderer_host/render_widget_host_view_efl.h | 3 +++ tizen_src/impl/chromium-efl.gyp | 2 ++ tizen_src/impl/common/content_switches_efl.cc | 17 ++++++++++++++ tizen_src/impl/common/content_switches_efl.h | 26 ++++++++++++++++++++++ tizen_src/impl/common/render_messages_efl.h | 8 +++++++ tizen_src/impl/eweb_view.cc | 5 +++++ tizen_src/impl/eweb_view.h | 2 ++ .../impl/renderer/render_process_observer_efl.cc | 11 +++++++++ .../impl/renderer/render_process_observer_efl.h | 8 +++---- .../impl/renderer/render_view_observer_efl.cc | 6 +++++ tizen_src/impl/renderer/render_view_observer_efl.h | 5 +++++ tizen_src/impl/tizen_webview/public/tw_view_mode.h | 21 +++++++++++++++++ tizen_src/impl/tizen_webview/public/tw_webview.cc | 5 +---- tizen_src/impl/tizen_webview/public/tw_webview.h | 3 ++- 18 files changed, 163 insertions(+), 26 deletions(-) create mode 100644 tizen_src/impl/common/content_switches_efl.cc create mode 100644 tizen_src/impl/common/content_switches_efl.h create mode 100644 tizen_src/impl/tizen_webview/public/tw_view_mode.h diff --git a/tizen_src/ewk/efl_integration/private/chromium_glue.cc b/tizen_src/ewk/efl_integration/private/chromium_glue.cc index 2efa17a..4dd8b60 100644 --- a/tizen_src/ewk/efl_integration/private/chromium_glue.cc +++ b/tizen_src/ewk/efl_integration/private/chromium_glue.cc @@ -8,6 +8,8 @@ #include #include +#include "base/logging.h" + #define GLUE_NOTALLOWED(msg) \ fprintf(stderr, "[GLUE ERROR] %s: %s\n", __PRETTY_FUNCTION__, ""#msg); \ assert(0);\ @@ -282,4 +284,28 @@ Ewk_CSP_Header_Type from(tw::ContentSecurityPolicyType val) { GLUE_CAST_END() } +tw::View_Mode to(Ewk_View_Mode val) { + GLUE_CAST_START(val) + GLUE_CAST_TO(EWK_VIEW_MODE_WINDOWED, TW_VIEW_MODE_WINDOWED) + GLUE_CAST_TO(EWK_VIEW_MODE_FLOATING, TW_VIEW_MODE_FLOATING) + GLUE_CAST_TO(EWK_VIEW_MODE_FULLSCREEN, TW_VIEW_MODE_FULLSCREEN) + GLUE_CAST_TO(EWK_VIEW_MODE_MAXIMIZED, TW_VIEW_MODE_MAXIMIZED) + GLUE_CAST_TO(EWK_VIEW_MODE_MINIMIZED, TW_VIEW_MODE_MINIMIZED) + GLUE_CAST_END() + NOTREACHED(); + return TW_VIEW_MODE_WINDOWED; +} + +Ewk_View_Mode from(tw::View_Mode val) { + GLUE_CAST_START(val) + GLUE_CAST_FROM(EWK_VIEW_MODE_WINDOWED, TW_VIEW_MODE_WINDOWED) + GLUE_CAST_FROM(EWK_VIEW_MODE_FLOATING, TW_VIEW_MODE_FLOATING) + GLUE_CAST_FROM(EWK_VIEW_MODE_FULLSCREEN, TW_VIEW_MODE_FULLSCREEN) + GLUE_CAST_FROM(EWK_VIEW_MODE_MAXIMIZED, TW_VIEW_MODE_MAXIMIZED) + GLUE_CAST_FROM(EWK_VIEW_MODE_MINIMIZED, TW_VIEW_MODE_MINIMIZED) + GLUE_CAST_END() + NOTREACHED(); + return EWK_VIEW_MODE_WINDOWED; +} + } // namespace chromium_glue diff --git a/tizen_src/ewk/efl_integration/private/chromium_glue.h b/tizen_src/ewk/efl_integration/private/chromium_glue.h index 9262f66..74854ea 100644 --- a/tizen_src/ewk/efl_integration/private/chromium_glue.h +++ b/tizen_src/ewk/efl_integration/private/chromium_glue.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace chromium_glue { @@ -70,6 +71,9 @@ Ewk_Find_Options from(tw::Find_Options); tw::ContentSecurityPolicyType to(Ewk_CSP_Header_Type); Ewk_CSP_Header_Type from(tw::ContentSecurityPolicyType); +tw::View_Mode to(Ewk_View_Mode); +Ewk_View_Mode from(tw::View_Mode); + } // namespace chromium_glue #endif // CHROMIUM_GLUE_H_ diff --git a/tizen_src/ewk/efl_integration/public/ewk_view.cc b/tizen_src/ewk/efl_integration/public/ewk_view.cc index 19530a7..a198a41 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_view.cc @@ -966,23 +966,16 @@ void ewk_view_session_data_get(Evas_Object* ewkView, const char** data, unsigned Eina_Bool ewk_view_mode_set(Evas_Object* ewkView, Ewk_View_Mode view_mode) { - EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, EINA_FALSE); + EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, EINA_FALSE); -#if !defined(EWK_BRINGUP) -#warning "[M38] view mode is not supported in M38" - switch (view_mode) { - case EWK_VIEW_MODE_WINDOWED: - case EWK_VIEW_MODE_FLOATING: - case EWK_VIEW_MODE_FULLSCREEN: - case EWK_VIEW_MODE_MAXIMIZED: - case EWK_VIEW_MODE_MINIMIZED: - impl->SetViewMode((int)view_mode); - break; - default: - return EINA_FALSE; - } -#endif - return EINA_TRUE; + if (view_mode == EWK_VIEW_MODE_WINDOWED || view_mode == EWK_VIEW_MODE_FULLSCREEN) { + tizen_webview::View_Mode tizen_webview_view_mode; + tizen_webview_view_mode = chromium_glue::to(view_mode); + impl->SetViewMode(tizen_webview_view_mode); + return EINA_TRUE; + } else { + return EINA_FALSE; + } } Eina_Bool ewk_view_split_scroll_overflow_enabled_set(Evas_Object* ewkView, const Eina_Bool enabled) diff --git a/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.cc b/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.cc index e3780db..4668953 100644 --- a/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.cc +++ b/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.cc @@ -42,6 +42,7 @@ #include "third_party/WebKit/public/web/WebInputEvent.h" #include "third_party/WebKit/public/platform/WebScreenInfo.h" #include "third_party/WebKit/public/web/WebTouchPoint.h" +#include "third_party/WebKit/public/web/WebViewModeEnums.h" #include "ui/gfx/display.h" #include "ui/gfx/rect.h" #include "ui/gfx/screen.h" @@ -1547,4 +1548,15 @@ void RenderWidgetHostViewEfl::OnSwapCompositorFrame( ack); } +void RenderWidgetHostViewEfl::SetViewMode(tizen_webview::View_Mode view_mode) { + blink::WebViewMode view_mode_for_blink; + if (view_mode == tizen_webview::TW_VIEW_MODE_WINDOWED) + view_mode_for_blink = blink::WebViewModeWindowed; + else if (view_mode == tizen_webview::TW_VIEW_MODE_FULLSCREEN) + view_mode_for_blink = blink::WebViewModeFullscreen; + else + return; + host_->Send(new ViewMsg_SetViewMode(host_->GetRoutingID(), view_mode_for_blink)); +} + } // namespace content diff --git a/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.h b/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.h index ac30a44..994e1a9 100644 --- a/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.h +++ b/tizen_src/impl/browser/renderer_host/render_widget_host_view_efl.h @@ -223,6 +223,9 @@ class RenderWidgetHostViewEfl void KeyUpEventQueuePush(int key) { keyupev_queue_.push(key); } void ClearQueues(); + // This function sets CSS "view-mode" media feature value. + void SetViewMode(tizen_webview::View_Mode view_mode); + protected: friend class RenderWidgetHostView; diff --git a/tizen_src/impl/chromium-efl.gyp b/tizen_src/impl/chromium-efl.gyp index bb4926f..3f0fd8d 100644 --- a/tizen_src/impl/chromium-efl.gyp +++ b/tizen_src/impl/chromium-efl.gyp @@ -202,6 +202,8 @@ 'common/content_client_efl.cc', 'common/content_client_efl.h', + 'common/content_switches_efl.cc', + 'common/content_switches_efl.h', 'common/message_generator_efl.cc', 'common/message_generator_efl.h', 'common/render_messages_efl.h', diff --git a/tizen_src/impl/common/content_switches_efl.cc b/tizen_src/impl/common/content_switches_efl.cc new file mode 100644 index 0000000..8901b0a --- /dev/null +++ b/tizen_src/impl/common/content_switches_efl.cc @@ -0,0 +1,17 @@ +// Copyright (c) 2014 Samsung Electronics. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "common/content_switches_efl.h" + +namespace switches { + +// Enables the use of view-mode CSS media feature, which allows +// pages to match the different visual presentation modes that can be applied +// to web applications and thereby apply different styling based on these +// different modes using CSS Media Queries. +const char kEnableViewMode[] = "enable-view-mode"; + +// Don't dump stuff here, follow the same order as the header. + +} // namespace switches diff --git a/tizen_src/impl/common/content_switches_efl.h b/tizen_src/impl/common/content_switches_efl.h new file mode 100644 index 0000000..11da214 --- /dev/null +++ b/tizen_src/impl/common/content_switches_efl.h @@ -0,0 +1,26 @@ +// Copyright (c) 2014 Samsung Electronics. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Defines all the "content" command-line switches only for efl, or Tizen. + +#ifndef CONTENT_SWITCHES_EFL_H_ +#define CONTENT_SWITCHES_EFL_H_ + +#include "build/build_config.h" +#include "content/common/content_export.h" + +namespace switches { + +// Enables the use of view-mode CSS media feature, which allows +// pages to match the different visual presentation modes that can be applied +// to web applications and thereby apply different styling based on these +// different modes using CSS Media Queries. +CONTENT_EXPORT extern const char kEnableViewMode[]; + +// DON'T ADD RANDOM STUFF HERE. Put it in the main section above in +// alphabetical order, or in one of the ifdefs (also in order in each section). + +} // namespace switches + +#endif // CONTENT_SWITCHES_EFL_H_ diff --git a/tizen_src/impl/common/render_messages_efl.h b/tizen_src/impl/common/render_messages_efl.h index ae9230d..b10ae04 100644 --- a/tizen_src/impl/common/render_messages_efl.h +++ b/tizen_src/impl/common/render_messages_efl.h @@ -17,11 +17,13 @@ #include "renderer/print_pages_params.h" #include "third_party/WebKit/public/web/WebNavigationPolicy.h" #include "third_party/WebKit/public/web/WebNavigationType.h" +#include "third_party/WebKit/public/web/WebViewModeEnums.h" #include "ui/gfx/ipc/gfx_param_traits.h" #include "url/gurl.h" #include "tizen_webview/public/tw_content_security_policy.h" #include "tizen_webview/public/tw_hit_test.h" +#include "tizen_webview/public/tw_view_mode.h" #include "tizen_webview/public/tw_wrt.h" #include @@ -127,6 +129,8 @@ IPC_STRUCT_TRAITS_BEGIN(tizen_webview::WrtIpcMessageData) IPC_STRUCT_TRAITS_MEMBER(reference_id) IPC_STRUCT_TRAITS_END() +IPC_ENUM_TRAITS(blink::WebViewMode) + // Tells the renderer to clear the cache. IPC_MESSAGE_CONTROL0(EflViewMsg_ClearCache) IPC_MESSAGE_ROUTED0(EwkViewMsg_UseSettingsFont) @@ -278,3 +282,7 @@ IPC_MESSAGE_ROUTED1(EwkViewMsg_WebAppCapableGet, IPC_MESSAGE_ROUTED2(EwkHostMsg_WebAppCapableGet, bool, /* capable */ int /* calback id */) + +// Used to set view mode. +IPC_MESSAGE_ROUTED1(ViewMsg_SetViewMode, + blink::WebViewMode /* view_mode */) diff --git a/tizen_src/impl/eweb_view.cc b/tizen_src/impl/eweb_view.cc index a8b459c..1211730 100644 --- a/tizen_src/impl/eweb_view.cc +++ b/tizen_src/impl/eweb_view.cc @@ -44,6 +44,7 @@ #include "tizen_webview/public/tw_hit_test.h" #include "tizen_webview/public/tw_touch_point.h" +#include "tizen_webview/public/tw_view_mode.h" #include "tizen_webview/public/tw_web_context.h" #include "tizen_webview/public/tw_webview.h" #include "tizen_webview/public/tw_webview_delegate.h" @@ -1653,6 +1654,10 @@ void EWebView::ShowFileChooser(const content::FileChooserParams& params) { file_chooser_->open(); } +void EWebView::SetViewMode(tizen_webview::View_Mode view_mode) { + rwhv()->SetViewMode(view_mode); +} + #ifdef TIZEN_CONTENTS_DETECTION void EWebView::ShowContentsDetectedPopup(const char* message) { popup_controller_.reset(new PopupControllerEfl(this)); diff --git a/tizen_src/impl/eweb_view.h b/tizen_src/impl/eweb_view.h index 73c568e..eed3891 100644 --- a/tizen_src/impl/eweb_view.h +++ b/tizen_src/impl/eweb_view.h @@ -42,6 +42,7 @@ #include "browser/inputpicker/InputPicker.h" #include "third_party/WebKit/Source/platform/text/TextDirection.h" #include "tizen_webview/public/tw_hit_test.h" +#include "tizen_webview/public/tw_view_mode.h" #ifdef TIZEN_CONTENTS_DETECTION #include "popup_controller_efl.h" @@ -383,6 +384,7 @@ class EWebView { void SetLinkMagnifierEnabled(bool enabled); void SetOverrideEncoding(const std::string& encoding); + void SetViewMode(tizen_webview::View_Mode view_mode); /// ---- Event handling bool HandleShow(); diff --git a/tizen_src/impl/renderer/render_process_observer_efl.cc b/tizen_src/impl/renderer/render_process_observer_efl.cc index de10906..742f712 100644 --- a/tizen_src/impl/renderer/render_process_observer_efl.cc +++ b/tizen_src/impl/renderer/render_process_observer_efl.cc @@ -5,12 +5,15 @@ #include "renderer/render_process_observer_efl.h" #include "base/allocator/allocator_extension.h" +#include "base/command_line.h" +#include "common/content_switches_efl.h" #include "content/public/renderer/render_thread.h" #include "third_party/WebKit/public/web/WebCache.h" #include "third_party/sqlite/sqlite3.h" #include "v8/include/v8.h" #include "renderer/content_renderer_client_efl.h" +#include "third_party/WebKit/public/web/WebRuntimeFeatures.h" // XXX: config.h needs to be included before internal blink headers. // XXX2: It'd be great if we did not include internal blibk headers. #include "third_party/WebKit/Source/config.h" @@ -18,8 +21,16 @@ using blink::WebCache; +using blink::WebRuntimeFeatures; using content::RenderThread; +RenderProcessObserverEfl::RenderProcessObserverEfl(ContentRendererClientEfl* content_client) + : content_client_(content_client), webkit_initialized_(false) { + const CommandLine& command_line = *CommandLine::ForCurrentProcess(); + if (command_line.HasSwitch(switches::kEnableViewMode)) + WebRuntimeFeatures::enableCSSViewModeMediaFeature(true); +} + bool RenderProcessObserverEfl::OnControlMessageReceived(const IPC::Message& message) { bool handled = true; diff --git a/tizen_src/impl/renderer/render_process_observer_efl.h b/tizen_src/impl/renderer/render_process_observer_efl.h index 97ae621..c40cfe2 100644 --- a/tizen_src/impl/renderer/render_process_observer_efl.h +++ b/tizen_src/impl/renderer/render_process_observer_efl.h @@ -19,11 +19,9 @@ class ContentRendererClientEfl; class RenderProcessObserverEfl : public content::RenderProcessObserver { public: - explicit RenderProcessObserverEfl(ContentRendererClientEfl* content_client) - : content_client_(content_client), webkit_initialized_(false) { } - - virtual bool OnControlMessageReceived(const IPC::Message& message) override; - virtual void WebKitInitialized() override; + explicit RenderProcessObserverEfl(ContentRendererClientEfl* content_client); + bool OnControlMessageReceived(const IPC::Message& message) override; + void WebKitInitialized() override; void OnClearCache(); void OnPurgeMemory(); diff --git a/tizen_src/impl/renderer/render_view_observer_efl.cc b/tizen_src/impl/renderer/render_view_observer_efl.cc index 9595dec..ca94730 100644 --- a/tizen_src/impl/renderer/render_view_observer_efl.cc +++ b/tizen_src/impl/renderer/render_view_observer_efl.cc @@ -562,3 +562,9 @@ void RenderViewObserverEfl::OnResumeScheduledTasks() if (view) view->resumeScheduledTasks(); } + +void RenderViewObserverEfl::OnSetViewMode(blink::WebViewMode view_mode) { + blink::WebView* view = render_view()->GetWebView(); + if (view) + view->setViewMode(view_mode); +} diff --git a/tizen_src/impl/renderer/render_view_observer_efl.h b/tizen_src/impl/renderer/render_view_observer_efl.h index bc85a97..43216b9 100644 --- a/tizen_src/impl/renderer/render_view_observer_efl.h +++ b/tizen_src/impl/renderer/render_view_observer_efl.h @@ -12,8 +12,10 @@ #include "content/public/renderer/render_view_observer.h" #include "API/ewk_hit_test_private.h" #include "third_party/WebKit/public/platform/WebSize.h" +#include "third_party/WebKit/public/web/WebViewModeEnums.h" #include "tizen_webview/public/tw_content_security_policy.h" #include "tizen_webview/public/tw_hit_test.h" +#include "tizen_webview/public/tw_view_mode.h" namespace base { class FilePath; @@ -69,6 +71,9 @@ class RenderViewObserverEfl: public content::RenderViewObserver { void OnSuspendScheduledTasks(); void OnResumeScheduledTasks(); + // This function sets CSS "view-mode" media feature value. + void OnSetViewMode(blink::WebViewMode view_mode); + blink::WebSize max_scroll_offset_; float cached_min_page_scale_factor_; float cached_max_page_scale_factor_; diff --git a/tizen_src/impl/tizen_webview/public/tw_view_mode.h b/tizen_src/impl/tizen_webview/public/tw_view_mode.h new file mode 100644 index 0000000..13a13a9 --- /dev/null +++ b/tizen_src/impl/tizen_webview/public/tw_view_mode.h @@ -0,0 +1,21 @@ +// Copyright (c) 2014 Samsung Electronics. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef TIZEN_WEBVIEW_PUBLIC_TW_VIEW_MODE_H_ +#define TIZEN_WEBVIEW_PUBLIC_TW_VIEW_MODE_H_ + +namespace tizen_webview { + +// CSS view-mode media feature values. +enum View_Mode { + TW_VIEW_MODE_WINDOWED, + TW_VIEW_MODE_FLOATING, + TW_VIEW_MODE_FULLSCREEN, + TW_VIEW_MODE_MAXIMIZED, + TW_VIEW_MODE_MINIMIZED, +}; + +} // namespace tizen_webview + +#endif // TIZEN_WEBVIEW_PUBLIC_TW_VIEW_MODE_H_ diff --git a/tizen_src/impl/tizen_webview/public/tw_webview.cc b/tizen_src/impl/tizen_webview/public/tw_webview.cc index 5e7188c..6ed055e 100644 --- a/tizen_src/impl/tizen_webview/public/tw_webview.cc +++ b/tizen_src/impl/tizen_webview/public/tw_webview.cc @@ -285,11 +285,8 @@ void WebView::SetOrientationLockCallback(Orientation_Lock_Cb func, void* data) { return impl_->SetOrientationLockCallback(func, data); } -void WebView::SetViewMode(int view_mode) { -#warning "[M37] View Mode is not supported by engine any more" -#if 0 +void WebView::SetViewMode(View_Mode view_mode) { return impl_->SetViewMode(view_mode); -#endif } bool WebView::IsFullscreen() { diff --git a/tizen_src/impl/tizen_webview/public/tw_webview.h b/tizen_src/impl/tizen_webview/public/tw_webview.h index a8def80..58487a7 100644 --- a/tizen_src/impl/tizen_webview/public/tw_webview.h +++ b/tizen_src/impl/tizen_webview/public/tw_webview.h @@ -17,6 +17,7 @@ #include "tizen_webview/public/tw_find_options.h" #include "tizen_webview/public/tw_macro.h" #include "tizen_webview/public/tw_touch_event.h" +#include "tizen_webview/public/tw_view_mode.h" // TODO: Remove this dependency #include "EdgeEffect.h" @@ -133,7 +134,7 @@ class WebView { void SendOrientationChangeEventIfNeeded(int orientation); void SetOrientationLockCallback(Orientation_Lock_Cb func, void* data); // > View mode - void SetViewMode(int view_mode); // mode: windowed, floating, fullscreen, max/minimized + void SetViewMode(tizen_webview::View_Mode view_mode); bool IsFullscreen(); void ExitFullscreen(); // > View Snapshot -- 2.7.4