110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch// found in the LICENSE file.
410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "config.h"
610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/css/MediaValuesCached.h"
710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/css/CSSPrimitiveValue.h"
910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/dom/Document.h"
10f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/frame/LocalFrame.h"
1110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/rendering/RenderObject.h"
1210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
13c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
1410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<MediaValues> MediaValuesCached::create()
1610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return adoptRef(new MediaValuesCached());
1810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
1910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
2010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<MediaValues> MediaValuesCached::create(MediaValuesCachedData& data)
2110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
2210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return adoptRef(new MediaValuesCached(data));
2310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
2410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
2510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<MediaValues> MediaValuesCached::create(Document& document)
2610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return MediaValuesCached::create(frameFrom(document));
2810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
2910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
3010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<MediaValues> MediaValuesCached::create(LocalFrame* frame)
3110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // FIXME - Added an assert here so we can better understand when a frame is present without its view().
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(!frame || frame->view());
34323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // FIXME - Because of crbug.com/371084, document()->renderView() may be null here.
35323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (!frame || !frame->view() || !frame->document() || !frame->document()->renderView())
3610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return adoptRef(new MediaValuesCached());
3710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return adoptRef(new MediaValuesCached(frame));
3810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
3910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
4010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochMediaValuesCached::MediaValuesCached()
4110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
4210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
4310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
4410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochMediaValuesCached::MediaValuesCached(LocalFrame* frame)
4510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
4610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT(isMainThread());
4710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT(frame);
4810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // In case that frame is missing (e.g. for images that their document does not have a frame)
4910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // We simply leave the MediaValues object with the default MediaValuesCachedData values.
5010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.viewportWidth = calculateViewportWidth(frame);
5110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.viewportHeight = calculateViewportHeight(frame);
5210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.deviceWidth = calculateDeviceWidth(frame);
5310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.deviceHeight = calculateDeviceHeight(frame);
5410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.devicePixelRatio = calculateDevicePixelRatio(frame);
5510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.colorBitsPerComponent = calculateColorBitsPerComponent(frame);
5610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.monochromeBitsPerComponent = calculateMonochromeBitsPerComponent(frame);
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_data.primaryPointerType = calculatePrimaryPointerType(frame);
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_data.availablePointerTypes = calculateAvailablePointerTypes(frame);
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_data.primaryHoverType = calculatePrimaryHoverType(frame);
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_data.availableHoverTypes = calculateAvailableHoverTypes(frame);
6110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.defaultFontSize = calculateDefaultFontSize(frame);
6210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.threeDEnabled = calculateThreeDEnabled(frame);
6310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_data.strictMode = calculateStrictMode(frame);
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const String mediaType = calculateMediaType(frame);
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!mediaType.isEmpty())
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_data.mediaType = mediaType.isolatedCopy();
6710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
6810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
6910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochMediaValuesCached::MediaValuesCached(const MediaValuesCachedData& data)
7010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    : m_data(data)
7110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
7210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
7310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
7410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<MediaValues> MediaValuesCached::copy() const
7510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
7610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return adoptRef(new MediaValuesCached(m_data));
7710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
7810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool MediaValuesCached::computeLength(double value, CSSPrimitiveValue::UnitType type, int& result) const
80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
81f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return MediaValues::computeLength(value, type, m_data.defaultFontSize, m_data.viewportWidth, m_data.viewportHeight, result);
82f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
83f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
84d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool MediaValuesCached::computeLength(double value, CSSPrimitiveValue::UnitType type, double& result) const
8510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
8610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return MediaValues::computeLength(value, type, m_data.defaultFontSize, m_data.viewportWidth, m_data.viewportHeight, result);
8710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
8810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
8910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool MediaValuesCached::isSafeToSendToAnotherThread() const
9010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
9110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return hasOneRef();
9210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
9310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
9410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint MediaValuesCached::viewportWidth() const
9510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
9610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.viewportWidth;
9710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
9810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
9910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint MediaValuesCached::viewportHeight() const
10010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
10110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.viewportHeight;
10210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
10310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
10410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint MediaValuesCached::deviceWidth() const
10510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
10610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.deviceWidth;
10710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
10810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
10910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint MediaValuesCached::deviceHeight() const
11010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
11110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.deviceHeight;
11210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
11310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
11410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochfloat MediaValuesCached::devicePixelRatio() const
11510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
11610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.devicePixelRatio;
11710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
11810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
11910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint MediaValuesCached::colorBitsPerComponent() const
12010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
12110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.colorBitsPerComponent;
12210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
12310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
12410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint MediaValuesCached::monochromeBitsPerComponent() const
12510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
12610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.monochromeBitsPerComponent;
12710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
12810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPointerType MediaValuesCached::primaryPointerType() const
13010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_data.primaryPointerType;
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint MediaValuesCached::availablePointerTypes() const
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_data.availablePointerTypes;
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciHoverType MediaValuesCached::primaryHoverType() const
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_data.primaryHoverType;
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint MediaValuesCached::availableHoverTypes() const
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_data.availableHoverTypes;
14710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
14810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
14910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool MediaValuesCached::threeDEnabled() const
15010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
15110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.threeDEnabled;
15210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
15310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
15410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool MediaValuesCached::strictMode() const
15510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
15610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return m_data.strictMode;
15710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdochconst String MediaValuesCached::mediaType() const
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return m_data.mediaType;
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
16210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
16310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochDocument* MediaValuesCached::document() const
16410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
16510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return 0;
16610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
16710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
16810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool MediaValuesCached::hasValues() const
16910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
17010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return true;
17110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
17210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
17310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} // namespace
174