[WK2] call ewkViewFrameRendered after nonempty layout finished.
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / API / efl / PageClientImpl.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 2366918..8583168
 #include "PageClientImpl.h"
 
 #include "EwkViewImpl.h"
+#include "InputMethodContextEfl.h"
 #include "NativeWebKeyboardEvent.h"
 #include "NotImplemented.h"
 #include "TransformationMatrix.h"
 #include "WebContext.h"
 #include "WebContextMenuProxy.h"
 #include "WebPageProxy.h"
+#include "WebPopupMenuProxyEfl.h"
 #include "ewk_context.h"
 #include "ewk_context_private.h"
 #include "ewk_download_job.h"
 #include "ewk_download_job_private.h"
-#include "ewk_view_private.h"
+#include "ewk_view.h"
 
 #if OS(TIZEN)
 #include "DrawingAreaProxyImpl.h"
@@ -81,23 +83,26 @@ using namespace std;
 
 namespace WebKit {
 
-PageClientImpl::PageClientImpl(WebContext* context, WebPageGroup* pageGroup, Evas_Object* viewWidget)
-    : m_viewWidget(viewWidget)
+PageClientImpl::PageClientImpl(EwkViewImpl* viewImpl)
+    : m_viewImpl(viewImpl)
 #if OS(TIZEN)
     , m_viewportConstraints()
     , m_viewFocused(false)
     , m_viewWindowActive(true)
-    , m_pageDidRendered(false)
+    , m_pageDidRendered(true)
+    , m_viewportAngle(0)
+    , m_viewportFitsToContent(false)
 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
     , m_visibleContentRect(IntRect())
-    , m_scaleFactor(1.0f)
-    , m_drawingScrollPosition(IntPoint())
-    , m_drawingScaleFactor(1.0f)
+    , m_scaleFactor(0)
     , m_hasSuspendedContent(false)
 #endif
 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
     , m_restoredScaleFactor(0)
 #endif
+#if ENABLE(TIZEN_WEBKIT2_BEFORE_PAGE_RENDERED_SCROLL_POSITION)
+    , m_scrollPositionBeforePageRendered(IntPoint())
+#endif
     , m_isVisible(true)
     , m_isScrollableLayerFocused(false)
     , m_isScrollableNodeFocused(false)
@@ -108,72 +113,47 @@ PageClientImpl::PageClientImpl(WebContext* context, WebPageGroup* pageGroup, Eva
 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
     , m_isContextMenuVisible(false)
 #endif
+#if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
+    , m_waitFrameOfNewViewortSize(false)
+#endif
+#if ENABLE(TIZEN_BACKGROUND_DISK_CACHE)
+    , m_isForeground(true)
+#endif
+    , m_nonemptyLayoutRendered(false)
 #endif // #if OS(TIZEN)
 {
 #if ENABLE(TIZEN_CANVAS_CAIRO_GLES_RENDERING)
     setenv("CAIRO_GL_COMPOSITOR", "msaa", 1);
     setenv("CAIRO_GL_LAZY_FLUSHING", "yes", 1);
 #endif
-    m_page = context->createWebPage(this, pageGroup);
-
-#if OS(TIZEN)
-    m_page->pageGroup()->preferences()->setAcceleratedCompositingEnabled(true);
-    m_page->pageGroup()->preferences()->setForceCompositingMode(true);
-    m_page->pageGroup()->preferences()->setFrameFlatteningEnabled(true);
-    m_page->pageGroup()->preferences()->setAllowUniversalAccessFromFileURLs(true);
-
-    if (m_viewWidget) {
-        int deviceWidth, deviceHeight;
-        ecore_evas_screen_geometry_get(ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewWidget)), 0, 0, &deviceWidth, &deviceHeight);
-        m_page->pageGroup()->preferences()->setDeviceWidth(deviceWidth);
-        m_page->pageGroup()->preferences()->setDeviceHeight(deviceHeight);
-    }
-
-#endif
-
-    m_page->initializeWebPage();
-
-#if ENABLE(TIZEN_VIEWPORT_META_TAG)
-    m_page->setCustomDeviceScaleFactor((float)getMobileDPI() / 160);
-#else
-    m_page->setCustomDeviceScaleFactor((float)getDPI() / 160);
-#endif
 
 #if OS(TIZEN)
 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-    m_textSelection = TextSelection::create(viewWidget, m_page.get(), this);
+    m_textSelection = TextSelection::create(m_viewImpl);
 #endif
 #if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
-    m_offlinePageSave = OfflinePageSave::create(viewWidget, m_page.get());
+    m_offlinePageSave = OfflinePageSave::create(m_viewImpl);
 #endif
 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
-    m_clipboardHelper = ClipboardHelper::create(viewWidget, this);
+    m_clipboardHelper = ClipboardHelper::create(m_viewImpl);
 #endif
 #if ENABLE(TIZEN_DRAG_SUPPORT)
-    m_drag = Drag::create(m_page.get());
+    m_drag = Drag::create(m_viewImpl);
 #endif
 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
-    m_formDataCandidate = FormDataCandidate::create(m_page.get());
-#endif
-#endif
-
-#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE) && !ENABLE(TIZEN_WEBKIT2_EFL_WTR)
-    m_page->setUseFixedLayout(true);
+    m_formDataCandidate = FormDataCandidate::create(m_viewImpl);
 #endif
-#if ENABLE(FULLSCREEN_API)
-    m_page->fullScreenManager()->setWebView(viewWidget);
+    Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewImpl->view()));
+    m_viewportAngle = ecore_evas_rotation_get(ee);
 #endif
 
     setBackgroundColor(1, 1, 1, 1);
-
-#if OS(TIZEN)
-    m_viewImpl = EwkViewImpl::fromEvasObject(m_viewWidget);
-#endif
 }
 
 PageClientImpl::~PageClientImpl()
 {
-    m_page->close();
+    if (m_viewImpl && m_viewImpl->page())
+        m_viewImpl->page()->close();
 }
 
 #if OS(TIZEN)
@@ -184,68 +164,70 @@ PageClientImpl::ViewportConstraints PageClientImpl::computeViewportConstraints(c
     constraints.maximumScale = attributes.maximumScale * attributes.devicePixelRatio;
     constraints.userScalable = attributes.userScalable;
     constraints.layoutSize = attributes.layoutSize;
+    constraints.contentsDefinedInitialScale = (ViewportArguments::ValueAuto != attributes.initialScale);
 
-    double defaultViewLevel = m_page->pageGroup()->preferences()->defaultViewLevel();
-    // If defaultViewLevel is 1, "Default View" is set as "Readable"
-    // if not, "Default View" is set as "Fit to width"
-    if (defaultViewLevel) {
+    bool autoFittingEnabled = m_viewImpl->page()->pageGroup()->preferences()->autoFittingEnabled();
+    if (autoFittingEnabled)
+        constraints.initialScale = attributes.minimumScale * attributes.devicePixelRatio;
+    else {
         // if content doesn't set initial scale value, set readable scale factor
         // if not, set initial scale factor of viewport attribute
         if (attributes.initialScale == ViewportArguments::ValueAuto)
-            constraints.initialScale = m_page->deviceScaleFactor();
+            constraints.initialScale = m_viewImpl->page()->deviceScaleFactor();
         else
             constraints.initialScale = attributes.initialScale * attributes.devicePixelRatio;
-    } else {
-        // Minimize initial scale factor
-        constraints.initialScale = attributes.minimumScale * attributes.devicePixelRatio;
     }
 
     // adjust scale with both minimum and maximum scale factor
-    constraints.initialScale = clampTo(constraints.initialScale, constraints.minimumScale, constraints.maximumScale);
+    constraints.initialScale = adjustScaleWithViewport(constraints.initialScale);
 
     return constraints;
 }
 
 double PageClientImpl::adjustScaleWithViewport(double scale)
 {
-    return clampTo(scale, m_viewportConstraints.minimumScale, m_viewportConstraints.maximumScale);
+    double minimumScale = min(m_viewportConstraints.minimumScale, m_viewportConstraints.maximumScale);
+    return clampTo(scale, minimumScale, m_viewportConstraints.maximumScale);
 }
 
 #if USE(TILED_BACKING_STORE) && ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-void PageClientImpl::updateViewportSize(const IntSize& viewportSize)
+void PageClientImpl::updateViewportSize(const IntSize& viewportSize, const int angle)
 {
-    // update device width & height
-    int deviceWidth = WebCore::getDefaultScreenResolution().width();
-    int deviceHeight = WebCore::getDefaultScreenResolution().height();
-    Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewWidget));
-    int angle = ecore_evas_rotation_get(ee);
-    if (angle == 90 || angle == 270) {
-        int tempWidth = deviceWidth;
-        deviceWidth = deviceHeight;
-        deviceHeight = tempWidth;
-    }
-    m_page->pageGroup()->preferences()->setDeviceWidth(deviceWidth);
-    m_page->pageGroup()->preferences()->setDeviceHeight(deviceHeight);
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI(" view size: [%d, %d], angle: [%d]", viewportSize.width(), viewportSize.height(), angle);
+#endif
 
     // update viewport size of webkit
-    m_visibleContentRect.setSize(viewportSize);
-
-    // Update visible content rect before resize viewport
-    // setVisibleContentRect() should be called once at here or ewk_view_focused_node_adjust()
-    if (!ewk_view_focused_node_adjust(m_viewWidget) && m_pageDidRendered)
-        setVisibleContentRect(m_visibleContentRect, scaleFactor());
+    m_viewImpl->page()->setViewportSize(viewportSize);
+}
 
-    m_page->setViewportSize(viewportSize);
+void PageClientImpl::updateVisibleContentRectSize(const IntSize& size)
+{
+    // update visible content rect's size
+    m_visibleContentRect.setSize(size);
 }
 #endif
 
+void PageClientImpl::prepareRestoredVisibleContectRect()
+{
+    m_restoredScaleFactor = scaleFactor();
+    m_restoredScrollPosition = scrollPosition();
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("scroll position: [%d, %d], scale factor: [%.2f]", m_restoredScrollPosition.x(), m_restoredScrollPosition.y(), m_restoredScaleFactor);
+#endif
+}
+
 void PageClientImpl::initializeVisibleContentRect()
 {
-    _ewk_view_resume_painting(m_viewWidget);
+    _ewk_view_resume_painting(m_viewImpl->view());
 
 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
     IntPoint initialScrollPosition;
     float initialScaleFactor = m_viewportConstraints.initialScale;
+#if ENABLE(TIZEN_WEBKIT2_BEFORE_PAGE_RENDERED_SCROLL_POSITION)
+    initialScrollPosition = m_scrollPositionBeforePageRendered;
+    m_scrollPositionBeforePageRendered = IntPoint();
+#endif
 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
     // if scroll position and scale factor are restored by history controller,
     // move scroll position and scale factor with them
@@ -253,14 +235,43 @@ void PageClientImpl::initializeVisibleContentRect()
         initialScrollPosition = m_restoredScrollPosition;
         initialScaleFactor = m_restoredScaleFactor;
     }
+#if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
+    m_restoredScaleFactor = 0;
+#endif
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("scroll position: [%d, %d], scale factor: [%.2f]", initialScrollPosition.x(), initialScrollPosition.y(), initialScaleFactor);
+#endif
 #endif
     setVisibleContentRect(IntRect(initialScrollPosition, m_visibleContentRect.size()), initialScaleFactor);
 #else
     // Set initial scale.
-    m_page->scalePage(m_viewportConstraints.initialScale, IntPoint(0, 0));
+    m_viewImpl->page()->scalePage(m_viewportConstraints.initialScale, IntPoint(0, 0));
 #endif
 }
 
+double PageClientImpl::availableMinimumScale()
+{
+    // recalculate minimum scale factor if contents' width exceeds viewport layout width and userScalable is true.
+    // minimum scale factor shouldn't be smaller than 0.25(minimum zoom level)
+    IntSize contentsSize = m_viewImpl->page()->contentsSize();
+    double horizontalMinScale = max(((double)viewSize().width() / contentsSize.width()), 0.25);
+    double verticalMinScale = max(((double)viewSize().height() / contentsSize.height()), 0.25);
+    // If there's only a bit ignorable difference between horizontalMinScale and verticalMinScale,
+    // ignore verticalMinScale to fit content's width to view
+    const double ignorableThreshold = 0.01;
+    if (fabs(horizontalMinScale - verticalMinScale) < ignorableThreshold)
+        verticalMinScale = horizontalMinScale;
+    return min(max(horizontalMinScale, verticalMinScale), m_viewportConstraints.maximumScale);
+}
+
+void PageClientImpl::fitViewportToContent()
+{
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("scroll position: [%d, %d], scale factor: [%.2f]", m_visibleContentRect.x(), m_visibleContentRect.y(), m_viewportConstraints.minimumScale);
+#endif
+    setVisibleContentRect(m_visibleContentRect, m_viewportConstraints.minimumScale);
+}
+
 void PageClientImpl::setFocusedNodeRect(const IntRect& focusedNodeRect)
 {
     m_focusedNodeRect = focusedNodeRect;
@@ -275,7 +286,7 @@ bool PageClientImpl::scrollBy(IntSize scrollOffset)
     // in the actual scale.
     IntSize scaledScrollOffset = m_viewImpl->transformFromScene().mapSize(scrollOffset);
     if ((m_isScrollableLayerFocused || m_isScrollableNodeFocused)
-        && page()->scrollOverflow(FloatPoint(scaledScrollOffset.width(), scaledScrollOffset.height()))) {
+        && m_viewImpl->page()->scrollOverflow(FloatPoint(scaledScrollOffset.width(), scaledScrollOffset.height()))) {
         displayViewport();
         return false;
     }
@@ -295,19 +306,28 @@ void PageClientImpl::scrollTo(IntPoint requestedScrollPosition)
 
 #endif // #if OS(TIZEN)
 
+EwkViewImpl* PageClientImpl::viewImpl() const
+{
+    return m_viewImpl;
+}
+
 // PageClient
 PassOwnPtr<DrawingAreaProxy> PageClientImpl::createDrawingAreaProxy()
 {
-    return DrawingAreaProxyImpl::create(m_page.get());
+    return DrawingAreaProxyImpl::create(m_viewImpl->page());
 }
 
 void PageClientImpl::setViewNeedsDisplay(const WebCore::IntRect& rect)
 {
-    ewk_view_mark_for_sync(m_viewWidget);
+#if OS(TIZEN)
+    ewk_view_mark_for_sync(m_viewImpl->view());
+#else
+    m_viewImpl->redrawRegion(rect);
+#endif
 
 #if ENABLE(TIZEN_SCREEN_READER)
-    if (rect.intersects(ewkViewGetFocusRing(m_viewWidget)->rect()))
-        m_page->recalcScreenReaderFocusRect();
+    if (rect.intersects(ewkViewGetFocusRing(m_viewImpl->view())->rect()))
+        m_viewImpl->page()->recalcScreenReaderFocusRect();
 #endif
 }
 
@@ -323,12 +343,16 @@ void PageClientImpl::scrollView(const WebCore::IntRect& scrollRect, const WebCor
 
 WebCore::IntSize PageClientImpl::viewSize()
 {
-    return ewk_view_size_get(m_viewWidget);
+    return m_viewImpl->size();
 }
 
 bool PageClientImpl::isViewVisible()
 {
+#if OS(TIZEN)
     return m_isVisible;
+#else
+    return m_viewImpl->isVisible();
+#endif
 }
 
 bool PageClientImpl::isViewInWindow()
@@ -339,14 +363,19 @@ bool PageClientImpl::isViewInWindow()
 
 void PageClientImpl::processDidCrash()
 {
-    notImplemented();
+    // Check if loading was ongoing, when web process crashed.
+    double loadProgress = ewk_view_load_progress_get(m_viewImpl->view());
+    if (loadProgress >= 0 && loadProgress < 1)
+        m_viewImpl->informLoadProgress(1);
+
+    m_viewImpl->informWebProcessCrashed();
 }
 
 void PageClientImpl::didRelaunchProcess()
 {
-    const char* themePath = ewk_view_theme_get(m_viewWidget);
+    const char* themePath = m_viewImpl->themePath();
     if (themePath)
-        ewk_view_page_get(m_viewWidget)->setThemePath(themePath);
+        m_viewImpl->page()->setThemePath(themePath);
 }
 
 void PageClientImpl::pageClosed()
@@ -354,14 +383,14 @@ void PageClientImpl::pageClosed()
     notImplemented();
 }
 
-void PageClientImpl::toolTipChanged(const String&, const String&)
+void PageClientImpl::toolTipChanged(const String&, const String& newToolTip)
 {
-    notImplemented();
+    m_viewImpl->informTooltipTextChange(newToolTip);
 }
 
 void PageClientImpl::setCursor(const Cursor& cursor)
 {
-    ewk_view_cursor_set(m_viewWidget, cursor);
+    m_viewImpl->setCursor(cursor);
 }
 
 void PageClientImpl::setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves)
@@ -371,41 +400,77 @@ void PageClientImpl::setCursorHiddenUntilMouseMoves(bool hiddenUntilMouseMoves)
 
 void PageClientImpl::didChangeViewportProperties(const WebCore::ViewportAttributes& attributes)
 {
-    float prevMinimumScale = m_viewportConstraints.minimumScale;
+    double scaleRatioBeforeRotation = m_scaleFactor / m_viewportConstraints.minimumScale;
     m_viewportConstraints = computeViewportConstraints(attributes);
-    // setVisibleContentRect() is called to adjust visible content rect after device rotation
-    // In below cases, it shouldn't be called
-    // 1. page is not rendered yet
-    // 2. viewport attributes are changed by WebCore's empty document(progress == 0.1)
-    // 3. there's no input field zoom(device rotation without IME)
-    if (m_pageDidRendered && page()->estimatedProgress() > 0.1 && !ewk_view_focused_node_adjust(m_viewWidget)) {
-        IntSize contentsSize = m_page->contentsSize();
-        double minimumScaleByContentWidth = max(((double)viewSize().width() / contentsSize.width()), 0.25);
-        float newScale = scaleFactor();
-
-        // If contents width exceeds viewport layout width and content is userScalable, update minimumScale.
-        if (m_viewportConstraints.userScalable)
-            m_viewportConstraints.minimumScale = minimumScaleByContentWidth;
-
-        // If zoom was fitted to width before the rotation, newScale should be fitted to width again.
-        if (fabs(scaleFactor() - prevMinimumScale) < numeric_limits<double>::epsilon())
-            newScale = m_viewportConstraints.minimumScale;
-#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-        setVisibleContentRect(m_visibleContentRect, newScale);
-#else
-        m_page->scalePage(newScale, m_visibleContentRect.location());
+
+    // Initially, m_scaleFactor is not decided yet.
+    // So, we should update visible content rect at here.
+    if (!m_scaleFactor) {
+        setVisibleContentRect(m_visibleContentRect, m_viewportConstraints.initialScale);
+        return;
+    }
+
+    // if content is reloaded, contents size will not be changed
+    // so, we need to calculate minimum scale here.
+    // if content size is changed later, minimum scale will be re-calculated on didChangeContentsSize()
+    if (m_viewportConstraints.userScalable) {
+        if (fabs(m_viewportConstraints.initialScale - m_viewportConstraints.minimumScale) < numeric_limits<float>::epsilon())
+            m_viewportConstraints.initialScale = availableMinimumScale();
+        m_viewportConstraints.minimumScale = availableMinimumScale();
+    }
+
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("layout size: [%d, %d], scale: [%.2f, %.2f, %.2f], user scalable: [%s]",
+        m_viewportConstraints.layoutSize.width(), m_viewportConstraints.layoutSize.height(),
+        m_viewportConstraints.initialScale, m_viewportConstraints.minimumScale, m_viewportConstraints.maximumScale,
+        m_viewportConstraints.userScalable ? "TRUE" : "FALSE");
 #endif
+
+    // setVisibleContentRect() should be called to adjust visible content rect only when view is resized
+    if (!m_pageDidRendered || m_viewImpl->page()->estimatedProgress() <= 0.1)
+        return;
+
+    // if IME is opened, visible content rect will be updated by ewk_view_focused_node_adjust()
+    if (ewk_view_focused_node_adjust(m_viewImpl->view()))
+        return;
+
+    float newScale = scaleFactor();
+    IntPoint newScrollPosition = m_visibleContentRect.location();
+    Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewImpl->view()));
+    int angle = ecore_evas_rotation_get(ee);
+    bool isRotated = (angle != m_viewportAngle);
+
+    // if it's rotated, we need to fit content to viewport by minimize the scale
+    if (isRotated) {
+        m_viewportAngle = angle;
+        newScale = m_viewportConstraints.minimumScale * scaleRatioBeforeRotation;
+        newScrollPosition.scale(newScale / m_scaleFactor, newScale / m_scaleFactor);
     }
 
-#if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-    updateTextSelectionHandlesAndContextMenu(true);
+#if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
+    if (m_waitFrameOfNewViewortSize)
+        ewk_view_resume(m_viewImpl->view());
+#endif
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("scroll position: [%d, %d], scale factor: [%.2f], rotated: [%s]", m_visibleContentRect.x(), m_visibleContentRect.y(), newScale, isRotated ? "Rotated" : "Not rotated");
+#endif
+
+#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
+    setVisibleContentRect(IntRect(newScrollPosition, m_visibleContentRect.size()), newScale);
+#else
+    m_viewImpl->page()->scalePage(newScale, newScrollPosition);
 #endif
 
 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
-    Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_viewWidget));
+    Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_viewImpl->view()));
     if (smartData->api->formdata_candidate_is_showing(smartData))
         smartData->api->formdata_candidate_hide(smartData);
 #endif
+
+#if ENABLE(TIZEN_FULLSCREEN_API)
+    if (m_viewImpl->page()->fullScreenManager()->isFullScreen())
+        m_viewImpl->page()->fullScreenManager()->updateMediaControlsStyle();
+#endif
 }
 
 #if OS(TIZEN)
@@ -415,13 +480,13 @@ void PageClientImpl::registerEditCommand(PassRefPtr<WebEditCommandProxy> command
         m_undoCommands.append(command);
 
         int undoSize = m_undoCommands.size();
-        evas_object_smart_callback_call(m_viewWidget, "undo,size", &undoSize);
+        evas_object_smart_callback_call(m_viewImpl->view(), "undo,size", &undoSize);
     }
     else {
         m_redoCommands.append(command);
 
         int redoSize = m_redoCommands.size();
-        evas_object_smart_callback_call(m_viewWidget, "redo,size", &redoSize);
+        evas_object_smart_callback_call(m_viewImpl->view(), "redo,size", &redoSize);
     }
 }
 
@@ -431,10 +496,10 @@ void PageClientImpl::clearAllEditCommands()
     m_redoCommands.clear();
 
     int undoSize = m_undoCommands.size();
-    evas_object_smart_callback_call(m_viewWidget, "undo,size", &undoSize);
+    evas_object_smart_callback_call(m_viewImpl->view(), "undo,size", &undoSize);
 
     int redoSize = m_redoCommands.size();
-    evas_object_smart_callback_call(m_viewWidget, "redo,size", &redoSize);
+    evas_object_smart_callback_call(m_viewImpl->view(), "redo,size", &redoSize);
 }
 
 bool PageClientImpl::canUndoRedo(WebPageProxy::UndoOrRedo undoOrRedo)
@@ -452,13 +517,13 @@ void PageClientImpl::executeUndoRedo(WebPageProxy::UndoOrRedo undoOrRedo)
         m_undoCommands.removeLast();
 
         int undoSize = m_undoCommands.size();
-        evas_object_smart_callback_call(m_viewWidget, "undo,size", &undoSize);
+        evas_object_smart_callback_call(m_viewImpl->view(), "undo,size", &undoSize);
     } else {
         m_redoCommands.last()->reapply();
         m_redoCommands.removeLast();
 
         int redoSize = m_redoCommands.size();
-        evas_object_smart_callback_call(m_viewWidget, "redo,size", &redoSize);
+        evas_object_smart_callback_call(m_viewImpl->view(), "redo,size", &redoSize);
     }
 }
 #else
@@ -524,7 +589,7 @@ void PageClientImpl::doneWithGestureEvent(const WebGestureEvent& event, bool was
 void PageClientImpl::doneWithTouchEvent(const NativeWebTouchEvent& event, bool wasEventHandled)
 {
 #if OS(TIZEN)
-    ewk_view_touch_event_handler_result_set(m_viewWidget, event.type(), wasEventHandled);
+    ewk_view_touch_event_handler_result_set(m_viewImpl->view(), event.type(), wasEventHandled);
 #else
     notImplemented();
 #endif // #if OS(TIZEN)
@@ -533,13 +598,13 @@ void PageClientImpl::doneWithTouchEvent(const NativeWebTouchEvent& event, bool w
 
 PassRefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy* page)
 {
-    return WebPopupMenuProxyEfl::create(m_viewWidget, page);
+    return WebPopupMenuProxyEfl::create(m_viewImpl, page);
 }
 
 PassRefPtr<WebContextMenuProxy> PageClientImpl::createContextMenuProxy(WebPageProxy* page)
 {
 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
-    return WebContextMenuProxyTizen::create(m_viewWidget, page, this);
+    return WebContextMenuProxyTizen::create(m_viewImpl->view(), page, this);
 #else
     notImplemented();
     return 0;
@@ -563,12 +628,12 @@ void PageClientImpl::setFindIndicator(PassRefPtr<FindIndicator>, bool, bool)
 #if USE(ACCELERATED_COMPOSITING)
 void PageClientImpl::enterAcceleratedCompositingMode(const LayerTreeContext&)
 {
-    ewk_view_accelerated_compositing_mode_enter(m_viewWidget);
+    m_viewImpl->enterAcceleratedCompositingMode();
 }
 
 void PageClientImpl::exitAcceleratedCompositingMode()
 {
-    ewk_view_accelerated_compositing_mode_exit(m_viewWidget);
+    m_viewImpl->exitAcceleratedCompositingMode();
 }
 
 void PageClientImpl::updateAcceleratedCompositingMode(const LayerTreeContext&)
@@ -603,6 +668,7 @@ void PageClientImpl::didChangeScrollbarsForMainFrame() const
 #if OS(TIZEN)
 void PageClientImpl::didFirstVisuallyNonEmptyLayoutForMainFrame()
 {
+    m_nonemptyLayoutRendered = true;
 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
     m_initialViewRect.setSize(viewSize());
 #endif
@@ -610,6 +676,10 @@ void PageClientImpl::didFirstVisuallyNonEmptyLayoutForMainFrame()
 
 void PageClientImpl::didChangeContentsSize(const WebCore::IntSize size)
 {
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI(" [%d, %d]", size.width(), size.height());
+#endif
+#if USE(TILED_BACKING_STORE)
     if (size.isEmpty())
         return;
 
@@ -618,36 +688,39 @@ void PageClientImpl::didChangeContentsSize(const WebCore::IntSize size)
         drawingArea()->layerTreeCoordinatorProxy()->setContentsSize(WebCore::FloatSize(size.width(), size.height()));
 #endif
 
-    // But we should recalculate this when viewport argument's minimum scale is not fixed.
-    // if contents' width exceeds viewport layout width and userScalable is true.
-    // And minimumScaleByContentWidth shouldn't be smaller than 0.25(minimum zoom level)
-    double oldMinimumScale = m_viewportConstraints.minimumScale;
-    double newMinimumScale = max(((double)viewSize().width() / size.width()), 0.25);
-    bool isMinimized = fabs(scaleFactor() - oldMinimumScale) < numeric_limits<float>::epsilon();
-
     // if minimum scale factor is changed, update minimumScale.
-    if (m_viewportConstraints.userScalable
-        && fabs(oldMinimumScale - newMinimumScale) > numeric_limits<float>::epsilon()) {
+    if (m_viewportConstraints.userScalable) {
+        double minimumScale = availableMinimumScale();
+
         // Sometimes initializeVisibleContentRect can be called after content size change.
-        // So, if initialScale is same to minimumScale, update initialScale too.
-        if (fabs(m_viewportConstraints.initialScale - oldMinimumScale) < numeric_limits<float>::epsilon())
-            m_viewportConstraints.initialScale = newMinimumScale;
-        m_viewportConstraints.minimumScale = newMinimumScale;
+        // So, if initialScale is not set explicitly in content's meta viewport tag and is same to minimumScale, update initialScale too.
+        if (!m_viewportConstraints.contentsDefinedInitialScale
+            && fabs(m_viewportConstraints.initialScale - m_viewportConstraints.minimumScale) < numeric_limits<float>::epsilon())
+            m_viewportConstraints.initialScale = minimumScale;
+        m_viewportConstraints.minimumScale = minimumScale;
     }
-
-    // If current scale factor was minimized, minimize new scale factor
-    if (m_pageDidRendered && isMinimized && m_viewportConstraints.userScalable) {
-#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
-        setVisibleContentRect(m_visibleContentRect, newMinimumScale);
 #else
-        m_page->scalePage(newMinimumScale, m_visibleContentRect.location());
+    m_viewImpl->informContentsSizeChange(size);
+#endif
+    if (!m_pageDidRendered || m_viewImpl->page()->estimatedProgress() <= 0.1)
+        return;
+
+    // FIXME: Do we really need to adjust visible content rect at here?
+    // if contents size is changed smaller and visible content rect is outside of content area,
+    // adjust visible content rect
+    bool needScrollAdjustment = (adjustVisibleContentRect(m_visibleContentRect, scaleFactor()) != m_visibleContentRect);
+    bool needScaleAdjustment = (fabs(adjustScaleWithViewport(scaleFactor()) - scaleFactor()) > numeric_limits<float>::epsilon());
+    if (needScrollAdjustment || needScaleAdjustment) {
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+        TIZEN_LOGI(" setVisibleContentRect: [%d, %d], [%.2f]", m_visibleContentRect.x(), m_visibleContentRect.y(), scaleFactor());
 #endif
+        setVisibleContentRect(m_visibleContentRect, scaleFactor());
     }
 }
 
 void PageClientImpl::pageScaleFactorDidChange()
 {
-    ewk_view_focused_node_adjust(m_viewWidget);
+    ewk_view_focused_node_adjust(m_viewImpl->view());
 }
 #endif // #if OS(TIZEN)
 
@@ -655,9 +728,8 @@ void PageClientImpl::didCommitLoadForMainFrame(bool)
 {
 #if OS(TIZEN)
     m_pageDidRendered = false;
-#if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
-    m_restoredScaleFactor = 0;
-#endif
+    m_viewportFitsToContent = false;
+    m_nonemptyLayoutRendered = false;
     return;
 #endif
     notImplemented();
@@ -694,29 +766,45 @@ void PageClientImpl::countStringMatchesInCustomRepresentation(const String&, Fin
     notImplemented();
 }
 
+void PageClientImpl::updateTextInputState()
+{
+#if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
+    m_textSelection->update();
+    if (isTextSelectionMode() && isTextSelectionHandleDowned())
+        return;
+#endif
+
+    InputMethodContextEfl* inputMethodContext = m_viewImpl->inputMethodContext();
+    if (inputMethodContext)
+        inputMethodContext->updateTextInputState();
+}
+
 void PageClientImpl::handleDownloadRequest(DownloadProxy* download)
 {
-    Ewk_Download_Job* ewkDownload = ewk_download_job_new(download, m_viewWidget);
-    // For now we only support one default context, but once we support
-    // multiple contexts, we will need to retrieve the context from the
-    // view.
-    ewk_context_download_job_add(ewk_context_default_get(), ewkDownload);
-    ewk_download_job_unref(ewkDownload);
+    Ewk_Context* context = m_viewImpl->ewkContext();
+    context->downloadManager()->registerDownload(download, m_viewImpl);
 }
 
 #if USE(TILED_BACKING_STORE)
 void PageClientImpl::pageDidRequestScroll(const IntPoint& point)
 {
 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
-    Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_viewWidget));
+    Ewk_View_Smart_Data* smartData = static_cast<Ewk_View_Smart_Data*>(evas_object_smart_data_get(m_viewImpl->view()));
     if (smartData->api->formdata_candidate_is_showing(smartData))
         return;
 #endif
 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
     IntPoint newPoint = point;
     newPoint.scale(scaleFactor(), scaleFactor());
+#if ENABLE(TIZEN_WEBKIT2_BEFORE_PAGE_RENDERED_SCROLL_POSITION)
+    if (!m_pageDidRendered)
+        m_scrollPositionBeforePageRendered = newPoint;
+    else
+        setVisibleContentRect(IntRect(newPoint, m_visibleContentRect.size()), scaleFactor());
+#else
     setVisibleContentRect(IntRect(newPoint, m_visibleContentRect.size()), scaleFactor());
 #endif
+#endif
 }
 #endif
 
@@ -727,6 +815,9 @@ void PageClientImpl::pageDidRequestRestoreVisibleContentRect(const IntPoint& poi
     m_restoredScrollPosition = point;
     m_restoredScrollPosition.scale(scale, scale);
     m_restoredScaleFactor = scale;
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("scroll position: [%d, %d], scale factor: [%.2f]", m_restoredScrollPosition.x(), m_restoredScrollPosition.y(), m_restoredScaleFactor);
+#endif
 
     // Before contents size is fixed, just update visible content rect's position
     m_visibleContentRect.setLocation(m_restoredScrollPosition);
@@ -742,252 +833,37 @@ void PageClientImpl::textChangeInTextField(const String& name, const String& val
     }
 
     m_formDataCandidate->updateCandidateValue(value);
-    ewk_view_text_change_in_textfield(m_viewWidget, name, value);
-}
-#endif
-
-#if ENABLE(TIZEN_ISF_PORT)
-void PageClientImpl::setInputMethodState(bool active, const String& type, const String& value)
-{
-    if (!active) {
-        ewk_view_imf_context_hide(m_viewWidget);
-        LOG(ISF, "- Keypad status : hide\n");
-        return;
-    }
-
-    Ewk_Settings* settings = ewk_view_settings_get(m_viewWidget);
-    bool defaultKeypadEnabled = ewk_settings_default_keypad_enabled_get(settings);
-
-#if ENABLE(TIZEN_WEBKIT2_CONTEXT_MENU_CLIPBOARD)
-    if (m_clipboardHelper->isClipboardWindowOpened()) {
-        LOG(ISF, "[FAIL] Clipboard\n");
-        return;
-    }
-#endif
-
-    LOG(ISF, "- Type (%s), Value (%s)\n", type.utf8().data(), value.utf8().data());
-
-#if ENABLE(TIZEN_INPUT_TAG_EXTENSION)
-    if (type == "date") {
-        ewkViewInputPickerRequest(m_viewWidget, EWK_INPUT_TYPE_DATE, value);
-        return;
-    } else if (type == "datetime") {
-        ewkViewInputPickerRequest(m_viewWidget, EWK_INPUT_TYPE_DATETIME, value);
-        return;
-    } else if (type == "datetime-local") {
-        ewkViewInputPickerRequest(m_viewWidget, EWK_INPUT_TYPE_DATETIMELOCAL, value);
-        return;
-    } else if (type == "month") {
-        ewkViewInputPickerRequest(m_viewWidget, EWK_INPUT_TYPE_MONTH, value);
-        return;
-    } else if (type == "time") {
-        ewkViewInputPickerRequest(m_viewWidget, EWK_INPUT_TYPE_TIME, value);
-        return;
-    } else if (type == "week") {
-        ewkViewInputPickerRequest(m_viewWidget, EWK_INPUT_TYPE_WEEK, value);
-        return;
-    }
-
-#if ENABLE(TIZEN_DATALIST_ELEMENT)
-    Vector<String> optionList = page()->getFocusedInputElementDataList();
-    if (optionList.size() > 0) {
-        if (type == "tel")
-            ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_TELEPHONE, optionList);
-        else if (type == "number")
-            ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_NUMBER, optionList);
-        else if (type == "email")
-            ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_EMAIL, optionList);
-        else if (type == "url")
-            ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_URL, optionList);
-        else
-            ewkViewDataListShowRequest(m_viewWidget, EWK_INPUT_TYPE_TEXT, optionList);
-
-        return;
-    }
-#endif // ENABLE(TIZEN_DATALIST_ELEMENT)
-#endif // ENABLE(TIZEN_INPUT_TAG_EXTENSION)
-
-    bool hasFocus = evas_object_focus_get(m_viewWidget);
-
-    if (!defaultKeypadEnabled) {
-        ewk_view_imf_context_destroy(m_viewWidget);
-        if (hasFocus) {
-            Eina_Rectangle dummyRectForCustomKeypadCallback;
-            memset(&dummyRectForCustomKeypadCallback, 0, sizeof(Eina_Rectangle));
-            evas_object_smart_callback_call(m_viewWidget, "inputmethod,changed", &dummyRectForCustomKeypadCallback);
-        }
-        return;
-    }
-
-    Ecore_IMF_Input_Panel_Layout layout;
-    if (type == "number")
-        layout = ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER;
-    else if (type == "email")
-        layout = ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL;
-    else if (type == "url")
-        layout = ECORE_IMF_INPUT_PANEL_LAYOUT_URL;
-    else if (type == "tel")
-        layout = ECORE_IMF_INPUT_PANEL_LAYOUT_PHONENUMBER;
-    else if (type == "password")
-        layout = ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD;
-    else
-        layout = ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL;
-
-    Ecore_IMF_Context* imfContext = ewk_view_imf_context_set(m_viewWidget, layout);
-    if (!imfContext)
-        return;
-
-    if (type == "password")
-        ecore_imf_context_prediction_allow_set(imfContext, false);
-    else
-        ecore_imf_context_prediction_allow_set(imfContext, true);
-
-    if (type.isEmpty() || type == "textarea")
-        ecore_imf_context_autocapital_type_set(imfContext, ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE);
-    else
-        ecore_imf_context_autocapital_type_set(imfContext, ECORE_IMF_AUTOCAPITAL_TYPE_NONE);
-
-    Evas* evas = evas_object_evas_get(m_viewWidget);
-    ecore_imf_context_client_window_set(imfContext, (void*)ecore_evas_window_get(ecore_evas_ecore_evas_get(evas)));
-    ecore_imf_context_client_canvas_set(imfContext, evas);
-
-#if ENABLE(TIZEN_SUPPORT_EMOJI)
-    if (type.isEmpty() && !value.isEmpty()) {
-        CString emojiSetting = value.utf8();
-        ecore_imf_context_input_panel_imdata_set(imfContext, emojiSetting.data(), emojiSetting.length());
-    }
-#endif
-
-    if (!hasFocus)
-        return;
-
-    ecore_imf_context_focus_in(imfContext);
-    ecore_imf_context_input_panel_show(imfContext);
-    ecore_imf_context_cursor_position_set(imfContext, page()->getCursorOffset());
-
-    // input field zoom for external keyboard
-    ewk_view_focused_node_adjust(m_viewWidget, EINA_TRUE);
-
-    LOG(ISF, "- Keypad status : show\n");
+    ewk_view_text_change_in_textfield(m_viewImpl->view(), name, value);
 }
-#else
-void PageClientImpl::setInputMethodState(bool) { }
-#endif // #if ENABLE(TIZEN_ISF_PORT)
-
-#if ENABLE(TIZEN_ISF_PORT)
-void PageClientImpl::updateTextInputState()
-{
-#if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-    m_textSelection->update();
 #endif
-}
 
-void PageClientImpl::updateCursorOffset(int offset)
+void PageClientImpl::updateFormNavigation(int length, int offset)
 {
-    Ecore_IMF_Context* imfContext = ewk_view_imf_context_get(m_viewWidget);
-    if (!imfContext)
-        return;
-
-    ecore_imf_context_cursor_position_set(imfContext, offset);
+    notImplemented();
 }
 
-void PageClientImpl::imContextCommitted(Ecore_IMF_Context* context, char* string)
+#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
+#if ENABLE(TIZEN_WEBKIT2_TILED_AC)
+DrawingAreaProxy* PageClientImpl::drawingArea() const
 {
-    if (!page()->focusedFrame())
-        return;
-
-    page()->confirmComposition(String::fromUTF8(string));
+    return m_viewImpl->page()->drawingArea();
 }
-
-void PageClientImpl::imContextPreeditChanged(Ecore_IMF_Context* context)
-{
-    if (!page()->focusedFrame())
-        return;
-
-    char* preeditStr = 0;
-    Eina_List* preeditAttrs = 0;
-    int cursorPosition = 0;
-
-    ecore_imf_context_preedit_string_with_attributes_get(context, &preeditStr, &preeditAttrs, &cursorPosition);
-    if (!preeditStr) {
-        if (preeditAttrs) {
-            void* item = 0;
-            EINA_LIST_FREE(preeditAttrs, item)
-                free(item);
-        }
-        return;
-    }
-
-    IntRect caretRect;
-    page()->getCaretPosition(caretRect);
-    caretRect.scale(scaleFactor());
-
-    int viewX, viewY;
-    evas_object_geometry_get(m_viewWidget, &viewX, &viewY, 0, 0);
-
-    int x = caretRect.x() - scrollPosition().x() + viewX;
-    int y = caretRect.y() - scrollPosition().y() + viewY;
-    int w = caretRect.width();
-    int h = caretRect.height();
-    ecore_imf_context_cursor_location_set(context, x, y, w, h);
-
-    String preeditString = String::fromUTF8(preeditStr);
-    if (preeditStr)
-        free(preeditStr);
-
-    Vector<CompositionUnderline> underlines;
-
-#if ENABLE(TIZEN_WEBKIT2_SUPPORT_JAPANESE_IME)
-    if (preeditAttrs) {
-        Eina_List* listIterator = 0;
-        void* item = 0;
-        EINA_LIST_FOREACH(preeditAttrs, listIterator, item) {
-            Ecore_IMF_Preedit_Attr* preeditAttr = static_cast<Ecore_IMF_Preedit_Attr*>(item);
-
-            switch (preeditAttr->preedit_type) {
-            case ECORE_IMF_PREEDIT_TYPE_SUB1:
-                underlines.append(CompositionUnderline(preeditAttr->start_index, preeditAttr->end_index, Color(0, 0, 0), false));
-                break;
-            case ECORE_IMF_PREEDIT_TYPE_SUB2:
-            case ECORE_IMF_PREEDIT_TYPE_SUB3:
-                underlines.append(CompositionUnderline(preeditAttr->start_index, preeditAttr->end_index, Color(0, 0, 0), Color(255, 255, 255), false));
-                break;
-            case ECORE_IMF_PREEDIT_TYPE_SUB4:
-                underlines.append(CompositionUnderline(preeditAttr->start_index, preeditAttr->end_index, Color(0, 0, 0), Color(46, 168, 255), false));
-                break;
-            case ECORE_IMF_PREEDIT_TYPE_SUB5:
-                underlines.append(CompositionUnderline(preeditAttr->start_index, preeditAttr->end_index, Color(0, 0, 0), Color(153, 98, 195), false));
-                break;
-            case ECORE_IMF_PREEDIT_TYPE_SUB6:
-                underlines.append(CompositionUnderline(preeditAttr->start_index, preeditAttr->end_index, Color(0, 0, 0), Color(118, 222, 55), false));
-                break;
-            case ECORE_IMF_PREEDIT_TYPE_SUB7:
-                underlines.append(CompositionUnderline(preeditAttr->start_index, preeditAttr->end_index, Color(0, 0, 0), Color(153, 153, 153), false));
-                break;
-            }
-        }
-        EINA_LIST_FREE(preeditAttrs, item)
-            free(item);
-
-    } else
-        underlines.append(CompositionUnderline(0, preeditString.length(), Color(0, 0, 0), false));
-#else
-    underlines.append(CompositionUnderline(0, preeditString.length(), Color(0, 0, 0), false));
 #endif
 
-    page()->setComposition(preeditString, underlines, cursorPosition);
+// Before rendering, scale factor and scroll position is different from m_viewImpl.
+float PageClientImpl::scaleFactor()
+{
+    return m_pageDidRendered ? m_viewImpl->scaleFactor() : (m_restoredScaleFactor ? m_restoredScaleFactor : m_viewportConstraints.initialScale);
 }
-#endif // #if ENABLE(TIZEN_ISF_PORT)
 
-void PageClientImpl::updateFormNavigation(int length, int offset)
+const IntPoint PageClientImpl::scrollPosition()
 {
-    notImplemented();
+    return m_pageDidRendered ? m_viewImpl->scrollPosition() : (m_restoredScaleFactor ? m_restoredScrollPosition : IntPoint());
 }
 
-#if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
 IntRect PageClientImpl::adjustVisibleContentRect(IntRect visibleContentRect, float targetScale)
 {
-    IntSize contentsSize = page()->contentsSize();
+    IntSize contentsSize = m_viewImpl->page()->contentsSize();
     contentsSize.scale(targetScale);
     if (contentsSize.width() < visibleContentRect.width())
         visibleContentRect.setX(0);
@@ -1009,13 +885,22 @@ void PageClientImpl::setVisibleContentRect(const IntRect& newRect, float newScal
 #endif
 
     m_scaleFactor = adjustScaleWithViewport(newScale);
+    m_viewportFitsToContent = fabs(m_scaleFactor - m_viewportConstraints.minimumScale) < numeric_limits<float>::epsilon();
     m_visibleContentRect.setLocation(newRect.location());
     m_visibleContentRect = adjustVisibleContentRect(m_visibleContentRect, m_scaleFactor);
 
     // update both drawing scale factor and scroll position after page is rendered
     if (m_pageDidRendered) {
-        m_drawingScaleFactor = m_scaleFactor;
-        m_drawingScrollPosition = m_visibleContentRect.location();
+        if (!m_hasSuspendedContent) {
+            // FIXME: We have to update EwkViewImpl's scale and position here because we use them to draw contents.
+            // PageViewport's values are updated when resuming content in the webkit opensource,
+            // but we have to update viewImpl's values here to sync with PageClient's values.
+            // However, We should not update them when hasSuspendedContent is true in order to maintain last values.
+            // The values will be updated when resuming content.
+            // Below codes should be refactored when PageViewportController codes are merged into Tizen.
+            m_viewImpl->setScaleFactor(m_scaleFactor);
+            m_viewImpl->setScrollPosition(m_visibleContentRect.location());
+        }
     }
 
     // enclosingIntRect produces inconsistent width and height when scale factor is not 1.
@@ -1026,7 +911,7 @@ void PageClientImpl::setVisibleContentRect(const IntRect& newRect, float newScal
                                                       ceilf(m_visibleContentRect.height() / m_scaleFactor));
     if (!drawingArea())
         return;
-    drawingArea()->setVisibleContentsRect(mapToContentsVisibleContentRect, newScale, trajectory, FloatPoint(m_drawingScrollPosition));
+    drawingArea()->setVisibleContentsRect(mapToContentsVisibleContentRect, m_scaleFactor, trajectory, FloatPoint(m_viewImpl->scrollPosition()));
 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
     // FIXME: We need to calculate exact visibleRect size here instead of mapToContentsVisibleContentRect.
     drawingArea()->setVisibleContentsRectForScrollingContentsLayers(mapToContentsVisibleContentRect);
@@ -1036,11 +921,12 @@ void PageClientImpl::setVisibleContentRect(const IntRect& newRect, float newScal
 #if ENABLE(TIZEN_SCREEN_READER)
     if (ScreenReaderProxy::screenReader().isEnabled()
         && (scrollPosition() != previousScrollPosition || m_scaleFactor != previousScale))
-        ewkViewGetFocusRing(m_viewWidget)->updateScrollAndScale(previousScrollPosition, previousScale);
+        ewkViewGetFocusRing(m_viewImpl->view())->updateScrollAndScale(previousScrollPosition, previousScale);
 #endif
 
 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-    updateTextSelectionHandlesAndContextMenu(true);
+    if (!isClipboardWindowOpened())
+        updateTextSelectionHandlesAndContextMenu(true);
 #endif
 }
 
@@ -1053,7 +939,7 @@ void PageClientImpl::displayViewport()
 #endif
 
 #if ENABLE(TIZEN_SCREEN_READER)
-    m_page->recalcScreenReaderFocusRect();
+    m_viewImpl->page()->recalcScreenReaderFocusRect();
 #endif
 }
 
@@ -1063,17 +949,6 @@ void PageClientImpl::drawContents()
 
 void PageClientImpl::drawContents(BackingStore::PlatformGraphicsContext context)
 {
-    if (!m_hasSuspendedContent) {
-        // FIXME: We have to update EwkViewImpl's scale and position here because we use them to draw contents.
-        // PageViewport's values are updated when resuming content in the webkit opensource,
-        // but we have to update viewImpl's values here to sync with PageClient's values.
-        // However, We should not update them when hasSuspendedContent is true in order to maintain last values.
-        // The values will be updated when resuming content.
-        // Below codes should be refactored when PageViewportController codes are merged into Tizen.
-        m_viewImpl->setScaleFactor(m_drawingScaleFactor);
-        m_viewImpl->setScrollPosition(m_drawingScrollPosition);
-    }
-
     cairo_save(context);
     const cairo_matrix_t matrix = cairo_matrix_t(m_viewImpl->transformToView());
     cairo_transform(context, &matrix);
@@ -1092,7 +967,7 @@ void PageClientImpl::scaleImage(double scaleFactor, IntPoint scrollPosition)
 {
 #if OS(TIZEN) && ENABLE(FULLSCREEN_API)
     // We don't want to process scaling in the FullScreen mode.
-    if (page()->fullScreenManager()->isFullScreen())
+    if (m_viewImpl->page()->fullScreenManager()->isFullScreen())
         return;
 #endif
 
@@ -1102,7 +977,7 @@ void PageClientImpl::scaleImage(double scaleFactor, IntPoint scrollPosition)
 
     // Adjust scaleFactor.
 #if ENABLE(TIZEN_WEBKIT2_TEXT_ZOOM)
-    if (!page()->pageGroup()->preferences()->textZoomEnabled())
+    if (!m_viewImpl->page()->pageGroup()->preferences()->textZoomEnabled())
         scaleFactor = adjustScaleWithViewport(scaleFactor);
 #else
     scaleFactor = adjustScaleWithViewport(scaleFactor);
@@ -1115,7 +990,7 @@ void PageClientImpl::scaleContents(double scaleFactor, const IntPoint& origin)
 {
 #if OS(TIZEN) && ENABLE(FULLSCREEN_API)
     // We don't want to process scaling in the FullScreen mode.
-    if (page()->fullScreenManager()->isFullScreen())
+    if (m_viewImpl->page()->fullScreenManager()->isFullScreen())
         return;
 #endif
     scaleFactor = adjustScaleWithViewport(scaleFactor);
@@ -1136,17 +1011,18 @@ void PageClientImpl::suspendContent()
 
 void PageClientImpl::resumeContent()
 {
-    // FIXME: Update viewImpl's values after resuming content.
-    // Actually PageViewport's values are updated when resuming content in the webkit opensource,
-    // but we have to update viewImpl's values here(Tizen) to sync with PageClient's values.
-    // The concept is that the values of EwkViewImpl and PageClient can be different during suspending
-    // content and they become same when content is resumed.
-    m_viewImpl->setScaleFactor(m_drawingScaleFactor);
-    m_viewImpl->setScrollPosition(m_drawingScrollPosition);
-
     if (!m_hasSuspendedContent)
         return;
 
+#if ENABLE(TIZEN_DLOG_SUPPORT)
+    TIZEN_LOGI("scroll position: [%d, %d], scale factor: [%.2f]", m_viewImpl->scrollPosition().x(), m_viewImpl->scrollPosition().y(), m_viewImpl->scaleFactor());
+#endif
+
+    // FIXME: Update visibleContentRect with m_viewImpl after resuming content.
+    // The concept is that the values of EwkViewImpl and PageClient can be different
+    // during suspending content and they become same when content is resumed.
+    // Below codes should be refactored when PageViewportController codes are merged into Tizen.
+    setVisibleContentRect(IntRect(m_viewImpl->scrollPosition(), m_visibleContentRect.size()), m_viewImpl->scaleFactor());
     m_hasSuspendedContent = false;
 }
 
@@ -1155,7 +1031,7 @@ FloatPoint PageClientImpl::boundContentsPositionAtScale(const FloatPoint& frameP
     // We need to floor the viewport here as to allow aligning the content in device units. If not,
     // it might not be possible to scroll the last pixel and that affects fixed position elements.
     FloatRect bounds;
-    const IntSize& contentsSize = m_page->contentsSize();
+    const IntSize& contentsSize = m_viewImpl->page()->contentsSize();
     bounds.setWidth(std::max(0.f, contentsSize.width() - floorf(viewSize().width() / scale)));
     bounds.setHeight(std::max(0.f, contentsSize.height() - floorf(viewSize().height() / scale)));
 
@@ -1172,14 +1048,14 @@ void PageClientImpl::createScrollbarIfNeeded(bool horizontalBar, bool verticalBa
 {
     // create if needed.
     if (horizontalBar && !m_horizontalScrollbar) {
-        m_horizontalScrollbar = MainFrameScrollbarTizen::createNativeScrollbar(m_viewWidget, HorizontalScrollbar);
+        m_horizontalScrollbar = MainFrameScrollbarTizen::createNativeScrollbar(m_viewImpl->view(), HorizontalScrollbar);
         IntRect hBarRect(0, viewSize().height(), viewSize().width(), 0);
         m_horizontalScrollbar->setFrameRect(hBarRect);
     } else if (!horizontalBar && m_horizontalScrollbar)
         m_horizontalScrollbar = 0;
 
     if (verticalBar && !m_verticalScrollbar) {
-        m_verticalScrollbar = MainFrameScrollbarTizen::createNativeScrollbar(m_viewWidget, VerticalScrollbar);
+        m_verticalScrollbar = MainFrameScrollbarTizen::createNativeScrollbar(m_viewImpl->view(), VerticalScrollbar);
         IntRect vBarRect(viewSize().width(), 0, 0, viewSize().height());
         m_verticalScrollbar->setFrameRect(vBarRect);
     } else if (!verticalBar && m_verticalScrollbar)
@@ -1188,7 +1064,7 @@ void PageClientImpl::createScrollbarIfNeeded(bool horizontalBar, bool verticalBa
 
 void PageClientImpl::updateScrollbar()
 {
-    IntSize scaledContentsSize = m_page->contentsSize();
+    IntSize scaledContentsSize = m_viewImpl->page()->contentsSize();
     scaledContentsSize.scale(scaleFactor());
 
     bool newHasHorizontalScrollbar = false;
@@ -1201,11 +1077,11 @@ void PageClientImpl::updateScrollbar()
 
     if (m_horizontalScrollbar) {
         m_horizontalScrollbar->setProportion(viewSize().width(), scaledContentsSize.width());
-        m_horizontalScrollbar->setPosition(m_drawingScrollPosition.x());
+        m_horizontalScrollbar->setPosition(m_viewImpl->scrollPosition().x());
     }
     if (m_verticalScrollbar) {
         m_verticalScrollbar->setProportion(viewSize().height(), scaledContentsSize.height());
-        m_verticalScrollbar->setPosition(m_drawingScrollPosition.y());
+        m_verticalScrollbar->setPosition(m_viewImpl->scrollPosition().y());
     }
 }
 
@@ -1249,18 +1125,18 @@ void PageClientImpl::setIsTextSelectionMode(bool isTextSelectionMode)
 
 void PageClientImpl::updateTextSelectionHandlesAndContextMenu(bool isShow, bool isScrolling)
 {
-    if (m_textSelection->isTextSelectionMode() && evas_object_focus_get(m_viewWidget))
+    if (m_textSelection->isTextSelectionMode() && evas_object_focus_get(m_viewImpl->view()))
         m_textSelection->updateHandlesAndContextMenu(isShow, isScrolling);
 }
 
 bool PageClientImpl::textSelectionDown(const WebCore::IntPoint& point, bool isStartedTextSelectionFromOutside)
 {
-    if (!evas_object_focus_get(m_viewWidget)) {
-        Ecore_IMF_Context* imfContext = ewk_view_imf_context_get(m_viewWidget);
-        if (imfContext && (ecore_imf_context_input_panel_state_get(imfContext) == ECORE_IMF_INPUT_PANEL_STATE_HIDE))
-            ewk_view_imf_context_hide(m_viewWidget);
+    if (!evas_object_focus_get(m_viewImpl->view())) {
+        InputMethodContextEfl* inputMethodContext = m_viewImpl->inputMethodContext();
+        if (inputMethodContext)
+            inputMethodContext->hideIMFContext();
 
-        evas_object_focus_set(m_viewWidget, true);
+        evas_object_focus_set(m_viewImpl->view(), true);
     }
 
     return m_textSelection->textSelectionDown(point, isStartedTextSelectionFromOutside);
@@ -1297,6 +1173,21 @@ void PageClientImpl::textSelectonHandleUp()
     m_textSelection->textSelectionHandleUp();
 }
 #endif
+
+void PageClientImpl::requestToShowTextSelectionHandlesAndContextMenu()
+{
+    m_textSelection->requestToShow();
+}
+
+void PageClientImpl::initTextSelectionHandlesMouseDownedStatus()
+{
+    m_textSelection->initHandlesMouseDownedStatus();
+}
+
+void PageClientImpl::changeContextMenuPosition(IntPoint& point)
+{
+    m_textSelection->changeContextMenuPosition(point);
+}
 #endif
 
 #if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
@@ -1319,7 +1210,7 @@ void PageClientImpl::startOfflinePageSave(String& path, String& url, String& tit
 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
 void PageClientImpl::pasteContextMenuSelected()
 {
-    m_clipboardHelper->pasteClipboardLastItem(page()->editorState().isContentRichlyEditable);
+    m_clipboardHelper->pasteClipboardLastItem(m_viewImpl->page()->editorState().isContentRichlyEditable);
 }
 #endif
 
@@ -1334,7 +1225,7 @@ void PageClientImpl::setClipboardData(const String& data, const String& type)
 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_MENU_CLIPBOARD)
 void PageClientImpl::clipboardContextMenuSelected()
 {
-    m_clipboardHelper->openClipboardWindow(page()->editorState().isContentRichlyEditable);
+    m_clipboardHelper->openClipboardWindow(m_viewImpl->page()->editorState().isContentRichlyEditable);
 }
 
 bool PageClientImpl::isClipboardWindowOpened()
@@ -1342,9 +1233,9 @@ bool PageClientImpl::isClipboardWindowOpened()
     return m_clipboardHelper->isClipboardWindowOpened();
 }
 
-void PageClientImpl::clearClipboardSelectionHandler()
+void PageClientImpl::closeClipboardWindow()
 {
-    m_clipboardHelper->clearClipboardSelectionHandler();
+    m_clipboardHelper->closeClipboardWindow();
 }
 #endif
 
@@ -1360,9 +1251,9 @@ void PageClientImpl::clearClipboardData()
 void PageClientImpl::setIsVisible(bool isVisible)
 {
 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
-    if (m_isVisible != isVisible && m_viewWidget && m_pageDidRendered) {
+    if (m_isVisible != isVisible && m_viewImpl->view() && m_pageDidRendered) {
         if (!isVisible && (drawingArea() && drawingArea()->layerTreeCoordinatorProxy()) && !m_shouldShowBackupTexture) {
-            Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewWidget));
+            Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewImpl->view()));
             int angle = ecore_evas_rotation_get(ee);
             if (angle == 0 || angle == 180) {
                 m_shouldMakeBackupTexture = true;
@@ -1375,12 +1266,13 @@ void PageClientImpl::setIsVisible(bool isVisible)
 
     m_isVisible = isVisible;
 
-    if (m_page)
-        m_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
+    WebPageProxy* pageProxy = m_viewImpl->page();
+    if (pageProxy)
+        pageProxy->viewStateDidChange(WebPageProxy::ViewIsVisible);
 
 #if ENABLE(TIZEN_CACHE_MEMORY_OPTIMIZATION)
     if (!m_isVisible)
-        ewk_context_decoded_data_clear_all(ewk_view_context_get(m_viewWidget));
+        ewk_view_context_get(m_viewImpl->view())->clearAllDecodedData();
 #endif
 }
 #endif
@@ -1404,7 +1296,7 @@ void PageClientImpl::startDrag(const DragData& dragData, PassRefPtr<ShareableBit
         m_drag->getDragPoint(), dragData.draggingSourceOperationMask(), dragData.flags());
 
     String dragStorageName("Drag");
-    m_page->dragEntered(dragInfo, dragStorageName);
+    m_viewImpl->page()->dragEntered(dragInfo, dragStorageName);
     setDragMode(true);
     m_drag->setDragData(dragInfo);
     m_drag->Show();
@@ -1436,85 +1328,92 @@ void PageClientImpl::showFormDataCandidate(const WebCore::IntRect& rect)
 #if ENABLE(TIZEN_REGISTER_PROTOCOL_HANDLER)
 void PageClientImpl::registerProtocolHandler(const String& scheme, const String& baseURL, const String& url, const String& title)
 {
-    ewkViewRegisterProtocolHandlers(m_viewWidget, scheme.utf8().data(), baseURL.utf8().data(), url.utf8().data(), title.utf8().data());
+    ewkViewRegisterProtocolHandlers(m_viewImpl->view(), scheme.utf8().data(), baseURL.utf8().data(), url.utf8().data(), title.utf8().data());
 }
 #endif
 
 #if ENABLE(TIZEN_CUSTOM_SCHEME_HANDLER)
 unsigned int PageClientImpl::isProtocolHandlerRegistered(const String& scheme, const String& baseURL, const String& url)
 {
-    return ewkViewIsProtocolHandlerRegistered(m_viewWidget, scheme.utf8().data(), baseURL.utf8().data(), url.utf8().data());
+    return ewkViewIsProtocolHandlerRegistered(m_viewImpl->view(), scheme.utf8().data(), baseURL.utf8().data(), url.utf8().data());
 }
 
 void PageClientImpl::unregisterProtocolHandler(const String& scheme, const String& baseURL, const String& url)
 {
-    ewkViewUnregisterProtocolHandlers(m_viewWidget, scheme.utf8().data(), baseURL.utf8().data(), url.utf8().data());
+    ewkViewUnregisterProtocolHandlers(m_viewImpl->view(), scheme.utf8().data(), baseURL.utf8().data(), url.utf8().data());
 }
 #endif
 
 #if ENABLE(TIZEN_REGISTER_CONTENT_HANDLER)
 void PageClientImpl::registerContentHandler(const String& mimeType, const String& baseURL, const String& url, const String& title)
 {
-    ewkViewRegisterContentHandlers(m_viewWidget, mimeType.utf8().data(), baseURL.utf8().data(), url.utf8().data(), title.utf8().data());
+    ewkViewRegisterContentHandlers(m_viewImpl->view(), mimeType.utf8().data(), baseURL.utf8().data(), url.utf8().data(), title.utf8().data());
 }
 
 unsigned int PageClientImpl::isContentHandlerRegistered(const String& mimeType, const String& baseURL, const String& url)
 {
-    return ewkViewIsContentHandlerRegistered(m_viewWidget, mimeType.utf8().data(), baseURL.utf8().data(), url.utf8().data());
+    return ewkViewIsContentHandlerRegistered(m_viewImpl->view(), mimeType.utf8().data(), baseURL.utf8().data(), url.utf8().data());
 }
 
 void PageClientImpl::unregisterContentHandler(const String& mimeType, const String& baseURL, const String& url)
 {
-    ewkViewUnregisterContentHandlers(m_viewWidget, mimeType.utf8().data(), baseURL.utf8().data(), url.utf8().data());
+    ewkViewUnregisterContentHandlers(m_viewImpl->view(), mimeType.utf8().data(), baseURL.utf8().data(), url.utf8().data());
 }
 #endif
 
 #if ENABLE(TIZEN_SEARCH_PROVIDER)
 void PageClientImpl::addSearchProvider(const String& baseURL, const String& engineURL)
 {
-    ewkViewAddSearchProvider(m_viewWidget, baseURL.utf8().data(), engineURL.utf8().data());
+    ewkViewAddSearchProvider(m_viewImpl->view(), baseURL.utf8().data(), engineURL.utf8().data());
 }
 
 unsigned long PageClientImpl::isSearchProviderInstalled(const String& baseURL, const String& engineURL)
 {
-    return ewkViewIsSearchProviderInstalled(m_viewWidget, baseURL.utf8().data(), engineURL.utf8().data());
+    return ewkViewIsSearchProviderInstalled(m_viewImpl->view(), baseURL.utf8().data(), engineURL.utf8().data());
 }
 #endif
 
 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
 bool PageClientImpl::getStandaloneStatus()
 {
-    return ewkViewGetStandaloneStatus(m_viewWidget);
+    return ewkViewGetStandaloneStatus(m_viewImpl->view());
 }
 #endif
 
 #if ENABLE(SCREEN_ORIENTATION_SUPPORT) && ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT)
 bool PageClientImpl::lockOrientation(int willLockOrientation)
 {
-    return ewk_view_orientation_lock(m_viewWidget, willLockOrientation);
+    return ewk_view_orientation_lock(m_viewImpl->view(), willLockOrientation);
 }
 
 void PageClientImpl::unlockOrientation()
 {
-    ewk_view_orientation_unlock(m_viewWidget);
+    ewk_view_orientation_unlock(m_viewImpl->view());
 }
 #endif
 
 void PageClientImpl::didRenderFrame()
 {
+#if OS(TIZEN)
+    if (m_nonemptyLayoutRendered)
+        ewkViewFrameRendered(m_viewImpl->view());
+#endif
+
 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
     if (m_shouldShowBackupTexture && m_isVisible)
         m_shouldShowBackupTexture = false;
 #endif
     if (!m_pageDidRendered) {
-        // adjustPositionForFixedLayers is calclulated based on m_drawingScrollPosition values which initially set.
-        // We need to set this values here, otherwise while navigating to new page, m_accurateVisibleContentsPosition will be having the previous scrolled position
-        // which makes positioning of the FixedLayer on wrong place
-        drawingArea()->setAccurateVisibleContentsPosition(FloatPoint(m_visibleContentRect.location()));
         m_pageDidRendered = true;
         initializeVisibleContentRect();
+    }
 
+#if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
+    if (m_waitFrameOfNewViewortSize) {
+        m_waitFrameOfNewViewortSize = false;
+        ewkViewRotatePrepared(m_viewImpl->view());
     }
+#endif
 }
 
 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
@@ -1526,7 +1425,7 @@ void PageClientImpl::setOverflowResult(bool pressed, WebLayerID webLayerID)
     if (pressed) {
         if (webLayerID) {
             setIsScrollableLayerFocused(true);
-            m_page->drawingArea()->layerTreeCoordinatorProxy()->layerTreeRenderer()->setFocusedLayerID(webLayerID);
+            m_viewImpl->page()->drawingArea()->layerTreeCoordinatorProxy()->layerTreeRenderer()->setFocusedLayerID(webLayerID);
         } else {
             setIsScrollableNodeFocused(true);
         }
@@ -1535,84 +1434,44 @@ void PageClientImpl::setOverflowResult(bool pressed, WebLayerID webLayerID)
 
 void PageClientImpl::findScrollableNode(const IntPoint& point)
 {
-    if (m_page && m_page->isLoadingFinished() && m_page->askOverflow()) {
+    WebPageProxy* pageProxy = m_viewImpl->page();
+    if (pageProxy && pageProxy->isLoadingFinished() && pageProxy->askOverflow()) {
         IntPoint pointForPress(m_viewImpl->transformFromScene().mapPoint(point));
         WebLayerID webLayerID = 0;
         bool checkOverflowLayer = false;
 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
-        DrawingAreaProxy* drawingArea = m_page->drawingArea();
+        DrawingAreaProxy* drawingArea = pageProxy->drawingArea();
         checkOverflowLayer = drawingArea && drawingArea->layerTreeCoordinatorProxy() && drawingArea->layerTreeCoordinatorProxy()->hasOverflowLayer();
 #endif
-        setOverflowResult(m_page->setPressedNodeAtPoint(pointForPress, checkOverflowLayer, webLayerID), webLayerID);
+        setOverflowResult(pageProxy->setPressedNodeAtPoint(pointForPress, checkOverflowLayer, webLayerID), webLayerID);
     }
 }
 #endif
 
-#if ENABLE(TIZEN_WEBKIT2_GET_TEXT_STYLE_FOR_SELECTION)
-void PageClientImpl::didGetTextStyleStateForSelection(int underlineState, int italicState, int boldState)
-{
-    WebCore::IntPoint startPoint, endPoint;
-    WebCore::IntRect leftRect, rightRect;
-
-    WebCore::IntRect caretRect;
-    page()->getCaretPosition(caretRect);
-    if (!caretRect.isEmpty()) {
-        startPoint.setX(caretRect.x());
-        startPoint.setY(caretRect.y() + caretRect.height());
-
-        endPoint.setX(caretRect.x() + caretRect.width());
-        endPoint.setY(caretRect.y() + caretRect.height());
-    }
-#if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
-    else if (page()->getSelectionHandlers(leftRect, rightRect)) {
-        startPoint.setX(leftRect.x());
-        startPoint.setY(leftRect.y() + leftRect.height());
-
-        endPoint.setX(rightRect.x() + rightRect.width());
-        endPoint.setY(rightRect.y() + rightRect.height());
-    }
-#endif
-
-    startPoint.scale(scaleFactor(), scaleFactor());
-    endPoint.scale(scaleFactor(), scaleFactor());
-
-    int viewPositionX, viewPositionY;
-    evas_object_geometry_get(m_viewWidget, &viewPositionX, &viewPositionY, NULL, NULL);
-
-    startPoint.move(-scrollPosition().x(),  -scrollPosition().y());
-    startPoint.move(viewPositionX, viewPositionY);
-
-    endPoint.move(-scrollPosition().x(),  -scrollPosition().y());
-    endPoint.move(viewPositionX, viewPositionY);
-
-    ewkViewDidGetTextStyleStateForSelection(m_viewWidget, underlineState, italicState, boldState, startPoint, endPoint);
-}
-#endif
-
 void PageClientImpl::didFindZoomableArea(const IntPoint& target, const IntRect& area)
 {
-    ewk_view_zoomable_area_set(m_viewWidget, target, area);
+    ewk_view_zoomable_area_set(m_viewImpl->view(), target, area);
 }
 
 #if ENABLE(TIZEN_ICON_DATABASE)
 void PageClientImpl::didReceiveIcon()
 {
-    ewkViewIconReceived(viewWidget());
+    ewkViewIconReceived(m_viewImpl->view());
 }
 #endif
 
 #if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
 void PageClientImpl::hideFocusRing()
 {
-    ewkViewFocusRingHide(viewWidget());
+    ewkViewFocusRingHide(m_viewImpl->view());
 }
 #endif
 #endif // #if OS(TIZEN)
 
 
 #if ENABLE(TIZEN_WEBKIT2_TILED_AC) && ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
-PageClientEvasGL::PageClientEvasGL(WebContext* context, WebPageGroup* pageGroup, Evas_Object* viewWidget)
-    : PageClientImpl(context, pageGroup, viewWidget)
+PageClientEvasGL::PageClientEvasGL(EwkViewImpl* viewImpl)
+    : PageClientImpl(viewImpl)
     , m_evasGL(0)
     , m_evasGlApi(0)
     , m_context(0)
@@ -1628,10 +1487,16 @@ PageClientEvasGL::PageClientEvasGL(WebContext* context, WebPageGroup* pageGroup,
 
 PageClientEvasGL::~PageClientEvasGL()
 {
-    m_page->close();
+    if (m_viewImpl && m_viewImpl->page())
+        m_viewImpl->page()->close();
+}
+
+void PageClientEvasGL::updateViewportSize(const WebCore::IntSize& viewportSize, const int angle)
+{
+    PageClientImpl::updateViewportSize(viewportSize, angle);
 }
 
-void PageClientEvasGL::updateViewportSize(const WebCore::IntSize& viewportSize)
+void PageClientEvasGL::updateVisibleContentRectSize(const WebCore::IntSize& size)
 {
     if (m_surface) {
         evas_gl_surface_destroy(m_evasGL, m_surface);
@@ -1639,19 +1504,20 @@ void PageClientEvasGL::updateViewportSize(const WebCore::IntSize& viewportSize)
     }
     setTargetSurface();
 
-    PageClientImpl::updateViewportSize(viewportSize);
+    PageClientImpl::updateVisibleContentRectSize(size);
 }
 
 void PageClientEvasGL::setViewNeedsDisplay(const WebCore::IntRect& rect)
 {
-#if !ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
-    drawContents();
+#if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
+    if (!isDirectRendering())
 #endif
-    ewk_view_display(viewWidget(), rect);
+    drawContents();
+    m_viewImpl->redrawRegion(rect);
 
 #if ENABLE(TIZEN_SCREEN_READER)
-    if (rect.intersects(ewkViewGetFocusRing(m_viewWidget)->rect()))
-        m_page->recalcScreenReaderFocusRect();
+    if (rect.intersects(ewkViewGetFocusRing(m_viewImpl->view())->rect()))
+        m_viewImpl->page()->recalcScreenReaderFocusRect();
 #endif
 }
 
@@ -1660,90 +1526,84 @@ void PageClientEvasGL::displayViewport()
 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
     // We should not draw here when Direct Rendering is enabled.
     // Because we will draw directly when evas is updated - on_pixels_for_accelerated_compositing().
-    ewk_view_mark_for_sync(m_viewWidget);
-#else
-    setViewNeedsDisplay(IntRect(IntPoint(), viewSize()));
+    if (isDirectRendering())
+        ewk_view_mark_for_sync(m_viewImpl->view());
+    else
 #endif
+    setViewNeedsDisplay(IntRect(IntPoint(), viewSize()));
 
 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
     updateScrollbar();
 #endif
 
 #if ENABLE(TIZEN_SCREEN_READER)
-    m_page->recalcScreenReaderFocusRect();
+    m_viewImpl->page()->recalcScreenReaderFocusRect();
 #endif
 }
 
 void PageClientEvasGL::drawContents()
 {
-    if (evas_gl_make_current(m_evasGL, m_surface, m_context) != EINA_TRUE)
+    if (!drawingArea() || !(drawingArea()->layerTreeCoordinatorProxy()))
+        return;
+
+    WebLayerTreeRenderer* renderer = drawingArea()->layerTreeCoordinatorProxy()->layerTreeRenderer();
+    if (!renderer)
+        return;
+
+    if (!makeContextCurrent())
         return;
 
     WebCore::TransformationMatrix matrix;
     IntRect clipRect;
     IntSize ewkViewSize = viewSize();
 
-    if (!m_hasSuspendedContent) {
-        // FIXME: We have to update EwkViewImpl's scale and position here because we use them to draw contents.
-        // PageViewport's values are updated when resuming content in the webkit opensource,
-        // but we have to update viewImpl's values here to sync with PageClient's values.
-        // However, We should not update them when hasSuspendedContent is true in order to maintain last values.
-        // The values will be updated when resuming content.
-        // Below codes should be refactored when PageViewportController codes are merged into Tizen.
-        m_viewImpl->setScaleFactor(m_drawingScaleFactor);
-        m_viewImpl->setScrollPosition(m_drawingScrollPosition);
-    }
-
 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
-    Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewWidget));
-    m_angle = ecore_evas_rotation_get(ee);
-    if (drawingArea())
-        drawingArea()->setAngle(m_angle);
-    matrix.rotate3d(0.0, 0.0, 1.0, 360 - m_angle);
-
-    if (m_angle == 90 || m_angle == 270) {
-        glViewport(0, 0, ewkViewSize.height(), ewkViewSize.width());
-        if (m_angle == 90)
-            matrix.translate(-ewkViewSize.width(), 0);
-        else if (m_angle == 270)
-            matrix.translate(0, -ewkViewSize.height());
-        clipRect = IntRect(IntPoint(), ewkViewSize.transposedSize());
-    } else {
+    if (isDirectRendering()) {
+        Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(m_viewImpl->view()));
+        m_angle = ecore_evas_rotation_get(ee);
+        renderer->setAngle(m_angle);
+        matrix.rotate3d(0.0, 0.0, 1.0, 360 - m_angle);
+
+        if (m_angle == 90 || m_angle == 270) {
+            glViewport(0, 0, ewkViewSize.height(), ewkViewSize.width());
+            if (m_angle == 90)
+                matrix.translate(-ewkViewSize.width(), 0);
+            else if (m_angle == 270)
+                matrix.translate(0, -ewkViewSize.height());
+            clipRect = IntRect(IntPoint(), ewkViewSize.transposedSize());
+        } else {
+            glViewport(0, 0, ewkViewSize.width(), ewkViewSize.height());
+            if (m_angle == 180)
+                matrix.translate(-ewkViewSize.width(), -ewkViewSize.height());
+            clipRect = IntRect(IntPoint(), ewkViewSize);
+        }
+    } else
+#endif
+    {
         glViewport(0, 0, ewkViewSize.width(), ewkViewSize.height());
-        if (m_angle == 180)
-            matrix.translate(-ewkViewSize.width(), -ewkViewSize.height());
         clipRect = IntRect(IntPoint(), ewkViewSize);
     }
-#else
-    glViewport(0, 0, ewkViewSize.width(), ewkViewSize.height());
-    clipRect = IntRect(IntPoint(), ewkViewSize);
-#endif
+
     matrix *= m_viewImpl->transformToView().toTransformationMatrix();
 
-    if (drawingArea()) {
-        if (drawingArea()->layerTreeCoordinatorProxy()) {
-            WebLayerTreeRenderer* renderer = drawingArea()->layerTreeCoordinatorProxy()->layerTreeRenderer();
 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
-            if (m_shouldMakeBackupTexture) {
-                glViewport(0, 0, m_initialViewRect.width(), m_initialViewRect.height());
-                glClearColor(1, 1, 1, 1);
-                glClear(GL_COLOR_BUFFER_BIT);
-                renderer->paintToBackupTexture(matrix, 1.0f, m_initialViewRect, m_bgColor);
-                m_shouldMakeBackupTexture = false;
-            } else if (m_shouldShowBackupTexture) {
-                matrix.makeIdentity();
-                glViewport(0, 0, m_initialViewRect.width(), m_initialViewRect.height());
-                renderer->showBackupTexture(matrix, 1.0f, m_initialViewRect);
-            } else
-#endif
-            renderer->paintToCurrentGLContext(matrix, 1.0f, clipRect, m_bgColor);
-        }
-    }
+    if (m_shouldMakeBackupTexture) {
+        glViewport(0, 0, m_initialViewRect.width(), m_initialViewRect.height());
+        glClearColor(1, 1, 1, 1);
+        glClear(GL_COLOR_BUFFER_BIT);
+        renderer->paintToBackupTexture(matrix, 1.0f, m_initialViewRect, m_bgColor);
+        m_shouldMakeBackupTexture = false;
+    } else if (m_shouldShowBackupTexture) {
+        matrix.makeIdentity();
+        glViewport(0, 0, m_initialViewRect.width(), m_initialViewRect.height());
+        renderer->showBackupTexture(matrix, 1.0f, m_initialViewRect);
+    } else
+#endif
+    renderer->paintToCurrentGLContext(matrix, 1.0f, clipRect, m_bgColor);
 }
 
 void PageClientEvasGL::didRenderFrame()
 {
-    ewkViewFrameRendered(m_viewWidget);
     PageClientImpl::didRenderFrame();
 }
 
@@ -1754,12 +1614,15 @@ bool PageClientEvasGL::makeContextCurrent()
 
 void PageClientEvasGL::initializeAcceleratedCompositingMode()
 {
-    Evas* evas = evas_object_evas_get(viewWidget());
+    Evas* evas = evas_object_evas_get(m_viewImpl->view());
 
     m_config = evas_gl_config_new();
 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
-    setenv("EVAS_GL_DIRECT_OVERRIDE", "1", 1);
-    m_config->options_bits = EVAS_GL_OPTIONS_DIRECT;
+    char* directRenderingEnv = getenv("TIZEN_WEBKIT_DIRECT_RENDERING");
+    if (!directRenderingEnv || atoi(directRenderingEnv)) {
+        setenv("EVAS_GL_DIRECT_OVERRIDE", "1", 1);
+        m_config->options_bits = EVAS_GL_OPTIONS_DIRECT;
+    }
 #endif
     m_config->color_format = EVAS_GL_RGBA_8888;
     m_config->depth_bits = EVAS_GL_DEPTH_BIT_24;
@@ -1841,7 +1704,7 @@ void PageClientEvasGL::setTargetSurface()
         return;
 
     int width, height;
-    evas_object_geometry_get(viewWidget(), 0, 0, &width, &height);
+    evas_object_geometry_get(m_viewImpl->view(), 0, 0, &width, &height);
     if (width == 0 || height == 0)
         return;
 
@@ -1852,19 +1715,22 @@ void PageClientEvasGL::setTargetSurface()
     }
 
 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
-    makeContextCurrent();
-#else
-    if (makeContextCurrent()) {
-        glViewport(0, 0, width, height);
-        glClearColor(1.0, 1.0, 1.0, 1.0);
-        glClear(GL_COLOR_BUFFER_BIT);
-        glFinish();
-    }
+    if (isDirectRendering())
+        makeContextCurrent();
+    else
 #endif
+    {
+        if (makeContextCurrent()) {
+            glViewport(0, 0, width, height);
+            glClearColor(1.0, 1.0, 1.0, 1.0);
+            glClear(GL_COLOR_BUFFER_BIT);
+            glFinish();
+        }
+    }
 
     Evas_Native_Surface nativeSurface;
     if (evas_gl_native_surface_get(m_evasGL, m_surface, &nativeSurface))
-        ewk_view_image_native_surface_set(viewWidget(), &nativeSurface);
+        ewk_view_image_native_surface_set(m_viewImpl->view(), &nativeSurface);
 }
 #endif