change for webpagecapture
[framework/osp/web.git] / src / controls / FWebCtrl_Web.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 9b55a6b..f92d336
@@ -38,6 +38,7 @@
 #include <FSys_VibratorImpl.h>
 #include <FUiAnim_EflNode.h>
 #include <FUiAnim_VisualElement.h>
+#include <FUiAnim_VisualElementImpl.h>
 #include <FUi_CoordinateSystemUtils.h>
 #include <FUi_AccessibilityContainer.h>
 #include <FUi_AccessibilityElement.h>
@@ -389,9 +390,13 @@ _Web::CreateWebkitEvasObject(void)
        std::unique_ptr<_EflWebkit> pEflWebkit(new (std::nothrow) _EflWebkit());
        SysTryReturnResult(NID_WEB_CTRL, pEflWebkit.get(), E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
 
-       r = pEflWebkit->Construct(GetAbsoluteBounds(), *GetVisualElement(), this);
+       _VisualElement* pVe = GetVisualElement();
+       r = pEflWebkit->Construct(GetAbsoluteBounds(), *pVe, this);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
 
+       _VisualElementImpl* pVeImpl = _VisualElementImpl::GetInstance(*pVe);
+       pVeImpl->SetCaptureProvider(this);
+
        __pEflWebkit = std::move(pEflWebkit);
 
        Evas_Object* pView = GetWebNativeNode();
@@ -954,18 +959,21 @@ _Web::OnPinchGestureCanceled(Tizen::Ui::_TouchPinchGestureDetector& gesture)
 Canvas*
 _Web::OnCanvasRequestedN(const FloatRectangle& bounds)
 {
-       result r = E_SUCCESS;
+       SysTryReturn(NID_WEB_CTRL, bounds.width >= 0.0f && bounds.height >= 0.0f, null, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] Canvas size is out of range. size = (%f, %f)", bounds.width, bounds.height);
+       if (bounds.width == 0.0f || bounds.height == 0.0f)
+       {
+               FloatDimension size(GetSizeF());
+               SysTryReturn(NID_WEB_CTRL, bounds.x >= 0.0f && bounds.y >= 0.0f && bounds.x <= size.width && bounds.y <= size.height, null, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] Bounds is out of range.");
+       }
 
-       Evas_Object* pWebFrame = GetWebNativeNode();
-       Eina_Rectangle rect;
-       BufferInfo bufferInfo;
+       result r = E_SUCCESS;
 
-       Point absPoint(_CoordinateSystemUtils::ConvertToInteger(GetAbsoluteCoordinate(FloatPoint(bounds.x, bounds.y))));
-       Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::HorizontalTransform(bounds.width)),
-               _CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::VerticalTransform(bounds.height)));
+       Rectangle absBounds(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::Transform(bounds)));
 
-       EINA_RECTANGLE_SET(&rect, absPoint.x, absPoint.y, absSize.width, absSize.height);
+       Eina_Rectangle rect;
+       EINA_RECTANGLE_SET(&rect, absBounds.x, absBounds.y, absBounds.width, absBounds.height);
 
+       Evas_Object* pWebFrame = GetWebNativeNode();
        Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
 
        std::unique_ptr<Canvas> pCanvas(new (std::nothrow) Canvas());
@@ -973,6 +981,8 @@ _Web::OnCanvasRequestedN(const FloatRectangle& bounds)
 
        if (pScreenShot)
        {
+               BufferInfo bufferInfo;
+
                r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
                evas_object_del(pScreenShot);
                SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
@@ -995,24 +1005,12 @@ _Web::OnCapturedBitmapRequestedN(void)
 {
        result r = E_SUCCESS;
 
-       Evas_Object* pWebFrame = GetWebNativeNode();
-       Eina_Rectangle rect;
-       ByteBuffer buffer;
        BufferInfo bufferInfo;
+       SysTryReturn(NID_WEB_CTRL, OnCaptureAcquire(bufferInfo), null, E_SYSTEM, "[%s] A system error has been occurred. Failed to get snapshot of Web control", GetErrorMessage(E_SYSTEM));
 
-       Dimension size(GetSize());
-       Point absSize(GetAbsoluteCoordinate(Point(size.width, size.height)));
-
-       EINA_RECTANGLE_SET(&rect, 0, 0, absSize.x, absSize.y);
-
-       Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
-       SysTryReturn(NID_WEB_CTRL, pScreenShot, null, E_SYSTEM, "[%s] A system error has been occurred. Failed to get snapshot of Web control", GetErrorMessage(E_SYSTEM));
-
-       r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, bufferInfo);
-       evas_object_del(pScreenShot);
-       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
-
+       ByteBuffer buffer;
        int bufferSize = bufferInfo.bitsPerPixel * bufferInfo.width * bufferInfo.height;
+
        r = buffer.Construct(reinterpret_cast < byte* >(bufferInfo.pPixels), 0, bufferSize, bufferSize);
        SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] propagating", GetErrorMessage(r));
 
@@ -1026,6 +1024,31 @@ _Web::OnCapturedBitmapRequestedN(void)
 }
 
 
+bool
+_Web::OnCaptureAcquire(BufferInfo& output)
+{
+       result r = E_SUCCESS;
+
+       FloatPoint position(GetPositionF());
+       FloatDimension size(GetSizeF());
+
+       Dimension absSize(_CoordinateSystemUtils::ConvertToInteger(_CoordinateSystemUtils::Transform(size)));
+
+       Eina_Rectangle rect;
+       EINA_RECTANGLE_SET(&rect, 0, 0, absSize.width, absSize.height);
+
+       Evas_Object* pWebFrame = GetWebNativeNode();
+       Evas_Object* pScreenShot = ewk_view_screenshot_contents_get(pWebFrame, rect, 1.0f, evas_object_evas_get(pWebFrame));
+       SysTryReturn(NID_WEB_CTRL, pScreenShot, false, E_SYSTEM, "[%s] A system error has been occurred. Failed to get snapshot of Web control", GetErrorMessage(E_SYSTEM));
+
+       r = _Utility::GetPixelBufferFromEvasObject(pScreenShot, output);
+       evas_object_del(pScreenShot);
+       SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, false, r, "[%s] propagating", GetErrorMessage(r));
+
+       return true;
+}
+
+
 void
 _Web::DumpPointList(void* pData)
 {