blob: 3f147ba08c9ae6cd27c00490538107eac1903891 [file] [log] [blame]
/*
* Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_FONT_RESOURCE_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_RESOURCE_FONT_RESOURCE_H_
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_refptr.h"
#include "base/single_thread_task_runner.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_client.h"
#include "third_party/blink/renderer/platform/web_task_runner.h"
namespace blink {
class FetchParameters;
class ResourceFetcher;
class FontCustomPlatformData;
class FontResourceClient;
class CORE_EXPORT FontResource final : public Resource {
public:
static FontResource* Fetch(FetchParameters&,
ResourceFetcher*,
FontResourceClient*);
~FontResource() override;
void DidAddClient(ResourceClient*) override;
void SetRevalidatingRequest(const ResourceRequest&) override;
void AllClientsAndObserversRemoved() override;
void StartLoadLimitTimersIfNecessary(base::SingleThreadTaskRunner*);
String OtsParsingMessage() const { return ots_parsing_message_; }
scoped_refptr<FontCustomPlatformData> GetCustomFontData();
// Returns true if the loading priority of the remote font resource can be
// lowered. The loading priority of the font can be lowered only if the
// font is not needed for painting the text.
bool IsLowPriorityLoadingAllowedForRemoteFont() const;
void WillReloadAfterDiskCacheMiss() override;
void OnMemoryDump(WebMemoryDumpLevelOfDetail,
WebProcessMemoryDump*) const override;
private:
class FontResourceFactory : public NonTextResourceFactory {
public:
FontResourceFactory() : NonTextResourceFactory(ResourceType::kFont) {}
Resource* Create(const ResourceRequest& request,
const ResourceLoaderOptions& options) const override {
return new FontResource(request, options);
}
};
FontResource(const ResourceRequest&, const ResourceLoaderOptions&);
void NotifyFinished() override;
void FontLoadShortLimitCallback();
void FontLoadLongLimitCallback();
void NotifyClientsShortLimitExceeded();
void NotifyClientsLongLimitExceeded();
// This is used in UMA histograms, should not change order.
enum LoadLimitState {
kLoadNotStarted,
kUnderLimit,
kShortLimitExceeded,
kLongLimitExceeded,
kLoadLimitStateEnumMax
};
scoped_refptr<FontCustomPlatformData> font_data_;
String ots_parsing_message_;
LoadLimitState load_limit_state_;
bool cors_failed_;
TaskHandle font_load_short_limit_;
TaskHandle font_load_long_limit_;
friend class MemoryCache;
FRIEND_TEST_ALL_PREFIXES(FontResourceTest, CacheAwareFontLoading);
};
DEFINE_RESOURCE_TYPE_CASTS(Font);
class FontResourceClient : public ResourceClient {
public:
~FontResourceClient() override = default;
bool IsFontResourceClient() const final { return true; }
// If cache-aware loading is activated, both callbacks will be blocked until
// disk cache miss. Calls to addClient() and removeClient() in both callbacks
// are prohibited to prevent race issues regarding current loading state.
virtual void FontLoadShortLimitExceeded(FontResource*) {}
virtual void FontLoadLongLimitExceeded(FontResource*) {}
// Returns true if loading priority of remote font resources can be lowered.
virtual bool IsLowPriorityLoadingAllowedForRemoteFont() const {
// Only the RemoteFontFaceSources clients can prevent lowering of loading
// priority of the remote fonts. Set the default to true to prevent
// other clients from incorrectly returning false.
return true;
}
};
} // namespace blink
#endif