#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "third_party/blink/renderer/core/html/parser/html_srcset_parser.h"
#include <algorithm>
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/platform/web_network_state_notifier.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/frame/frame_console.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
#include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h"
#include "third_party/blink/renderer/core/inspector/console_message.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
#include "third_party/blink/renderer/platform/json/json_values.h"
#include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h"
#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "third_party/blink/renderer/platform/wtf/text/character_visitor.h"
#include "third_party/blink/renderer/platform/wtf/text/parsing_utilities.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
#include "third_party/blink/renderer/platform/wtf/text/string_to_number.h"
namespace blink {
static bool CompareByDensity(const ImageCandidate& first,
const ImageCandidate& second) { … }
enum DescriptorTokenizerState { … };
struct DescriptorToken { … };
template <typename CharType>
static void AppendDescriptorAndReset(const CharType* attribute_start,
const CharType*& descriptor_start,
const CharType* position,
Vector<DescriptorToken>& descriptors) { … }
template <typename CharType>
static void AppendCharacter(const CharType* descriptor_start,
const CharType* position) { … }
template <typename CharType>
static bool IsEOF(const CharType* position, const CharType* end) { … }
template <typename CharType>
static void TokenizeDescriptors(const CharType* attribute_start,
const CharType*& position,
const CharType* attribute_end,
Vector<DescriptorToken>& descriptors) { … }
static void SrcsetError(Document* document, String message) { … }
template <typename CharType>
static bool ParseDescriptors(const CharType* attribute,
Vector<DescriptorToken>& descriptors,
DescriptorParsingResult& result,
Document* document) { … }
static bool ParseDescriptors(const String& attribute,
Vector<DescriptorToken>& descriptors,
DescriptorParsingResult& result,
Document* document) { … }
template <typename CharType>
static void ParseImageCandidatesFromSrcsetAttribute(
const String& attribute,
const CharType* attribute_start,
unsigned length,
Vector<ImageCandidate>& image_candidates,
Document* document) { … }
static void ParseImageCandidatesFromSrcsetAttribute(
const String& attribute,
Vector<ImageCandidate>& image_candidates,
Document* document) { … }
static unsigned SelectionLogic(Vector<ImageCandidate*>& image_candidates,
float device_scale_factor) { … }
static unsigned AvoidDownloadIfHigherDensityResourceIsInCache(
Vector<ImageCandidate*>& image_candidates,
unsigned winner,
Document* document) { … }
static ImageCandidate PickBestImageCandidate(
float device_scale_factor,
float source_size,
Vector<ImageCandidate>& image_candidates,
Document* document = nullptr) { … }
ImageCandidate BestFitSourceForSrcsetAttribute(float device_scale_factor,
float source_size,
const String& srcset_attribute,
Document* document) { … }
ImageCandidate BestFitSourceForImageAttributes(float device_scale_factor,
float source_size,
const String& src_attribute,
const String& srcset_attribute,
Document* document) { … }
String BestFitSourceForImageAttributes(float device_scale_factor,
float source_size,
const String& src_attribute,
ImageCandidate& srcset_image_candidate) { … }
}