diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-22 09:09:45 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-22 09:10:13 +0100 |
commit | 470286ecfe79d59df14944e5b5d34630fc739391 (patch) | |
tree | 43983212872e06cebefd2ae474418fa2908ca54c /Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp | |
parent | 23037105e948c2065da5a937d3a2396b0ff45c1e (diff) | |
download | qtwebkit-470286ecfe79d59df14944e5b5d34630fc739391.tar.gz |
Imported WebKit commit e89504fa9195b2063b2530961d4b73dd08de3242 (http://svn.webkit.org/repository/webkit/trunk@135485)
Change-Id: I03774e5ac79721c13ffa30d152537a74d0b12e66
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp | 179 |
1 files changed, 162 insertions, 17 deletions
diff --git a/Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp b/Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp index 13812a649..2e4462734 100644 --- a/Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp +++ b/Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp @@ -21,6 +21,7 @@ #include "config.h" #include "EwkViewImpl.h" +#include "ContextMenuClientEfl.h" #include "EflScreenUtilities.h" #include "FindClientEfl.h" #include "FormClientEfl.h" @@ -34,6 +35,9 @@ #include "PagePolicyClientEfl.h" #include "PageUIClientEfl.h" #include "ResourceLoadClientEfl.h" +#include "WKDictionary.h" +#include "WKGeometry.h" +#include "WKNumber.h" #include "WKString.h" #include "WebContext.h" #include "WebPageGroup.h" @@ -42,17 +46,21 @@ #include "WebPreferences.h" #include "ewk_back_forward_list_private.h" #include "ewk_color_picker_private.h" +#include "ewk_context_menu_private.h" #include "ewk_context_private.h" #include "ewk_favicon_database_private.h" #include "ewk_popup_menu_item_private.h" #include "ewk_popup_menu_private.h" #include "ewk_private.h" +#include "ewk_security_origin_private.h" #include "ewk_settings_private.h" #include "ewk_view.h" #include "ewk_view_private.h" +#include "ewk_window_features_private.h" #include <Ecore_Evas.h> #include <Ecore_X.h> #include <Edje.h> +#include <WebCore/CairoUtilitiesEfl.h> #include <WebCore/Cursor.h> #if ENABLE(VIBRATION) @@ -109,6 +117,7 @@ EwkViewImpl::EwkViewImpl(Evas_Object* view, PassRefPtr<EwkContext> context, Pass , m_pagePolicyClient(PagePolicyClientEfl::create(this)) , m_pageUIClient(PageUIClientEfl::create(this)) , m_resourceLoadClient(ResourceLoadClientEfl::create(this)) + , m_contextMenuClient(ContextMenuClientEfl::create(this)) , m_findClient(FindClientEfl::create(this)) , m_formClient(FormClientEfl::create(this)) #if ENABLE(VIBRATION) @@ -119,13 +128,15 @@ EwkViewImpl::EwkViewImpl(Evas_Object* view, PassRefPtr<EwkContext> context, Pass , m_scaleFactor(1) #endif , m_settings(Ewk_Settings::create(this)) - , m_cursorGroup(0) + , m_cursorIdentifier(0) , m_mouseEventsEnabled(false) #if ENABLE(TOUCH_EVENTS) , m_touchEventsEnabled(false) #endif , m_displayTimer(this, &EwkViewImpl::displayTimerFired) , m_inputMethodContext(InputMethodContextEfl::create(this, smartData()->base.evas)) + , m_isHardwareAccelerated(true) + , m_setDrawsBackground(false) { ASSERT(m_view); ASSERT(m_context); @@ -148,6 +159,8 @@ EwkViewImpl::EwkViewImpl(Evas_Object* view, PassRefPtr<EwkContext> context, Pass m_pageProxy->pageGroup()->preferences()->setFullScreenEnabled(true); #endif + m_pageProxy->pageGroup()->preferences()->setOfflineWebApplicationCacheEnabled(true); + // Enable mouse events by default setMouseEventsEnabled(true); @@ -198,11 +211,38 @@ WKPageRef EwkViewImpl::wkPage() void EwkViewImpl::setCursor(const Cursor& cursor) { + if (cursor.image()) { + // Custom cursor. + if (cursor.image() == m_cursorIdentifier) + return; + + m_cursorIdentifier = cursor.image(); + + Ewk_View_Smart_Data* sd = smartData(); + RefPtr<Evas_Object> cursorObject = adoptRef(cursor.image()->getEvasObject(sd->base.evas)); + if (!cursorObject) + return; + + // Resize cursor. + evas_object_resize(cursorObject.get(), cursor.image()->size().width(), cursor.image()->size().height()); + + // Get cursor hot spot. + IntPoint hotSpot; + cursor.image()->getHotSpot(hotSpot); + + Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas); + // ecore_evas takes care of freeing the cursor object. + ecore_evas_object_cursor_set(ecoreEvas, cursorObject.release().leakRef(), EVAS_LAYER_MAX, hotSpot.x(), hotSpot.y()); + + return; + } + + // Standard cursor. const char* group = cursor.platformCursor(); - if (!group || group == m_cursorGroup) + if (!group || group == m_cursorIdentifier) return; - m_cursorGroup = group; + m_cursorIdentifier = group; Ewk_View_Smart_Data* sd = smartData(); RefPtr<Evas_Object> cursorObject = adoptRef(edje_object_add(sd->base.evas)); @@ -291,6 +331,21 @@ AffineTransform EwkViewImpl::transformToScreen() const return transform; } +#if USE(COORDINATED_GRAPHICS) +LayerTreeRenderer* EwkViewImpl::layerTreeRenderer() +{ + DrawingAreaProxy* drawingArea = page()->drawingArea(); + if (!drawingArea) + return 0; + + WebKit::LayerTreeCoordinatorProxy* layerTreeCoordinatorProxy = drawingArea->layerTreeCoordinatorProxy(); + if (!layerTreeCoordinatorProxy) + return 0; + + return layerTreeCoordinatorProxy->layerTreeRenderer(); +} +#endif + void EwkViewImpl::displayTimerFired(Timer<EwkViewImpl>*) { #if USE(COORDINATED_GRAPHICS) @@ -301,26 +356,46 @@ void EwkViewImpl::displayTimerFired(Timer<EwkViewImpl>*) // We are supposed to clip to the actual viewport, nothing less. IntRect viewport(sd->view.x, sd->view.y, sd->view.w, sd->view.h); - LayerTreeRenderer* renderer = page()->drawingArea()->layerTreeCoordinatorProxy()->layerTreeRenderer(); - renderer->setActive(true); - renderer->syncRemoteContent(); - - renderer->paintToCurrentGLContext(transformToScene().toTransformationMatrix(), /* opacity */ 1, viewport); + LayerTreeRenderer* renderer = layerTreeRenderer(); + if (!renderer) + return; - evas_object_image_data_update_add(sd->image, viewport.x(), viewport.y(), viewport.width(), viewport.height()); + renderer->setActive(true); + renderer->setDrawsBackground(m_setDrawsBackground); + if (m_isHardwareAccelerated) { + renderer->paintToCurrentGLContext(transformToScene().toTransformationMatrix(), /* opacity */ 1, viewport); + // sd->image is tied to a native surface. The native surface is in the parent's coordinates, + // so we need to account for the viewport position when calling evas_object_image_data_update_add. + evas_object_image_data_update_add(sd->image, viewport.x(), viewport.y(), viewport.width(), viewport.height()); + } else { + RefPtr<cairo_surface_t> surface = createSurfaceForImage(sd->image); + if (!surface) + return; + + RefPtr<cairo_t> graphicsContext = adoptRef(cairo_create(surface.get())); + cairo_scale(graphicsContext.get(), m_scaleFactor, m_scaleFactor); + cairo_translate(graphicsContext.get(), -m_scrollPosition.x(), -m_scrollPosition.y()); + renderer->paintToGraphicsContext(graphicsContext.get()); + evas_object_image_data_update_add(sd->image, 0, 0, viewport.width(), viewport.height()); + } #endif } void EwkViewImpl::update(const IntRect& rect) { + Ewk_View_Smart_Data* sd = smartData(); #if USE(COORDINATED_GRAPHICS) // Coordinated graphices needs to schedule an full update, not // repainting of a region. Update in the event loop. UNUSED_PARAM(rect); + + // Guard for zero sized viewport. + if (!(sd->view.w && sd->view.h)) + return; + if (!m_displayTimer.isActive()) m_displayTimer.startOneShot(0); #else - Ewk_View_Smart_Data* sd = smartData(); if (!sd->image) return; @@ -337,7 +412,9 @@ void EwkViewImpl::enterFullScreen() { Ewk_View_Smart_Data* sd = smartData(); - if (!sd->api->fullscreen_enter || !sd->api->fullscreen_enter(sd)) { + RefPtr<EwkSecurityOrigin> origin = EwkSecurityOrigin::create(KURL(ParsedURLString, String::fromUTF8(m_url))); + + if (!sd->api->fullscreen_enter || !sd->api->fullscreen_enter(sd, origin.get())) { Ecore_Evas* ecoreEvas = ecore_evas_ecore_evas_get(sd->base.evas); ecore_evas_fullscreen_set(ecoreEvas, true); } @@ -531,11 +608,21 @@ void EwkViewImpl::informIconChange() #if USE(ACCELERATED_COMPOSITING) bool EwkViewImpl::createGLSurface(const IntSize& viewSize) { + if (!m_isHardwareAccelerated) + return true; + if (!m_evasGL) { Evas* evas = evas_object_evas_get(m_view); m_evasGL = adoptPtr(evas_gl_new(evas)); - if (!m_evasGL) + if (!m_evasGL) { + WARN("Failed to create Evas_GL, falling back to software mode."); + m_isHardwareAccelerated = false; + layerTreeRenderer()->setAccelerationMode(TextureMapper::SoftwareMode); +#if ENABLE(WEBGL) + m_pageProxy->pageGroup()->preferences()->setWebGLEnabled(false); +#endif return false; + } } if (!m_evasGLContext) { @@ -575,6 +662,11 @@ bool EwkViewImpl::createGLSurface(const IntSize& viewSize) bool EwkViewImpl::enterAcceleratedCompositingMode() { + layerTreeRenderer()->setActive(true); + + if (!m_isHardwareAccelerated) + return true; + if (!m_evasGLSurface) { if (!createGLSurface(size())) { WARN("Failed to create GLSurface."); @@ -582,7 +674,6 @@ bool EwkViewImpl::enterAcceleratedCompositingMode() } } - page()->drawingArea()->layerTreeCoordinatorProxy()->layerTreeRenderer()->setActive(true); return true; } @@ -644,6 +735,38 @@ void EwkViewImpl::informContentsSizeChange(const IntSize& size) COMPILE_ASSERT_MATCHING_ENUM(EWK_TEXT_DIRECTION_RIGHT_TO_LEFT, RTL); COMPILE_ASSERT_MATCHING_ENUM(EWK_TEXT_DIRECTION_LEFT_TO_RIGHT, LTR); +void EwkViewImpl::showContextMenu(WebContextMenuProxyEfl* contextMenuProxy, const WebCore::IntPoint& position, const Vector<WebContextMenuItemData>& items) +{ + Ewk_View_Smart_Data* sd = smartData(); + ASSERT(sd->api); + + ASSERT(contextMenuProxy); + + if (!sd->api->context_menu_show) + return; + + if (m_contextMenu) + hideContextMenu(); + + m_contextMenu = Ewk_Context_Menu::create(this, contextMenuProxy, items); + + sd->api->context_menu_show(sd, position.x(), position.y(), m_contextMenu.get()); +} + +void EwkViewImpl::hideContextMenu() +{ + if (!m_contextMenu) + return; + + Ewk_View_Smart_Data* sd = smartData(); + ASSERT(sd->api); + + if (sd->api->context_menu_hide) + sd->api->context_menu_hide(sd); + + m_contextMenu.clear(); +} + void EwkViewImpl::requestPopupMenu(WebPopupMenuProxyEfl* popupMenuProxy, const IntRect& rect, TextDirection textDirection, double pageScaleFactor, const Vector<WebPopupItem>& items, int32_t selectedIndex) { Ewk_View_Smart_Data* sd = smartData(); @@ -762,23 +885,45 @@ void EwkViewImpl::informURLChange() informIconChange(); } -WKPageRef EwkViewImpl::createNewPage() +EwkWindowFeatures* EwkViewImpl::windowFeatures() { - Evas_Object* newEwkView = 0; - smartCallback<CreateWindow>().call(&newEwkView); + if (!m_windowFeatures) + m_windowFeatures = EwkWindowFeatures::create(0, this); + + return m_windowFeatures.get(); +} + +WKPageRef EwkViewImpl::createNewPage(ImmutableDictionary* windowFeatures) +{ + Ewk_View_Smart_Data* sd = smartData(); + ASSERT(sd->api); + if (!sd->api->window_create) + return 0; + + RefPtr<EwkWindowFeatures> ewkWindowFeatures = EwkWindowFeatures::create(windowFeatures, this); + + Evas_Object* newEwkView = sd->api->window_create(sd, ewkWindowFeatures.get()); if (!newEwkView) return 0; EwkViewImpl* newViewImpl = EwkViewImpl::fromEvasObject(newEwkView); ASSERT(newViewImpl); + newViewImpl->m_windowFeatures = ewkWindowFeatures; + return static_cast<WKPageRef>(WKRetain(newViewImpl->page())); } void EwkViewImpl::closePage() { - smartCallback<CloseWindow>().call(); + Ewk_View_Smart_Data* sd = smartData(); + ASSERT(sd->api); + + if (!sd->api->window_close) + return; + + sd->api->window_close(sd); } void EwkViewImpl::onMouseDown(void* data, Evas*, Evas_Object*, void* eventInfo) |