| Index: Source/core/css/MediaValuesCached.cpp
|
| diff --git a/Source/core/css/MediaValuesCached.cpp b/Source/core/css/MediaValuesCached.cpp
|
| index d83a4b919b4bb392e63f6a394e06348971fb12fa..84a759540788de184451794fe68409ea5d13af30 100644
|
| --- a/Source/core/css/MediaValuesCached.cpp
|
| +++ b/Source/core/css/MediaValuesCached.cpp
|
| @@ -5,13 +5,18 @@
|
| #include "config.h"
|
| #include "core/css/MediaValuesCached.h"
|
|
|
| -#include "core/css/CSSHelper.h"
|
| #include "core/css/CSSPrimitiveValue.h"
|
| #include "core/dom/Document.h"
|
| +#include "core/html/imports/HTMLImportsController.h"
|
| #include "core/rendering/RenderObject.h"
|
|
|
| namespace WebCore {
|
|
|
| +PassRefPtr<MediaValues> MediaValuesCached::create()
|
| +{
|
| + return adoptRef(new MediaValuesCached());
|
| +}
|
| +
|
| PassRefPtr<MediaValues> MediaValuesCached::create(MediaValuesCachedData& data)
|
| {
|
| return adoptRef(new MediaValuesCached(data));
|
| @@ -19,19 +24,28 @@ PassRefPtr<MediaValues> MediaValuesCached::create(MediaValuesCachedData& data)
|
|
|
| PassRefPtr<MediaValues> MediaValuesCached::create(Document& document)
|
| {
|
| - Document* executingDocument = getExecutingDocument(document);
|
| - return MediaValuesCached::create(executingDocument->frame(), executingDocument->renderer()->style());
|
| + Document* executingDocument = document.importsController() ? document.importsController()->master() : &document;
|
| + ASSERT(executingDocument);
|
| + return MediaValuesCached::create(executingDocument->frame());
|
| }
|
|
|
| -PassRefPtr<MediaValues> MediaValuesCached::create(LocalFrame* frame, RenderStyle* style)
|
| +PassRefPtr<MediaValues> MediaValuesCached::create(LocalFrame* frame)
|
| {
|
| - return adoptRef(new MediaValuesCached(frame, style));
|
| + if (!frame)
|
| + return adoptRef(new MediaValuesCached());
|
| + return adoptRef(new MediaValuesCached(frame));
|
| }
|
|
|
| -MediaValuesCached::MediaValuesCached(LocalFrame* frame, RenderStyle* style)
|
| +MediaValuesCached::MediaValuesCached()
|
| +{
|
| +}
|
| +
|
| +MediaValuesCached::MediaValuesCached(LocalFrame* frame)
|
| {
|
| - ASSERT(frame && style);
|
| ASSERT(isMainThread());
|
| + ASSERT(frame);
|
| + // In case that frame is missing (e.g. for images that their document does not have a frame)
|
| + // We simply leave the MediaValues object with the default MediaValuesCachedData values.
|
| m_data.viewportWidth = calculateViewportWidth(frame);
|
| m_data.viewportHeight = calculateViewportHeight(frame);
|
| m_data.deviceWidth = calculateDeviceWidth(frame);
|
| @@ -40,8 +54,7 @@ MediaValuesCached::MediaValuesCached(LocalFrame* frame, RenderStyle* style)
|
| m_data.colorBitsPerComponent = calculateColorBitsPerComponent(frame);
|
| m_data.monochromeBitsPerComponent = calculateMonochromeBitsPerComponent(frame);
|
| m_data.pointer = calculateLeastCapablePrimaryPointerDeviceType(frame);
|
| - m_data.defaultFontSize = calculateDefaultFontSize(style);
|
| - m_data.computedFontSize = calculateComputedFontSize(style);
|
| + m_data.defaultFontSize = calculateDefaultFontSize(frame);
|
| m_data.threeDEnabled = calculateThreeDEnabled(frame);
|
| m_data.scanMediaType = calculateScanMediaType(frame);
|
| m_data.screenMediaType = calculateScreenMediaType(frame);
|
| @@ -61,68 +74,7 @@ PassRefPtr<MediaValues> MediaValuesCached::copy() const
|
|
|
| bool MediaValuesCached::computeLength(double value, unsigned short type, int& result) const
|
| {
|
| - // We're running in a background thread, so RenderStyle is not available.
|
| - // Nevertheless, we can evaluate lengths using cached values.
|
| - //
|
| - // The logic in this function is duplicated from CSSPrimitiveValue::computeLengthDouble
|
| - // because MediaValues::computeLength needs nearly identical logic, but we haven't found a way to make
|
| - // CSSPrimitiveValue::computeLengthDouble more generic (to solve both cases) without hurting performance.
|
| -
|
| - // FIXME - Unite the logic here with CSSPrimitiveValue is a performant way.
|
| - int factor = 0;
|
| - switch (type) {
|
| - case CSSPrimitiveValue::CSS_EMS:
|
| - case CSSPrimitiveValue::CSS_REMS:
|
| - factor = m_data.defaultFontSize;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_PX:
|
| - factor = 1;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_EXS:
|
| - // FIXME: We have a bug right now where the zoom will be applied twice to EX units.
|
| - // FIXME: We don't seem to be able to cache fontMetrics related values.
|
| - // Trying to access them is triggering some sort of microtask. Serving the spec's default instead.
|
| - factor = m_data.defaultFontSize / 2.0;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_CHS:
|
| - // FIXME: We don't seem to be able to cache fontMetrics related values.
|
| - // Trying to access them is triggering some sort of microtask. Serving the (future) spec default instead.
|
| - factor = m_data.defaultFontSize / 2.0;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_VW:
|
| - factor = m_data.viewportWidth / 100;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_VH:
|
| - factor = m_data.viewportHeight / 100;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_VMIN:
|
| - factor = std::min(m_data.viewportWidth, m_data.viewportHeight) / 100;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_VMAX:
|
| - factor = std::max(m_data.viewportWidth, m_data.viewportHeight) / 100;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_CM:
|
| - factor = cssPixelsPerCentimeter;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_MM:
|
| - factor = cssPixelsPerMillimeter;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_IN:
|
| - factor = cssPixelsPerInch;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_PT:
|
| - factor = cssPixelsPerPoint;
|
| - break;
|
| - case CSSPrimitiveValue::CSS_PC:
|
| - factor = cssPixelsPerPica;
|
| - break;
|
| - default:
|
| - return false;
|
| - }
|
| -
|
| - ASSERT(factor > 0);
|
| - result = roundForImpreciseConversion<int>(value*factor);
|
| - return true;
|
| + return MediaValues::computeLength(value, type, m_data.defaultFontSize, m_data.viewportWidth, m_data.viewportHeight, result);
|
| }
|
|
|
| bool MediaValuesCached::isSafeToSendToAnotherThread() const
|
|
|