Changeset 132483 in webkit


Ignore:
Timestamp:
Oct 25, 2012 7:48:41 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

[EFL][WK2][AC] Regression(132392) infinite loop when displaying certain animations.
https://bugs.webkit.org/show_bug.cgi?id=100288

Patch by Yael Aharon <yael.aharon@intel.com> on 2012-10-25
Reviewed by Kenneth Rohde Christiansen.

When PageClientImpl::setViewNeedsDisplay is called, start a 0 length timer.
That breaks the synchronous loop we were experiencing when ewk_view_display
was called directly.

  • UIProcess/API/efl/EwkViewImpl.cpp:

(EwkViewImpl::EwkViewImpl):
(EwkViewImpl::displayTimerFired):
(EwkViewImpl::redrawRegion):

  • UIProcess/API/efl/EwkViewImpl.h:

(EwkViewImpl):

Location:
trunk/Source/WebKit2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r132480 r132483  
     12012-10-25  Yael Aharon  <yael.aharon@intel.com>
     2
     3        [EFL][WK2][AC] Regression(132392) infinite loop when displaying certain animations.
     4        https://bugs.webkit.org/show_bug.cgi?id=100288
     5
     6        Reviewed by Kenneth Rohde Christiansen.
     7
     8        When PageClientImpl::setViewNeedsDisplay is called, start a 0 length timer.
     9        That breaks the synchronous loop we were experiencing when ewk_view_display
     10        was called directly.
     11
     12        * UIProcess/API/efl/EwkViewImpl.cpp:
     13        (EwkViewImpl::EwkViewImpl):
     14        (EwkViewImpl::displayTimerFired):
     15        (EwkViewImpl::redrawRegion):
     16        * UIProcess/API/efl/EwkViewImpl.h:
     17        (EwkViewImpl):
     18
    1192012-10-25  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
    220
  • trunk/Source/WebKit2/UIProcess/API/efl/EwkViewImpl.cpp

    r132463 r132483  
    156156#endif
    157157    , m_view(view)
     158    , m_displayTimer(this, &EwkViewImpl::displayTimerFired)
    158159{
    159160    ASSERT(view);
     
    247248}
    248249
    249 void EwkViewImpl::redrawRegion(const IntRect& rect)
     250void EwkViewImpl::displayTimerFired(WebCore::Timer<EwkViewImpl>*)
    250251{
    251252    Ewk_View_Smart_Data* sd = smartData();
     
    256257#if USE(COORDINATED_GRAPHICS)
    257258    EWK_VIEW_IMPL_GET_OR_RETURN(sd, viewImpl);
    258 
    259     evas_gl_make_current(viewImpl->evasGl, viewImpl->evasGlSurface, viewImpl->evasGlContext);
    260     viewImpl->pageViewportControllerClient->display(rect, IntPoint(sd->view.x, sd->view.y));
    261 #endif
    262 
    263     evas_object_image_data_update_add(sd->image, rect.x(), rect.y(), rect.width(), rect.height());
     259#endif
     260
     261    Region dirtyRegion;
     262    for (Vector<IntRect>::iterator it = m_dirtyRects.begin(); it != m_dirtyRects.end(); ++it)
     263        dirtyRegion.unite(*it);
     264
     265    m_dirtyRects.clear();
     266
     267    Vector<IntRect> rects = dirtyRegion.rects();
     268    Vector<IntRect>::iterator end = rects.end();
     269
     270    for (Vector<IntRect>::iterator it = rects.begin(); it != end; ++it) {
     271        IntRect rect = *it;
     272#if USE(COORDINATED_GRAPHICS)
     273        evas_gl_make_current(viewImpl->evasGl, viewImpl->evasGlSurface, viewImpl->evasGlContext);
     274        viewImpl->pageViewportControllerClient->display(rect, IntPoint(sd->view.x, sd->view.y));
     275#endif
     276
     277        evas_object_image_data_update_add(sd->image, rect.x(), rect.y(), rect.width(), rect.height());
     278    }
     279}
     280
     281void EwkViewImpl::redrawRegion(const IntRect& rect)
     282{
     283    if (!m_displayTimer.isActive())
     284        m_displayTimer.startOneShot(0);
     285    m_dirtyRects.append(rect);
    264286}
    265287
  • trunk/Source/WebKit2/UIProcess/API/efl/EwkViewImpl.h

    r132463 r132483  
    2929#include <Evas.h>
    3030#include <WebCore/TextDirection.h>
     31#include <WebCore/Timer.h>
    3132#include <WebKit2/WKBase.h>
    3233#include <wtf/HashMap.h>
     
    229230private:
    230231    Ewk_View_Smart_Data* smartData();
     232    void displayTimerFired(WebCore::Timer<EwkViewImpl>*);
    231233
    232234    Evas_Object* m_view;
    233235    typedef HashMap<WKPageRef, const Evas_Object*> PageViewMap;
    234236    static PageViewMap pageViewMap;
     237    WebCore::Timer<EwkViewImpl> m_displayTimer;
     238    WTF::Vector <WebCore::IntRect> m_dirtyRects;
    235239};
    236240
Note: See TracChangeset for help on using the changeset viewer.