blob: 34239374452d71ee590cdda4ac0ae685e9848c03 [file] [log] [blame]
/*
* Copyright (C) 2012-2013 Intel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include "config.h"
#include "core/css/resolver/ViewportStyleResolver.h"
#include "CSSValueKeywords.h"
#include "core/css/StylePropertySet.h"
#include "core/css/StyleRule.h"
#include "core/dom/Document.h"
#include "core/dom/NodeRenderStyle.h"
#include "core/dom/ViewportArguments.h"
namespace WebCore {
ViewportStyleResolver::ViewportStyleResolver(Document* document)
: m_document(document)
{
ASSERT(m_document);
}
ViewportStyleResolver::~ViewportStyleResolver()
{
}
void ViewportStyleResolver::addViewportRule(StyleRuleViewport* viewportRule)
{
StylePropertySet* propertySet = viewportRule->mutableProperties();
unsigned propertyCount = propertySet->propertyCount();
if (!propertyCount)
return;
if (!m_propertySet) {
m_propertySet = propertySet->mutableCopy();
return;
}
// We cannot use mergeAndOverrideOnConflict() here because it doesn't
// respect the !important declaration (but addParsedProperty() does).
for (unsigned i = 0; i < propertyCount; ++i)
m_propertySet->addParsedProperty(propertySet->propertyAt(i).toCSSProperty());
}
void ViewportStyleResolver::clearDocument()
{
m_document = 0;
}
void ViewportStyleResolver::resolve()
{
if (!m_document)
return;
if (!m_propertySet) {
// FIXME: This is not entirely correct. If the doctype is XHTML MP, or there is a Meta
// element for setting the viewport, the viewport arguments should fall back to those
// settings when the @viewport rules are all removed. For now, reset to implicit when
// there was an @viewport rule which has now been removed.
if (m_document->viewportArguments().type == ViewportArguments::CSSDeviceAdaptation) {
m_document->setViewportArguments(ViewportArguments());
m_document->updateViewportArguments();
}
return;
}
ViewportArguments arguments(ViewportArguments::CSSDeviceAdaptation);
arguments.userZoom = getViewportArgumentValue(CSSPropertyUserZoom);
arguments.zoom = getViewportArgumentValue(CSSPropertyZoom);
arguments.minZoom = getViewportArgumentValue(CSSPropertyMinZoom);
arguments.maxZoom = getViewportArgumentValue(CSSPropertyMaxZoom);
arguments.minWidth = getViewportArgumentValue(CSSPropertyMinWidth);
arguments.maxWidth = getViewportArgumentValue(CSSPropertyMaxWidth);
arguments.minHeight = getViewportArgumentValue(CSSPropertyMinHeight);
arguments.maxHeight = getViewportArgumentValue(CSSPropertyMaxHeight);
arguments.orientation = getViewportArgumentValue(CSSPropertyOrientation);
m_document->setViewportArguments(arguments);
m_document->updateViewportArguments();
m_propertySet = 0;
}
float ViewportStyleResolver::getViewportArgumentValue(CSSPropertyID id) const
{
float defaultValue = ViewportArguments::ValueAuto;
// UserZoom default value is CSSValueZoom, which maps to true, meaning that
// yes, it is user scalable. When the value is set to CSSValueFixed, we
// return false.
if (id == CSSPropertyUserZoom)
defaultValue = 1;
RefPtr<CSSValue> value = m_propertySet->getPropertyCSSValue(id);
if (!value || !value->isPrimitiveValue())
return defaultValue;
CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value.get());
if (primitiveValue->isNumber() || primitiveValue->isPx())
return primitiveValue->getFloatValue();
if (primitiveValue->isFontRelativeLength())
return primitiveValue->getFloatValue() * m_document->renderStyle()->fontDescription().computedSize();
if (primitiveValue->isPercentage()) {
float percentValue = primitiveValue->getFloatValue() / 100.0f;
switch (id) {
case CSSPropertyMaxHeight:
case CSSPropertyMinHeight:
return percentValue * m_document->initialViewportSize().height();
case CSSPropertyMaxWidth:
case CSSPropertyMinWidth:
return percentValue * m_document->initialViewportSize().width();
case CSSPropertyMaxZoom:
case CSSPropertyMinZoom:
case CSSPropertyZoom:
return percentValue;
default:
ASSERT_NOT_REACHED();
break;
}
}
switch (primitiveValue->getValueID()) {
case CSSValueAuto:
return defaultValue;
case CSSValueLandscape:
return ViewportArguments::ValueLandscape;
case CSSValuePortrait:
return ViewportArguments::ValuePortrait;
case CSSValueZoom:
return defaultValue;
case CSSValueInternalExtendToZoom:
return ViewportArguments::ValueExtendToZoom;
case CSSValueFixed:
return 0;
default:
return defaultValue;
}
}
} // namespace WebCore