Commit edf0f13e authored by yhirano's avatar yhirano Committed by Commit bot

Move FontResourceClient to Oilpan heap

This change makes FontResourceClient a GarbageCollectedMixin
subclass.

Registering a prefinalizer in a class T is not possible when
 - T has multiple GarbageCollectedMixin base classes, and
 - T doesn't have USING_GARBAGE_COLLECTED_MIXIN statement.

Hence this CL modifies ResourceOwner<R, C> definition so that it
inherits GarbageCollectedMixin only when C is not derived from
GarbageCollectedMixin.

BUG=587663

Review-Url: https://codereview.chromium.org/2014533002
Cr-Commit-Position: refs/heads/master@{#397045}
parent 04b26cac
......@@ -219,6 +219,7 @@ DEFINE_TRACE(RemoteFontFaceSource)
visitor->trace(m_font);
visitor->trace(m_fontSelector);
CSSFontFaceSource::trace(visitor);
FontResourceClient::trace(visitor);
}
void RemoteFontFaceSource::FontLoadHistograms::loadStarted()
......
......@@ -24,6 +24,7 @@ enum FontDisplay {
class RemoteFontFaceSource final : public CSSFontFaceSource, public FontResourceClient {
USING_PRE_FINALIZER(RemoteFontFaceSource, dispose);
USING_GARBAGE_COLLECTED_MIXIN(RemoteFontFaceSource);
public:
enum DisplayPeriod { BlockPeriod, SwapPeriod, FailurePeriod };
......
......@@ -30,6 +30,7 @@
#include "core/fetch/ResourceClient.h"
#include "platform/Timer.h"
#include "platform/fonts/FontOrientation.h"
#include "platform/heap/Handle.h"
#include "wtf/OwnPtr.h"
namespace blink {
......@@ -95,13 +96,15 @@ private:
DEFINE_RESOURCE_TYPE_CASTS(Font);
class FontResourceClient : public ResourceClient {
class FontResourceClient : public GarbageCollectedMixin, public ResourceClient {
public:
~FontResourceClient() override {}
static bool isExpectedType(ResourceClient* client) { return client->getResourceClientType() == FontType; }
ResourceClientType getResourceClientType() const final { return FontType; }
virtual void fontLoadShortLimitExceeded(FontResource*) {}
virtual void fontLoadLongLimitExceeded(FontResource*) {}
DEFINE_INLINE_VIRTUAL_TRACE() {}
};
} // namespace blink
......
......@@ -32,22 +32,49 @@
#define ResourceOwner_h
#include "core/fetch/Resource.h"
#include <type_traits>
namespace blink {
template <typename Client, bool isClientGarbageCollectedMixin>
class ResourceOwnerBase;
template <typename Client>
class ResourceOwnerBase<Client, true> : public Client {
public:
DEFINE_INLINE_VIRTUAL_TRACE()
{
Client::trace(visitor);
}
};
// TODO(yhirano): Remove this template once all ResourceClients become
// GarbageCollectedMixin.
template <typename Client>
class ResourceOwnerBase<Client, false> : public GarbageCollectedMixin, public Client {
public:
DEFINE_INLINE_VIRTUAL_TRACE() {}
};
template<class R, class C = typename R::ClientType>
class ResourceOwner : public GarbageCollectedMixin, public C {
class ResourceOwner : public ResourceOwnerBase<C, std::is_base_of<GarbageCollectedMixin, C>::value> {
USING_PRE_FINALIZER(ResourceOwner, clearResource);
public:
using ResourceType = R;
~ResourceOwner() override {}
ResourceType* resource() const { return m_resource; }
virtual ~ResourceOwner();
ResourceType* resource() const { return m_resource.get(); }
DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_resource); }
DEFINE_INLINE_TRACE()
{
visitor->trace(m_resource);
ResourceOwnerBase<C, std::is_base_of<GarbageCollectedMixin, C>::value>::trace(visitor);
}
protected:
ResourceOwner();
ResourceOwner()
{
ThreadState::current()->registerPreFinalizer(this);
}
void setResource(ResourceType*);
void clearResource() { setResource(nullptr); }
......@@ -56,17 +83,6 @@ private:
Member<ResourceType> m_resource;
};
template<class R, class C>
inline ResourceOwner<R, C>::ResourceOwner()
{
ThreadState::current()->registerPreFinalizer(this);
}
template<class R, class C>
inline ResourceOwner<R, C>::~ResourceOwner()
{
}
template<class R, class C>
inline void ResourceOwner<R, C>::setResource(R* newResource)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment