// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SKY_ENGINE_CORE_CSS_MEDIAVALUESCACHED_H_
#define SKY_ENGINE_CORE_CSS_MEDIAVALUESCACHED_H_

#include "sky/engine/core/css/MediaValues.h"

namespace blink {

class MediaValuesCached final : public MediaValues {
public:
    struct MediaValuesCachedData {
        // Members variables must be thread safe, since they're copied to the parser thread
        int viewportWidth;
        int viewportHeight;
        int deviceWidth;
        int deviceHeight;
        float devicePixelRatio;
        int colorBitsPerComponent;
        int monochromeBitsPerComponent;
        PointerType primaryPointerType;
        int availablePointerTypes;
        HoverType primaryHoverType;
        int availableHoverTypes;
        int defaultFontSize;
        bool threeDEnabled;
        bool strictMode;
        String mediaType;

        MediaValuesCachedData()
            : viewportWidth(0)
            , viewportHeight(0)
            , deviceWidth(0)
            , deviceHeight(0)
            , devicePixelRatio(1.0)
            , colorBitsPerComponent(24)
            , monochromeBitsPerComponent(0)
            , primaryPointerType(PointerTypeNone)
            , availablePointerTypes(PointerTypeNone)
            , primaryHoverType(HoverTypeNone)
            , availableHoverTypes(HoverTypeNone)
            , defaultFontSize(16)
            , threeDEnabled(false)
            , strictMode(true)
        {
        }
    };

    static PassRefPtr<MediaValues> create();
    static PassRefPtr<MediaValues> create(Document&);
    static PassRefPtr<MediaValues> create(LocalFrame*);
    static PassRefPtr<MediaValues> create(MediaValuesCachedData&);
    virtual PassRefPtr<MediaValues> copy() const override;
    virtual bool isSafeToSendToAnotherThread() const override;
    virtual bool computeLength(double value, CSSPrimitiveValue::UnitType, int& result) const override;
    virtual bool computeLength(double value, CSSPrimitiveValue::UnitType, double& result) const override;

    virtual int viewportWidth() const override;
    virtual int viewportHeight() const override;
    virtual int deviceWidth() const override;
    virtual int deviceHeight() const override;
    virtual float devicePixelRatio() const override;
    virtual int colorBitsPerComponent() const override;
    virtual int monochromeBitsPerComponent() const override;
    virtual PointerType primaryPointerType() const override;
    virtual int availablePointerTypes() const override;
    virtual HoverType primaryHoverType() const override;
    virtual int availableHoverTypes() const override;
    virtual bool threeDEnabled() const override;
    virtual bool strictMode() const override;
    virtual Document* document() const override;
    virtual bool hasValues() const override;
    virtual const String mediaType() const override;

protected:
    MediaValuesCached();
    MediaValuesCached(LocalFrame*);
    MediaValuesCached(const MediaValuesCachedData&);

    MediaValuesCachedData m_data;
};

} // namespace

#endif  // SKY_ENGINE_CORE_CSS_MEDIAVALUESCACHED_H_
