Files
tubestation/image/decoders/nsIconDecoder.h
Timothy Nikkel 12e67dbdcf Bug 1885209. Sanity check pixel format of internal icon type images. r=gfx-reviewers,nical
The page has

  <link rel="shortcut icon" type="image/x-icon" href="data:image/icon;base64,__png_data__">

When the Favicon service tries to decode that is passes "image/icon" as the mimetype to choose the decoder type and so we try to decode it as our internal icon format (not a format used in the wild, only used internal to get pass around icon data we retrieved from the OS). This passes in an invalid format type and hits the assert. In a non-debug build we fail to create the surface pipe later when we can't find a swizzle function. We only ever create these icon files with formats R8G8B8A8, OS_RGBA, or B8G8R8A8. The favicon still gets displayed so the favicon service must be trying something more complicated if that fails.

In the normal content image loading path we prefer to sniff the content type from the image data and if that fails fall back to the specified content type. So the test had be careful not to look like png (or any other) image format so that we actually tried to decode it as an icon.

Differential Revision: https://phabricator.services.mozilla.com/D204732
2024-05-21 00:41:56 +00:00

67 lines
2.2 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_image_decoders_nsIconDecoder_h
#define mozilla_image_decoders_nsIconDecoder_h
#include "Decoder.h"
#include "StreamingLexer.h"
#include "SurfacePipe.h"
namespace mozilla {
namespace image {
class RasterImage;
////////////////////////////////////////////////////////////////////////////////
// The icon decoder is a decoder specifically tailored for loading icons
// from the OS. We've defined our own little format to represent these icons
// and this decoder takes that format and converts it into 24-bit RGB with
// alpha channel support. It was modeled a bit off the PPM decoder.
//
// The format of the incoming data is as follows:
//
// The first two bytes contain the width and the height of the icon.
// The third byte contains the pixel format.
// The fourth byte contains the color transform.
// The remaining bytes contain the icon data, 4 bytes per pixel, in
// ARGB order (platform endianness, A in highest bits, B in lowest
// bits), row-primary, top-to-bottom, left-to-right, with
// premultiplied alpha.
//
////////////////////////////////////////////////////////////////////////////////
class nsIconDecoder : public Decoder {
public:
virtual ~nsIconDecoder();
DecoderType GetType() const override { return DecoderType::ICON; }
LexerResult DoDecode(SourceBufferIterator& aIterator,
IResumable* aOnResume) override;
private:
friend class DecoderFactory;
// Decoders should only be instantiated via DecoderFactory.
explicit nsIconDecoder(RasterImage* aImage);
enum class State { HEADER, ROW_OF_PIXELS, FINISH };
LexerTransition<State> ReadHeader(const char* aData);
LexerTransition<State> ReadRowOfPixels(const char* aData, size_t aLength);
LexerTransition<State> Finish();
StreamingLexer<State> mLexer;
SurfacePipe mPipe;
uint32_t mBytesPerRow;
};
} // namespace image
} // namespace mozilla
#endif // mozilla_image_decoders_nsIconDecoder_h