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