Changeset 162063 in webkit


Ignore:
Timestamp:
Jan 15, 2014, 2:28:52 AM (11 years ago)
Author:
Antti Koivisto
Message:

Suspend resource requests during computedStyle
https://bugs.webkit.org/show_bug.cgi?id=127034

Reviewed by Andreas Kling.

We have some cases where getting computed style leads to crashes in loadPendingImages.
This is probably caused by load callbacks resulting in re-entering WebKit and killing the StyleResolver.

As a speculative fix suspend resource loads (and so callbacks) when getting the computed style.
We do similar suspension during style recalc for the same reason.

  • dom/Document.cpp:

(WebCore::Document::styleForElementIgnoringPendingStylesheets):

  • loader/ResourceLoadScheduler.h:

(WebCore::ResourceLoadScheduler::Suspender::Suspender):
(WebCore::ResourceLoadScheduler::Suspender::~Suspender):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r162062 r162063  
     12014-01-15  Antti Koivisto  <antti@apple.com>
     2
     3        Suspend resource requests during computedStyle
     4        https://bugs.webkit.org/show_bug.cgi?id=127034
     5
     6        Reviewed by Andreas Kling.
     7
     8        We have some cases where getting computed style leads to crashes in loadPendingImages.
     9        This is probably caused by load callbacks resulting in re-entering WebKit and killing the StyleResolver.
     10       
     11        As a speculative fix suspend resource loads (and so callbacks) when getting the computed style.
     12        We do similar suspension during style recalc for the same reason.
     13
     14        * dom/Document.cpp:
     15        (WebCore::Document::styleForElementIgnoringPendingStylesheets):
     16        * loader/ResourceLoadScheduler.h:
     17        (WebCore::ResourceLoadScheduler::Suspender::Suspender):
     18        (WebCore::ResourceLoadScheduler::Suspender::~Suspender):
     19
    1202014-01-15  László Langó  <llango.u-szeged@partner.samsung.com>
    221
  • trunk/Source/WebCore/dom/Document.cpp

    r161851 r162063  
    9393#include "JSLazyEventListener.h"
    9494#include "Language.h"
     95#include "LoaderStrategy.h"
    9596#include "Logging.h"
    9697#include "MainFrame.h"
     
    108109#include "PageTransitionEvent.h"
    109110#include "PlatformLocale.h"
     111#include "PlatformStrategies.h"
    110112#include "PlugInsResources.h"
    111113#include "PluginDocument.h"
     
    115117#include "RenderView.h"
    116118#include "RenderWidget.h"
     119#include "ResourceLoadScheduler.h"
    117120#include "ResourceLoader.h"
    118121#include "RuntimeEnabledFeatures.h"
     
    18661869{
    18671870    ASSERT_ARG(element, &element->document() == this);
     1871
     1872    // On iOS request delegates called during styleForElement may result in re-entering WebKit and killing the style resolver.
     1873    ResourceLoadScheduler::Suspender suspender(*platformStrategies()->loaderStrategy()->resourceLoadScheduler());
    18681874
    18691875    TemporaryChange<bool> change(m_ignorePendingStylesheets, true);
  • trunk/Source/WebCore/loader/ResourceLoadScheduler.h

    r161768 r162063  
    6363    virtual void setSerialLoadingEnabled(bool b) { m_isSerialLoadingEnabled = b; }
    6464
     65    class Suspender {
     66    public:
     67        explicit Suspender(ResourceLoadScheduler& scheduler) : m_scheduler(scheduler) { m_scheduler.suspendPendingRequests(); }
     68        ~Suspender() { m_scheduler.resumePendingRequests(); }
     69    private:
     70        ResourceLoadScheduler& m_scheduler;
     71    };
     72
    6573protected:
    6674    ResourceLoadScheduler();
Note: See TracChangeset for help on using the changeset viewer.