DateTimeNumericFieldElement::DateTimeNumericFieldElement( Document& document, FieldOwner& fieldOwner, const Range& range, const Range& hardLimits, const String& placeholder, const DateTimeNumericFieldElement::Step& step) : DateTimeFieldElement(document, fieldOwner), m_placeholder(placeholder), m_range(range), m_hardLimits(hardLimits), m_step(step), m_value(0), m_hasValue(false) { DCHECK_NE(m_step.step, 0); DCHECK_LE(m_range.minimum, m_range.maximum); DCHECK_LE(m_hardLimits.minimum, m_hardLimits.maximum); // We show a direction-neutral string such as "--" as a placeholder. It // should follow the direction of numeric values. if (localeForOwner().isRTL()) { CharDirection dir = direction(formatValue(this->maximum())[0]); if (dir == LeftToRight || dir == EuropeanNumber || dir == ArabicNumber) { setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueBidiOverride); setInlineStyleProperty(CSSPropertyDirection, CSSValueLtr); } } }
void MediaControlPanelElement::makeTransparent() { if (!m_opaque) return; double duration = document()->page() ? document()->page()->theme()->mediaControlsFadeOutDuration() : 0; setInlineStyleProperty(CSSPropertyWebkitTransitionProperty, CSSPropertyOpacity); setInlineStyleProperty(CSSPropertyWebkitTransitionDuration, duration, CSSPrimitiveValue::CSS_S); setInlineStyleProperty(CSSPropertyOpacity, 0.0, CSSPrimitiveValue::CSS_NUMBER); m_opaque = false; startTimer(); }
void MediaControlPanelElement::setPosition(const LayoutPoint& position) { double left = position.x(); double top = position.y(); // Set the left and top to control the panel's position; this depends on it being absolute positioned. // Set the margin to zero since the position passed in will already include the effect of the margin. setInlineStyleProperty(CSSPropertyLeft, left, CSSPrimitiveValue::CSS_PX); setInlineStyleProperty(CSSPropertyTop, top, CSSPrimitiveValue::CSS_PX); setInlineStyleProperty(CSSPropertyMarginLeft, 0.0, CSSPrimitiveValue::CSS_PX); setInlineStyleProperty(CSSPropertyMarginTop, 0.0, CSSPrimitiveValue::CSS_PX); ExceptionCode ignored; classList()->add("dragged", ignored); }
RefPtr<ImageControlsButtonElementMac> ImageControlsButtonElementMac::tryCreate(Document& document) { if (!document.page()) return nullptr; auto button = adoptRef(*new ImageControlsButtonElementMac(document)); button->setAttributeWithoutSynchronization(HTMLNames::classAttr, AtomicString("x-webkit-image-controls-button", AtomicString::ConstructFromLiteral)); IntSize positionOffset = document.page()->theme().imageControlsButtonPositionOffset(); button->setInlineStyleProperty(CSSPropertyTop, positionOffset.height(), CSSPrimitiveValue::CSS_PX); // FIXME: Why is right: 0px off the right edge of the parent? button->setInlineStyleProperty(CSSPropertyRight, positionOffset.width(), CSSPrimitiveValue::CSS_PX); return WTFMove(button); }
void MediaControlPanelElement::makeOpaque() { if (m_opaque) return; double duration = document()->page() ? document()->page()->theme()->mediaControlsFadeInDuration() : 0; setInlineStyleProperty(CSSPropertyWebkitTransitionProperty, CSSPropertyOpacity); setInlineStyleProperty(CSSPropertyWebkitTransitionDuration, duration, CSSPrimitiveValue::CSS_S); setInlineStyleProperty(CSSPropertyOpacity, 1.0, CSSPrimitiveValue::CSS_NUMBER); m_opaque = true; if (m_isDisplayed) show(); }
DateTimeNumericFieldElement::DateTimeNumericFieldElement(Document* document, FieldOwner& fieldOwner, int minimum, int maximum, const String& placeholder) : DateTimeFieldElement(document, fieldOwner) , m_lastDigitCharTime(0) , m_placeholder(placeholder) , m_range(minimum, maximum) , m_value(0) , m_hasValue(false) { // We show a direction-neutral string such as "--" as a placeholder. It // should follow the direction of numeric values. if (localeForOwner().isRTL()) { Direction dir = direction(formatValue(this->maximum())[0]); if (dir == LeftToRight || dir == EuropeanNumber || dir == ArabicNumber) { setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueBidiOverride); setInlineStyleProperty(CSSPropertyDirection, CSSValueLtr); } } }
void MediaControlTextTrackContainerElement::updateSizes() { HTMLMediaElement* mediaElement = toParentMediaElement(this); if (!mediaElement) return; if (!document()->page()) return; IntRect videoBox; if (m_textTrackRepresentation) videoBox = m_textTrackRepresentation->bounds(); else { if (!mediaElement->renderer() || !mediaElement->renderer()->isVideo()) return; videoBox = toRenderVideo(mediaElement->renderer())->videoBox(); } if (m_videoDisplaySize == videoBox) return; m_videoDisplaySize = videoBox; if (m_textTrackRepresentation) { setInlineStyleProperty(CSSPropertyWidth, String::number(m_videoDisplaySize.size().width()) + "px"); setInlineStyleProperty(CSSPropertyHeight, String::number(m_videoDisplaySize.size().height()) + "px"); } float smallestDimension = std::min(m_videoDisplaySize.size().height(), m_videoDisplaySize.size().width()); float fontSize = smallestDimension * (document()->page()->group().captionFontSizeScale()); if (fontSize != m_fontSize) { m_fontSize = fontSize; setInlineStyleProperty(CSSPropertyFontSize, String::number(fontSize) + "px"); } }
void VTTCueBox::applyCSSProperties(const IntSize&) { // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916 if (!m_cue->regionId().isEmpty()) { setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative); return; } // 3.5.1 On the (root) List of WebVTT Node Objects: // the 'position' property must be set to 'absolute' setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); // the 'unicode-bidi' property must be set to 'plaintext' setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); // the 'direction' property must be set to direction setInlineStyleProperty(CSSPropertyDirection, m_cue->getCSSWritingDirection()); // the 'writing-mode' property must be set to writing-mode setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue->getCSSWritingMode()); std::pair<float, float> position = m_cue->getCSSPosition(); // the 'top' property must be set to top, setInlineStyleProperty(CSSPropertyTop, position.second, CSSPrimitiveValue::CSS_PERCENTAGE); // the 'left' property must be set to left setInlineStyleProperty(CSSPropertyLeft, position.first, CSSPrimitiveValue::CSS_PERCENTAGE); // the 'width' property must be set to width, and the 'height' property must be set to height if (m_cue->vertical() == horizontalKeyword()) { setInlineStyleProperty(CSSPropertyWidth, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); } else { setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); setInlineStyleProperty(CSSPropertyHeight, static_cast<double>(m_cue->getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE); } // The 'text-align' property on the (root) List of WebVTT Node Objects must // be set to the value in the second cell of the row of the table below // whose first cell is the value of the corresponding cue's text track cue // alignment: setInlineStyleProperty(CSSPropertyTextAlign, m_cue->getCSSAlignment()); if (!m_cue->snapToLines()) { // 10.13.1 Set up x and y: // Note: x and y are set through the CSS left and top above. // 10.13.2 Position the boxes in boxes such that the point x% along the // width of the bounding box of the boxes in boxes is x% of the way // across the width of the video's rendering area, and the point y% // along the height of the bounding box of the boxes in boxes is y% // of the way across the height of the video's rendering area, while // maintaining the relative positions of the boxes in boxes to each // other. setInlineStyleProperty(CSSPropertyWebkitTransform, String::format("translate(-%.2f%%, -%.2f%%)", position.first, position.second)); setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePre); } }
void VTTCueBox::applyCSSProperties(const IntSize& videoSize) { // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916 #if ENABLE(WEBVTT_REGIONS) if (!m_cue.regionId().isEmpty()) { setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative); return; } #endif // 3.5.1 On the (root) List of WebVTT Node Objects: // the 'position' property must be set to 'absolute' setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); // the 'unicode-bidi' property must be set to 'plaintext' setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); // the 'direction' property must be set to direction setInlineStyleProperty(CSSPropertyDirection, m_cue.getCSSWritingDirection()); // the 'writing-mode' property must be set to writing-mode setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue.getCSSWritingMode(), false); std::pair<float, float> position = m_cue.getCSSPosition(); // the 'top' property must be set to top, setInlineStyleProperty(CSSPropertyTop, static_cast<double>(position.second), CSSPrimitiveValue::CSS_PERCENTAGE); // the 'left' property must be set to left setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(position.first), CSSPrimitiveValue::CSS_PERCENTAGE); double authorFontSize = std::min(videoSize.width(), videoSize.height()) * DEFAULTCAPTIONFONTSIZEPERCENTAGE / 100.0; double multiplier = 1.0; if (authorFontSize) multiplier = m_fontSizeFromCaptionUserPrefs / authorFontSize; double textPosition = m_cue.position(); double maxSize = 100.0; CSSValueID alignment = m_cue.getCSSAlignment(); if (alignment == CSSValueEnd || alignment == CSSValueRight) maxSize = textPosition; else if (alignment == CSSValueStart || alignment == CSSValueLeft) maxSize = 100.0 - textPosition; double newCueSize = std::min(m_cue.getCSSSize() * multiplier, 100.0); // the 'width' property must be set to width, and the 'height' property must be set to height if (m_cue.vertical() == horizontalKeyword()) { setInlineStyleProperty(CSSPropertyWidth, newCueSize, CSSPrimitiveValue::CSS_PERCENTAGE); setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); setInlineStyleProperty(CSSPropertyMinWidth, "-webkit-min-content"); setInlineStyleProperty(CSSPropertyMaxWidth, maxSize, CSSPrimitiveValue::CSS_PERCENTAGE); if ((alignment == CSSValueMiddle || alignment == CSSValueCenter) && multiplier != 1.0) setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(position.first - (newCueSize - m_cue.getCSSSize()) / 2), CSSPrimitiveValue::CSS_PERCENTAGE); } else { setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); setInlineStyleProperty(CSSPropertyHeight, newCueSize, CSSPrimitiveValue::CSS_PERCENTAGE); setInlineStyleProperty(CSSPropertyMinHeight, "-webkit-min-content"); setInlineStyleProperty(CSSPropertyMaxHeight, maxSize, CSSPrimitiveValue::CSS_PERCENTAGE); if ((alignment == CSSValueMiddle || alignment == CSSValueCenter) && multiplier != 1.0) setInlineStyleProperty(CSSPropertyTop, static_cast<double>(position.second - (newCueSize - m_cue.getCSSSize()) / 2), CSSPrimitiveValue::CSS_PERCENTAGE); } // The 'text-align' property on the (root) List of WebVTT Node Objects must // be set to the value in the second cell of the row of the table below // whose first cell is the value of the corresponding cue's text track cue // alignment: setInlineStyleProperty(CSSPropertyTextAlign, m_cue.getCSSAlignment()); if (!m_cue.snapToLines()) { // 10.13.1 Set up x and y: // Note: x and y are set through the CSS left and top above. // 10.13.2 Position the boxes in boxes such that the point x% along the // width of the bounding box of the boxes in boxes is x% of the way // across the width of the video's rendering area, and the point y% // along the height of the bounding box of the boxes in boxes is y% // of the way across the height of the video's rendering area, while // maintaining the relative positions of the boxes in boxes to each // other. setInlineStyleProperty(CSSPropertyWebkitTransform, String::format("translate(-%.2f%%, -%.2f%%)", position.first, position.second)); setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePre); } }
void TextTrackCueGenericBoxElement::applyCSSProperties(const IntSize& videoSize) { setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); TextTrackCueGeneric* cue = static_cast<TextTrackCueGeneric*>(getCue()); RefPtr<HTMLSpanElement> cueElement = cue->element(); float size = static_cast<float>(cue->getCSSSize()); if (cue->useDefaultPosition()) { setInlineStyleProperty(CSSPropertyBottom, 0, CSSPrimitiveValue::CSS_PX); setInlineStyleProperty(CSSPropertyMarginBottom, 1.0, CSSPrimitiveValue::CSS_PERCENTAGE); } else { setInlineStyleProperty(CSSPropertyLeft, static_cast<float>(cue->position()), CSSPrimitiveValue::CSS_PERCENTAGE); setInlineStyleProperty(CSSPropertyTop, static_cast<float>(cue->line()), CSSPrimitiveValue::CSS_PERCENTAGE); if (cue->getWritingDirection() == VTTCue::Horizontal) setInlineStyleProperty(CSSPropertyWidth, size, CSSPrimitiveValue::CSS_PERCENTAGE); else setInlineStyleProperty(CSSPropertyHeight, size, CSSPrimitiveValue::CSS_PERCENTAGE); } if (cue->getWritingDirection() == VTTCue::Horizontal) setInlineStyleProperty(CSSPropertyMinWidth, "-webkit-min-content"); else setInlineStyleProperty(CSSPropertyMinHeight, "-webkit-min-content"); if (cue->foregroundColor().isValid()) cueElement->setInlineStyleProperty(CSSPropertyColor, cue->foregroundColor().serialized()); if (cue->highlightColor().isValid()) cueElement->setInlineStyleProperty(CSSPropertyBackgroundColor, cue->highlightColor().serialized()); if (cue->getWritingDirection() == VTTCue::Horizontal) setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); else setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); if (cue->baseFontSizeRelativeToVideoHeight()) cue->setFontSize(cue->baseFontSizeRelativeToVideoHeight(), videoSize, false); if (cue->getAlignment() == VTTCue::Middle) setInlineStyleProperty(CSSPropertyTextAlign, CSSValueCenter); else if (cue->getAlignment() == VTTCue::End) setInlineStyleProperty(CSSPropertyTextAlign, CSSValueEnd); else setInlineStyleProperty(CSSPropertyTextAlign, CSSValueStart); if (cue->backgroundColor().isValid()) setInlineStyleProperty(CSSPropertyBackgroundColor, cue->backgroundColor().serialized()); setInlineStyleProperty(CSSPropertyWebkitWritingMode, cue->getCSSWritingMode(), false); setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePreWrap); }
void VTTCueBox::applyCSSProperties(const VTTDisplayParameters& displayParameters) { // http://dev.w3.org/html5/webvtt/#applying-css-properties-to-webvtt-node-objects // Initialize the (root) list of WebVTT Node Objects with the following CSS settings: // the 'position' property must be set to 'absolute' setInlineStyleProperty(CSSPropertyPosition, CSSValueAbsolute); // the 'unicode-bidi' property must be set to 'plaintext' setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext); // the 'direction' property must be set to direction setInlineStyleProperty(CSSPropertyDirection, displayParameters.direction); // the 'writing-mode' property must be set to writing-mode setInlineStyleProperty(CSSPropertyWebkitWritingMode, displayParameters.writingMode); const FloatPoint& position = displayParameters.position; // the 'top' property must be set to top, setInlineStyleProperty(CSSPropertyTop, position.y(), CSSPrimitiveValue::UnitType::Percentage); // the 'left' property must be set to left setInlineStyleProperty(CSSPropertyLeft, position.x(), CSSPrimitiveValue::UnitType::Percentage); // the 'width' property must be set to width, and the 'height' property must be set to height if (displayParameters.writingMode == CSSValueHorizontalTb) { setInlineStyleProperty(CSSPropertyWidth, displayParameters.size, CSSPrimitiveValue::UnitType::Percentage); setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto); } else { setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto); setInlineStyleProperty(CSSPropertyHeight, displayParameters.size, CSSPrimitiveValue::UnitType::Percentage); } // The 'text-align' property on the (root) List of WebVTT Node Objects must // be set to the value in the second cell of the row of the table below // whose first cell is the value of the corresponding cue's WebVTT cue // text alignment: setInlineStyleProperty(CSSPropertyTextAlign, displayParameters.textAlign); // TODO(philipj): The position adjustment for non-snap-to-lines cues has // been removed from the spec: // https://www.w3.org/Bugs/Public/show_bug.cgi?id=19178 if (std::isnan(displayParameters.snapToLinesPosition)) { // 10.13.1 Set up x and y: // Note: x and y are set through the CSS left and top above. // 10.13.2 Position the boxes in boxes such that the point x% along the // width of the bounding box of the boxes in boxes is x% of the way // across the width of the video's rendering area, and the point y% // along the height of the bounding box of the boxes in boxes is y% // of the way across the height of the video's rendering area, while // maintaining the relative positions of the boxes in boxes to each // other. setInlineStyleProperty(CSSPropertyTransform, String::format("translate(-%.2f%%, -%.2f%%)", position.x(), position.y())); setInlineStyleProperty(CSSPropertyWhiteSpace, CSSValuePre); } // The snap-to-lines position is propagated to LayoutVTTCue. m_snapToLinesPosition = displayParameters.snapToLinesPosition; }
void MediaControlTextTrackContainerElement::updateDisplay() { if (!mediaController()->closedCaptionsVisible()) { m_cueContainer->removeChildren(); return; } HTMLMediaElement* mediaElement = toParentMediaElement(this); // 1. If the media element is an audio element, or is another playback // mechanism with no rendering area, abort these steps. There is nothing to // render. if (!mediaElement || !mediaElement->isVideo()) return; // 2. Let video be the media element or other playback mechanism. HTMLVideoElement* video = static_cast<HTMLVideoElement*>(mediaElement); // 3. Let output be an empty list of absolutely positioned CSS block boxes. Vector<RefPtr<HTMLDivElement> > output; // 4. If the user agent is exposing a user interface for video, add to // output one or more completely transparent positioned CSS block boxes that // cover the same region as the user interface. // 5. If the last time these rules were run, the user agent was not exposing // a user interface for video, but now it is, let reset be true. Otherwise, // let reset be false. // There is nothing to be done explicitly for 4th and 5th steps, as // everything is handled through CSS. The caption box is on top of the // controls box, in a container set with the -webkit-box display property. // 6. Let tracks be the subset of video's list of text tracks that have as // their rules for updating the text track rendering these rules for // updating the display of WebVTT text tracks, and whose text track mode is // showing or showing by default. // 7. Let cues be an empty list of text track cues. // 8. For each track track in tracks, append to cues all the cues from // track's list of cues that have their text track cue active flag set. CueList activeCues = video->currentlyActiveCues(); // 9. If reset is false, then, for each text track cue cue in cues: if cue's // text track cue display state has a set of CSS boxes, then add those boxes // to output, and remove cue from cues. // There is nothing explicitly to be done here, as all the caching occurs // within the TextTrackCue instance itself. If parameters of the cue change, // the display tree is cleared. // 10. For each text track cue cue in cues that has not yet had // corresponding CSS boxes added to output, in text track cue order, run the // following substeps: for (size_t i = 0; i < activeCues.size(); ++i) { TextTrackCue* cue = activeCues[i].data(); ASSERT(cue->isActive()); if (!cue->track() || !cue->track()->isRendered()) continue; RefPtr<TextTrackCueBox> displayBox = cue->getDisplayTree(); if (displayBox->hasChildNodes() && !contains(static_cast<Node*>(displayBox.get()))) // Note: the display tree of a cue is removed when the active flag of the cue is unset. m_cueContainer->appendChild(displayBox, ASSERT_NO_EXCEPTION, false); } // 11. Return output. if (hasChildNodes()) { show(); if (mediaElement->requiresTextTrackRepresentation()) { if (!m_textTrackRepresentation) m_textTrackRepresentation = TextTrackRepresentation::create(this); mediaElement->setTextTrackRepresentation(m_textTrackRepresentation.get()); if (Page* page = document()->page()) m_textTrackRepresentation->setContentScale(page->deviceScaleFactor()); m_textTrackRepresentation->update(); setInlineStyleProperty(CSSPropertyWidth, String::number(m_videoDisplaySize.size().width()) + "px"); setInlineStyleProperty(CSSPropertyHeight, String::number(m_videoDisplaySize.size().height()) + "px"); } } else { hide(); m_textTrackRepresentation = nullptr; mediaElement->setTextTrackRepresentation(0); removeInlineStyleProperty(CSSPropertyWidth); removeInlineStyleProperty(CSSPropertyHeight); } }
void ProgressValueElement::setWidthPercentage(double width) { setInlineStyleProperty(CSSPropertyWidth, width, CSSPrimitiveValue::CSS_PERCENTAGE); }