static float findTargetDensityDPIValue(const String& keyString, const String& valueString, Document* document) { if (equalIgnoringCase(valueString, "device-dpi")) return ViewportArguments::ValueDeviceDPI; if (equalIgnoringCase(valueString, "low-dpi")) return ViewportArguments::ValueLowDPI; if (equalIgnoringCase(valueString, "medium-dpi")) return ViewportArguments::ValueMediumDPI; if (equalIgnoringCase(valueString, "high-dpi")) return ViewportArguments::ValueHighDPI; bool ok; float value = valueString.toFloat(&ok); if (!ok) { reportViewportWarning(document, UnrecognizedViewportArgumentError, keyString); return ViewportArguments::ValueAuto; } if (value < 70 || value > 400) { reportViewportWarning(document, TargetDensityDpiTooSmallOrLargeError, keyString); return ViewportArguments::ValueAuto; } return value; }
static float findScaleValue(const String& keyString, const String& valueString, Document* document) { // 1) Non-negative number values are translated to <number> values. // 2) Negative number values are translated to auto. // 3) yes is translated to 1.0. // 4) device-width and device-height are translated to 10.0. // 5) no and unknown values are translated to 0.0 if (equalIgnoringCase(valueString, "yes")) return float(1.0); if (equalIgnoringCase(valueString, "no")) return float(0.0); if (equalIgnoringCase(valueString, "desktop-width")) return float(10.0); if (equalIgnoringCase(valueString, "device-width")) return float(10.0); if (equalIgnoringCase(valueString, "device-height")) return float(10.0); bool ok; float value = valueString.toFloat(&ok); if (!ok) { reportViewportWarning(document, UnrecognizedViewportArgumentError, keyString); return float(0.0); } if (value < 0) return ViewportArguments::ValueAuto; if (value > 10.0) reportViewportWarning(document, MaximumScaleTooLargeError, keyString); return value; }
static float findSizeValue(const String& keyString, const String& valueString, Document* document) { // 1) Non-negative number values are translated to px lengths. // 2) Negative number values are translated to auto. // 3) device-width and device-height are used as keywords. // 4) Other keywords and unknown values translate to 0.0. if (equalIgnoringCase(valueString, "desktop-width")) return ViewportArguments::ValueDesktopWidth; if (equalIgnoringCase(valueString, "device-width")) return ViewportArguments::ValueDeviceWidth; if (equalIgnoringCase(valueString, "device-height")) return ViewportArguments::ValueDeviceHeight; bool ok; float value = valueString.toFloat(&ok); if (!ok) { reportViewportWarning(document, UnrecognizedViewportArgumentError, keyString); return float(0.0); } if (value < 0) return ViewportArguments::ValueAuto; if (keyString == "width") reportViewportWarning(document, DeviceWidthShouldBeUsedWarning, keyString); else if (keyString == "height") reportViewportWarning(document, DeviceHeightShouldBeUsedWarning, keyString); return value; }
static float findScaleValue(const String& keyString, const String& valueString, Document* document) { // 1) Non-negative number values are translated to <number> values. // 2) Negative number values are translated to auto. // 3) yes is translated to 1.0. // 4) device-width and device-height are translated to 10.0. // 5) no and unknown values are translated to 0.0 if (equalIgnoringCase(valueString, "yes")) return 1; if (equalIgnoringCase(valueString, "no")) return 0; if (equalIgnoringCase(valueString, "desktop-width")) return 10; if (equalIgnoringCase(valueString, "device-width")) return 10; if (equalIgnoringCase(valueString, "device-height")) return 10; float value = numericPrefix(keyString, valueString, document); if (value < 0) return ViewportArguments::ValueAuto; if (value > 10.0) reportViewportWarning(document, MaximumScaleTooLargeError, String(), String()); return value; }
void setViewportFeature(const String& keyString, const String& valueString, Document* document, void* data) { ViewportArguments* arguments = static_cast<ViewportArguments*>(data); if (keyString == "width") arguments->width = findSizeValue(keyString, valueString, document); else if (keyString == "height") arguments->height = findSizeValue(keyString, valueString, document); else if (keyString == "initial-scale") arguments->zoom = findScaleValue(keyString, valueString, document); else if (keyString == "minimum-scale") arguments->minZoom = findScaleValue(keyString, valueString, document); else if (keyString == "maximum-scale") arguments->maxZoom = findScaleValue(keyString, valueString, document); else if (keyString == "user-scalable") arguments->userZoom = findBooleanValue(keyString, valueString, document); #if PLATFORM(IOS) else if (keyString == "minimal-ui") // FIXME: Ignore silently for now. This should eventually fall back to the warning. { } #endif else if (keyString == "shrink-to-fit") arguments->shrinkToFit = findBooleanValue(keyString, valueString, document); else reportViewportWarning(document, UnrecognizedViewportArgumentKeyError, keyString, String()); }
static bool findUserScalableValue(const String& keyString, const String& valueString, Document* document) { // yes and no are used as keywords. // Numbers >= 1, numbers <= -1, device-width and device-height are mapped to yes. // Numbers in the range <-1, 1>, and unknown values, are mapped to no. if (equalIgnoringCase(valueString, "yes")) return true; if (equalIgnoringCase(valueString, "no")) return false; if (equalIgnoringCase(valueString, "desktop-width")) return true; if (equalIgnoringCase(valueString, "device-width")) return true; if (equalIgnoringCase(valueString, "device-height")) return true; bool ok; float value = valueString.toFloat(&ok); if (!ok) { reportViewportWarning(document, UnrecognizedViewportArgumentError, keyString); return false; } if (fabs(value) < 1) return false; return true; }
static float numericPrefix(const String& keyString, const String& valueString, Document* document, bool* ok = 0) { size_t parsedLength; float value; if (valueString.is8Bit()) value = charactersToFloat(valueString.characters8(), valueString.length(), parsedLength); else value = charactersToFloat(valueString.characters16(), valueString.length(), parsedLength); if (!parsedLength) { reportViewportWarning(document, UnrecognizedViewportArgumentValueError, valueString, keyString); if (ok) *ok = false; return 0; } if (parsedLength < valueString.length()) reportViewportWarning(document, TruncatedViewportArgumentValueError, valueString, keyString); if (ok) *ok = true; return value; }
static float numericPrefix(const String& keyString, const String& valueString, Document* document, bool* ok) { // If a prefix of property-value can be converted to a number using strtod, // the value will be that number. The remainder of the string is ignored. // So when String::toFloat says there is an error, it may be a false positive, // and we should check if the valueString prefix was a number. bool didReadNumber; float value = valueString.toFloat(ok, &didReadNumber); if (!*ok) { if (!didReadNumber) { ASSERT(!value); reportViewportWarning(document, UnrecognizedViewportArgumentValueError, valueString, keyString); return value; } *ok = true; reportViewportWarning(document, TruncatedViewportArgumentValueError, valueString, keyString); } return value; }
void setViewportFeature(const String& keyString, const String& valueString, Document* document, void* data) { ViewportArguments* arguments = static_cast<ViewportArguments*>(data); if (keyString == "width") arguments->width = findSizeValue(keyString, valueString, document); else if (keyString == "height") arguments->height = findSizeValue(keyString, valueString, document); else if (keyString == "initial-scale") arguments->zoom = findScaleValue(keyString, valueString, document); else if (keyString == "minimum-scale") arguments->minZoom = findScaleValue(keyString, valueString, document); else if (keyString == "maximum-scale") arguments->maxZoom = findScaleValue(keyString, valueString, document); else if (keyString == "user-scalable") arguments->userZoom = findUserScalableValue(keyString, valueString, document); else if (keyString == "target-densitydpi") reportViewportWarning(document, TargetDensityDpiUnsupported, String(), String()); else reportViewportWarning(document, UnrecognizedViewportArgumentKeyError, keyString, String()); }
void setViewportFeature(const String& keyString, const String& valueString, Document* document, void* data) { ViewportArguments* arguments = static_cast<ViewportArguments*>(data); if (keyString == "width") arguments->width = findSizeValue(keyString, valueString, document); else if (keyString == "height") arguments->height = findSizeValue(keyString, valueString, document); else if (keyString == "initial-scale") arguments->zoom = findScaleValue(keyString, valueString, document); else if (keyString == "minimum-scale") arguments->minZoom = findScaleValue(keyString, valueString, document); else if (keyString == "maximum-scale") arguments->maxZoom = findScaleValue(keyString, valueString, document); else if (keyString == "user-scalable") arguments->userZoom = findUserScalableValue(keyString, valueString, document); #if PLATFORM(IOS) else if (keyString == "minimal-ui") arguments->minimalUI = true; #endif else reportViewportWarning(document, UnrecognizedViewportArgumentKeyError, keyString, String()); }