Home | History | Annotate | Download | only in css
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "config.h"
      6 #include "core/css/MediaValues.h"
      7 
      8 #include "core/css/CSSHelper.h"
      9 #include "core/css/MediaValuesCached.h"
     10 #include "core/css/MediaValuesDynamic.h"
     11 #include "core/dom/Document.h"
     12 #include "core/dom/Element.h"
     13 #include "core/frame/FrameHost.h"
     14 #include "core/frame/FrameView.h"
     15 #include "core/frame/LocalFrame.h"
     16 #include "core/frame/Settings.h"
     17 #include "core/html/imports/HTMLImportsController.h"
     18 #include "core/page/Page.h"
     19 #include "core/rendering/RenderObject.h"
     20 #include "core/rendering/RenderView.h"
     21 #include "core/rendering/compositing/RenderLayerCompositor.h"
     22 #include "core/rendering/style/RenderStyle.h"
     23 #include "platform/PlatformScreen.h"
     24 
     25 namespace blink {
     26 
     27 PassRefPtr<MediaValues> MediaValues::createDynamicIfFrameExists(LocalFrame* frame)
     28 {
     29     if (frame)
     30         return MediaValuesDynamic::create(frame);
     31     return MediaValuesCached::create();
     32 }
     33 
     34 int MediaValues::calculateViewportWidth(LocalFrame* frame) const
     35 {
     36     ASSERT(frame && frame->view() && frame->document());
     37     int viewportWidth = frame->view()->layoutSize(IncludeScrollbars).width();
     38     return adjustForAbsoluteZoom(viewportWidth, frame->document()->renderView());
     39 }
     40 
     41 int MediaValues::calculateViewportHeight(LocalFrame* frame) const
     42 {
     43     ASSERT(frame && frame->view() && frame->document());
     44     int viewportHeight = frame->view()->layoutSize(IncludeScrollbars).height();
     45     return adjustForAbsoluteZoom(viewportHeight, frame->document()->renderView());
     46 }
     47 
     48 int MediaValues::calculateDeviceWidth(LocalFrame* frame) const
     49 {
     50     ASSERT(frame && frame->view() && frame->settings() && frame->host());
     51     int deviceWidth = static_cast<int>(screenRect(frame->view()).width());
     52     if (frame->settings()->reportScreenSizeInPhysicalPixelsQuirk())
     53         deviceWidth = lroundf(deviceWidth * frame->host()->deviceScaleFactor());
     54     return deviceWidth;
     55 }
     56 
     57 int MediaValues::calculateDeviceHeight(LocalFrame* frame) const
     58 {
     59     ASSERT(frame && frame->view() && frame->settings() && frame->host());
     60     int deviceHeight = static_cast<int>(screenRect(frame->view()).height());
     61     if (frame->settings()->reportScreenSizeInPhysicalPixelsQuirk())
     62         deviceHeight = lroundf(deviceHeight * frame->host()->deviceScaleFactor());
     63     return deviceHeight;
     64 }
     65 
     66 bool MediaValues::calculateStrictMode(LocalFrame* frame) const
     67 {
     68     ASSERT(frame && frame->document());
     69     return !frame->document()->inQuirksMode();
     70 }
     71 
     72 float MediaValues::calculateDevicePixelRatio(LocalFrame* frame) const
     73 {
     74     return frame->devicePixelRatio();
     75 }
     76 
     77 int MediaValues::calculateColorBitsPerComponent(LocalFrame* frame) const
     78 {
     79     ASSERT(frame && frame->page() && frame->page()->mainFrame());
     80     if (!frame->page()->mainFrame()->isLocalFrame()
     81         || screenIsMonochrome(frame->page()->deprecatedLocalMainFrame()->view()))
     82         return 0;
     83     return screenDepthPerComponent(frame->view());
     84 }
     85 
     86 int MediaValues::calculateMonochromeBitsPerComponent(LocalFrame* frame) const
     87 {
     88     ASSERT(frame && frame->page() && frame->page()->mainFrame());
     89     if (!frame->page()->mainFrame()->isLocalFrame()
     90         || !screenIsMonochrome(frame->page()->deprecatedLocalMainFrame()->view()))
     91         return 0;
     92     return screenDepthPerComponent(frame->view());
     93 }
     94 
     95 int MediaValues::calculateDefaultFontSize(LocalFrame* frame) const
     96 {
     97     return frame->host()->settings().defaultFontSize();
     98 }
     99 
    100 const String MediaValues::calculateMediaType(LocalFrame* frame) const
    101 {
    102     ASSERT(frame);
    103     if (!frame->view())
    104         return emptyAtom;
    105     return frame->view()->mediaType();
    106 }
    107 
    108 bool MediaValues::calculateThreeDEnabled(LocalFrame* frame) const
    109 {
    110     ASSERT(frame && frame->contentRenderer() && frame->contentRenderer()->compositor());
    111     bool threeDEnabled = false;
    112     if (RenderView* view = frame->contentRenderer())
    113         threeDEnabled = view->compositor()->hasAcceleratedCompositing();
    114     return threeDEnabled;
    115 }
    116 
    117 PointerType MediaValues::calculatePrimaryPointerType(LocalFrame* frame) const
    118 {
    119     ASSERT(frame && frame->settings());
    120     return frame->settings()->primaryPointerType();
    121 }
    122 
    123 int MediaValues::calculateAvailablePointerTypes(LocalFrame* frame) const
    124 {
    125     ASSERT(frame && frame->settings());
    126     return frame->settings()->availablePointerTypes();
    127 }
    128 
    129 HoverType MediaValues::calculatePrimaryHoverType(LocalFrame* frame) const
    130 {
    131     ASSERT(frame && frame->settings());
    132     return frame->settings()->primaryHoverType();
    133 }
    134 
    135 int MediaValues::calculateAvailableHoverTypes(LocalFrame* frame) const
    136 {
    137     ASSERT(frame && frame->settings());
    138     return frame->settings()->availableHoverTypes();
    139 }
    140 
    141 bool MediaValues::computeLengthImpl(double value, CSSPrimitiveValue::UnitType type, unsigned defaultFontSize, unsigned viewportWidth, unsigned viewportHeight, double& result)
    142 {
    143     // The logic in this function is duplicated from CSSPrimitiveValue::computeLengthDouble
    144     // because MediaValues::computeLength needs nearly identical logic, but we haven't found a way to make
    145     // CSSPrimitiveValue::computeLengthDouble more generic (to solve both cases) without hurting performance.
    146 
    147     // FIXME - Unite the logic here with CSSPrimitiveValue in a performant way.
    148     double factor = 0;
    149     switch (type) {
    150     case CSSPrimitiveValue::CSS_EMS:
    151     case CSSPrimitiveValue::CSS_REMS:
    152         factor = defaultFontSize;
    153         break;
    154     case CSSPrimitiveValue::CSS_PX:
    155         factor = 1;
    156         break;
    157     case CSSPrimitiveValue::CSS_EXS:
    158         // FIXME: We have a bug right now where the zoom will be applied twice to EX units.
    159         // FIXME: We don't seem to be able to cache fontMetrics related values.
    160         // Trying to access them is triggering some sort of microtask. Serving the spec's default instead.
    161         factor = defaultFontSize / 2.0;
    162         break;
    163     case CSSPrimitiveValue::CSS_CHS:
    164         // FIXME: We don't seem to be able to cache fontMetrics related values.
    165         // Trying to access them is triggering some sort of microtask. Serving the (future) spec default instead.
    166         factor = defaultFontSize / 2.0;
    167         break;
    168     case CSSPrimitiveValue::CSS_VW:
    169         factor = viewportWidth / 100.0;
    170         break;
    171     case CSSPrimitiveValue::CSS_VH:
    172         factor = viewportHeight / 100.0;
    173         break;
    174     case CSSPrimitiveValue::CSS_VMIN:
    175         factor = std::min(viewportWidth, viewportHeight) / 100.0;
    176         break;
    177     case CSSPrimitiveValue::CSS_VMAX:
    178         factor = std::max(viewportWidth, viewportHeight) / 100.0;
    179         break;
    180     case CSSPrimitiveValue::CSS_CM:
    181         factor = cssPixelsPerCentimeter;
    182         break;
    183     case CSSPrimitiveValue::CSS_MM:
    184         factor = cssPixelsPerMillimeter;
    185         break;
    186     case CSSPrimitiveValue::CSS_IN:
    187         factor = cssPixelsPerInch;
    188         break;
    189     case CSSPrimitiveValue::CSS_PT:
    190         factor = cssPixelsPerPoint;
    191         break;
    192     case CSSPrimitiveValue::CSS_PC:
    193         factor = cssPixelsPerPica;
    194         break;
    195     default:
    196         return false;
    197     }
    198 
    199     ASSERT(factor > 0);
    200     result = value * factor;
    201     return true;
    202 }
    203 
    204 LocalFrame* MediaValues::frameFrom(Document& document)
    205 {
    206     Document* executingDocument = document.importsController() ? document.importsController()->master() : &document;
    207     ASSERT(executingDocument);
    208     return executingDocument->frame();
    209 }
    210 
    211 } // namespace
    212