WebCore:
authoradele@apple.com <adele@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Oct 2008 00:25:37 +0000 (00:25 +0000)
committeradele@apple.com <adele@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Oct 2008 00:25:37 +0000 (00:25 +0000)
2008-10-02  Adele Peterson  <adele@apple.com>

        Reviewed by Dan Bernstein.

        Fix for https://bugs.webkit.org/show_bug.cgi?id=21299
        REGRESSION: <input> color specified in inline style applies to placeholder

        I recently added a pseudo-class for the placeholder, but that can be overridden by inline style changes.  A pseudo-element
        is more appropriate.  This change adds "-webkit-input-placeholder".

        * css/CSSSelector.cpp: (WebCore::CSSSelector::extractPseudoType):
        Added definition for "-webkit-input-placeholder" pseudo element.
        * css/CSSSelector.h: (WebCore::CSSSelector::): Added PseudoInputPlaceholder.
        * css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector):
        Added case for PseudoInputPlaceholder.
        * css/html4.css: Added rule for -webkit-input-placeholder pseudo-element.
        * rendering/style/RenderStyle.h: (WebCore::RenderStyle::): Added INPUT_PLACEHOLDER.

        * html/HTMLInputElement.cpp:
        (WebCore::HTMLInputElement::setValue): Check that its a text field before calling updatePlaceholderVisibility.
        (WebCore::HTMLInputElement::setValueFromRenderer): ditto.
        (WebCore::HTMLInputElement::updatePlaceholderVisibility): Instead of calling setChanged(), call updatePlaceholderVisibility on the renderer.
        setChanged wouldn't actually trigger setStyle since the style for the input element won't actually change.
        * rendering/RenderTextControl.cpp:
        (WebCore::RenderTextControl::createInnerTextStyle): Get the pseudoStyle when the placeholder is visible.
        (WebCore::RenderTextControl::updatePlaceholderVisibility): Sets the style on the inner text block, and calls updateFromElement so
        the text will be updated correctly.
        * rendering/RenderTextControl.h:

LayoutTests:

2008-10-02  Adele Peterson  <adele@apple.com>

        Reviewed by Dan Bernstein.

        Update tests for https://bugs.webkit.org/show_bug.cgi?id=21299
        REGRESSION: <input> color specified in inline style applies to placeholder

        * fast/forms/placeholder-pseudo-style.html:
        * platform/mac/fast/forms/password-placeholder-expected.txt:
        * platform/mac/fast/forms/password-placeholder-text-security-expected.txt:
        * platform/mac/fast/forms/placeholder-pseudo-style-expected.txt:
        * platform/mac/fast/forms/placeholder-set-attribute-expected.txt:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37217 268f45cc-cd09-0410-ab3c-d52691b4dbfc

15 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/forms/placeholder-pseudo-style.html
LayoutTests/platform/mac/fast/forms/password-placeholder-expected.txt
LayoutTests/platform/mac/fast/forms/password-placeholder-text-security-expected.txt
LayoutTests/platform/mac/fast/forms/placeholder-pseudo-style-expected.txt
LayoutTests/platform/mac/fast/forms/placeholder-set-attribute-expected.txt
WebCore/ChangeLog
WebCore/css/CSSSelector.cpp
WebCore/css/CSSSelector.h
WebCore/css/CSSStyleSelector.cpp
WebCore/css/html4.css
WebCore/html/HTMLInputElement.cpp
WebCore/rendering/RenderTextControl.cpp
WebCore/rendering/RenderTextControl.h
WebCore/rendering/style/RenderStyle.h

index a19a66e..4779113 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-02  Adele Peterson  <adele@apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Update tests for https://bugs.webkit.org/show_bug.cgi?id=21299
+        REGRESSION: <input> color specified in inline style applies to placeholder
+
+        * fast/forms/placeholder-pseudo-style.html:
+        * platform/mac/fast/forms/password-placeholder-expected.txt:
+        * platform/mac/fast/forms/password-placeholder-text-security-expected.txt:
+        * platform/mac/fast/forms/placeholder-pseudo-style-expected.txt:
+        * platform/mac/fast/forms/placeholder-set-attribute-expected.txt:
+
 2008-10-01  Chris Fleizach  <cfleizach@apple.com>
 
         Reviewed by Darin Adler.
index 4a288fd..23cb509 100644 (file)
@@ -1,5 +1,5 @@
 <style>
-input.red:-webkit-input-placeholder-mode {
+input.red::-webkit-input-placeholder {
     color: rgb(100, 0, 0);
 }
 </style>
index d22c102..991cb10 100644 (file)
@@ -3,9 +3,9 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderTextControl {INPUT} at (2,2) size 148x19 [color=#A9A9A9] [bgcolor=#FFFFFF] [border: (2px inset #A9A9A9)]
+      RenderTextControl {INPUT} at (2,2) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderText {#text} at (0,0) size 0x0
 layer at (13,13) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#A9A9A9]
     RenderText {#text} at (1,0) size 36x13
       text run at (1,0) width 36: "foobar"
index 2559165..00e27f4 100644 (file)
@@ -8,7 +8,7 @@ layer at (0,0) size 800x600
       RenderBR {BR} at (637,14) size 0x0
       RenderText {#text} at (0,20) size 357x18
         text run at (0,20) width 357: "Leave field 1 alone. It should show the placeholder text: "
-      RenderTextControl {INPUT} at (359,20) size 148x19 [color=#A9A9A9] [bgcolor=#FFFFFF] [border: (2px inset #A9A9A9)]
+      RenderTextControl {INPUT} at (359,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderBR {BR} at (509,34) size 0x0
       RenderText {#text} at (0,43) size 407x18
         text run at (0,43) width 148: "Focus field 2 and type. "
@@ -19,10 +19,10 @@ layer at (0,0) size 800x600
         text run at (0,66) width 148: "Focus field 3 and type. "
         text run at (148,66) width 214: "Clear the value and blur the field. "
         text run at (362,66) width 228: "It should show the placeholder text: "
-      RenderTextControl {INPUT} at (592,66) size 148x19 [color=#A9A9A9] [bgcolor=#FFFFFF] [border: (2px inset #A9A9A9)]
+      RenderTextControl {INPUT} at (592,66) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderBR {BR} at (742,80) size 0x0
 layer at (370,31) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#A9A9A9]
     RenderText {#text} at (1,0) size 63x13
       text run at (1,0) width 63: "placeholder"
 layer at (420,54) size 142x13
@@ -30,6 +30,6 @@ layer at (420,54) size 142x13
     RenderText {#text} at (1,0) size 25x13
       text run at (1,0) width 25: "\x{2022}\x{2022}\x{2022}\x{2022}"
 layer at (603,77) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#A9A9A9]
     RenderText {#text} at (1,0) size 63x13
       text run at (1,0) width 63: "placeholder"
index d24b162..8ce1f6c 100644 (file)
@@ -6,36 +6,36 @@ layer at (0,0) size 800x600
       RenderText {#text} at (0,0) size 328x18
         text run at (0,0) width 328: "This tests that you can set the placeholder text color."
       RenderBR {BR} at (328,14) size 0x0
-      RenderTextControl {INPUT} at (2,20) size 148x19 [color=#640000] [bgcolor=#FFFFFF] [border: (2px inset #640000)]
+      RenderTextControl {INPUT} at (2,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderText {#text} at (152,20) size 4x18
         text run at (152,20) width 4: " "
-      RenderTextControl {INPUT} at (158,20) size 148x19 [color=#640000] [bgcolor=#FFFFFF] [border: (2px inset #640000)]
+      RenderTextControl {INPUT} at (158,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
         RenderBlock {DIV} at (3,3) size 142x13
           RenderBlock {DIV} at (0,0) size 8x11
           RenderBlock {DIV} at (129,0) size 13x11
       RenderText {#text} at (308,20) size 4x18
         text run at (308,20) width 4: " "
-      RenderTextControl {INPUT} at (314,20) size 148x19 [color=#640000] [bgcolor=#FFFFFF] [border: (2px inset #640000)]
+      RenderTextControl {INPUT} at (314,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderText {#text} at (464,20) size 4x18
         text run at (464,20) width 4: " "
-      RenderTextControl {INPUT} at (470,20) size 148x19 [color=#640000] [bgcolor=#FFFFFF] [border: (2px inset #640000)]
+      RenderTextControl {INPUT} at (470,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderText {#text} at (620,20) size 4x18
         text run at (620,20) width 4: " "
-      RenderTextControl {INPUT} at (626,20) size 148x19 [color=#A9A9A9] [bgcolor=#FFFFFF] [border: (2px inset #A9A9A9)]
+      RenderTextControl {INPUT} at (626,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderText {#text} at (776,20) size 4x18
         text run at (776,20) width 4: " "
-      RenderTextControl {INPUT} at (2,43) size 148x19 [color=#A9A9A9] [bgcolor=#FFFFFF] [border: (2px inset #A9A9A9)]
+      RenderTextControl {INPUT} at (2,43) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
       RenderText {#text} at (0,0) size 0x0
 layer at (13,31) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#640000]
     RenderText {#text} at (1,0) size 22x13
       text run at (1,0) width 22: "text"
 layer at (177,31) size 121x13
-  RenderBlock {DIV} at (8,0) size 121x13
+  RenderBlock {DIV} at (8,0) size 121x13 [color=#640000]
     RenderText {#text} at (1,0) size 35x13
       text run at (1,0) width 35: "search"
 layer at (325,31) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#640000]
     RenderText {#text} at (1,0) size 51x13
       text run at (1,0) width 51: "password"
 layer at (481,31) size 142x13
@@ -43,10 +43,10 @@ layer at (481,31) size 142x13
     RenderText {#text} at (1,0) size 70x13
       text run at (1,0) width 70: "disabled text"
 layer at (637,31) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#A9A9A9]
     RenderText {#text} at (1,0) size 38x13
       text run at (1,0) width 38: "default"
 layer at (13,54) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#A9A9A9]
     RenderText {#text} at (1,0) size 86x13
       text run at (1,0) width 86: "default disabled"
index ea2e8be..6b36f1e 100644 (file)
@@ -7,8 +7,8 @@ layer at (0,0) size 800x600
         RenderText {#text} at (0,0) size 441x18
           text run at (0,0) width 441: "If you can see the word \"Placeholder\" in the text field, then all is well."
       RenderBlock {P} at (0,34) size 784x23
-        RenderTextControl {INPUT} at (2,2) size 148x19 [color=#A9A9A9] [bgcolor=#FFFFFF] [border: (2px inset #A9A9A9)]
+        RenderTextControl {INPUT} at (2,2) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)]
 layer at (13,47) size 142x13
-  RenderBlock {DIV} at (3,3) size 142x13
+  RenderBlock {DIV} at (3,3) size 142x13 [color=#A9A9A9]
     RenderText {#text} at (1,0) size 62x13
       text run at (1,0) width 62: "Placeholder"
index 7ddacc3..c135b5a 100644 (file)
@@ -1,3 +1,32 @@
+2008-10-02  Adele Peterson  <adele@apple.com>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=21299
+        REGRESSION: <input> color specified in inline style applies to placeholder
+
+        I recently added a pseudo-class for the placeholder, but that can be overridden by inline style changes.  A pseudo-element
+        is more appropriate.  This change adds "-webkit-input-placeholder".
+
+        * css/CSSSelector.cpp: (WebCore::CSSSelector::extractPseudoType):
+        Added definition for "-webkit-input-placeholder" pseudo element.
+        * css/CSSSelector.h: (WebCore::CSSSelector::): Added PseudoInputPlaceholder.
+        * css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector):
+        Added case for PseudoInputPlaceholder.
+        * css/html4.css: Added rule for -webkit-input-placeholder pseudo-element.
+        * rendering/style/RenderStyle.h: (WebCore::RenderStyle::): Added INPUT_PLACEHOLDER.
+
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::setValue): Check that its a text field before calling updatePlaceholderVisibility.
+        (WebCore::HTMLInputElement::setValueFromRenderer): ditto.
+        (WebCore::HTMLInputElement::updatePlaceholderVisibility): Instead of calling setChanged(), call updatePlaceholderVisibility on the renderer.
+        setChanged wouldn't actually trigger setStyle since the style for the input element won't actually change.
+        * rendering/RenderTextControl.cpp:
+        (WebCore::RenderTextControl::createInnerTextStyle): Get the pseudoStyle when the placeholder is visible.
+        (WebCore::RenderTextControl::updatePlaceholderVisibility): Sets the style on the inner text block, and calls updateFromElement so
+        the text will be updated correctly.
+        * rendering/RenderTextControl.h:
+
 2008-10-02  Chris Fleizach  <cfleizach@apple.com>
 
         Reviewed by Darin Adler.
index 54092e4..b6afff0 100644 (file)
@@ -88,7 +88,7 @@ void CSSSelector::extractPseudoType() const
     static AtomicString focus("focus");
     static AtomicString hover("hover");
     static AtomicString indeterminate("indeterminate");
-    static AtomicString inputPlaceholderMode("-webkit-input-placeholder-mode");
+    static AtomicString inputPlaceholder("-webkit-input-placeholder");
     static AtomicString lastChild("last-child");
     static AtomicString lastOfType("last-of-type");
     static AtomicString link("link");
@@ -153,9 +153,10 @@ void CSSSelector::extractPseudoType() const
         m_pseudoType = PseudoFirstChild;
     else if (m_value == fullPageMedia)
         m_pseudoType = PseudoFullPageMedia;
-    else if (m_value == inputPlaceholderMode)
-        m_pseudoType = PseudoInputPlaceholderMode;
-    else if (m_value == lastChild)
+    else if (m_value == inputPlaceholder) {
+        m_pseudoType = PseudoInputPlaceholder;
+        element = true;
+    } else if (m_value == lastChild)
         m_pseudoType = PseudoLastChild;
     else if (m_value == lastOfType)
         m_pseudoType = PseudoLastOfType;
index b01b572..cdacceb 100644 (file)
@@ -140,7 +140,7 @@ namespace WebCore {
             PseudoEnabled,
             PseudoFullPageMedia,
             PseudoDisabled,
-            PseudoInputPlaceholderMode,
+            PseudoInputPlaceholder,
             PseudoReadOnly,
             PseudoReadWrite,
             PseudoIndeterminate,
index 09ea238..4dd8df5 100644 (file)
@@ -2191,10 +2191,6 @@ bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Eleme
                     // that are non-"hidden" controls.
                     return !e->isEnabled();                    
                 break;
-            case CSSSelector::PseudoInputPlaceholderMode:
-                if (e && e->hasTagName(inputTag))
-                    return static_cast<HTMLInputElement*>(e)->placeholderShouldBeVisible();
-                break;
             case CSSSelector::PseudoReadOnly:
                 return e && e->isTextControl() && e->isReadOnlyControl();
             case CSSSelector::PseudoReadWrite:
@@ -2283,6 +2279,9 @@ bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Eleme
             case CSSSelector::PseudoFileUploadButton:
                 dynamicPseudo = RenderStyle::FILE_UPLOAD_BUTTON;
                 return true;
+            case CSSSelector::PseudoInputPlaceholder:
+                dynamicPseudo = RenderStyle::INPUT_PLACEHOLDER;
+                return true;
             case CSSSelector::PseudoSliderThumb:
                 dynamicPseudo = RenderStyle::SLIDER_THUMB;
                 return true; 
index fff50e0..c76c2ec 100644 (file)
@@ -361,7 +361,7 @@ textarea {
     cursor: auto;
 }
 
-input:-webkit-input-placeholder-mode {
+input::-webkit-input-placeholder {
     color: darkGray;
 }
 
index 6cc015b..1a0ad2e 100644 (file)
@@ -999,7 +999,8 @@ void HTMLInputElement::setValue(const String& value)
     if (inputType() == FILE && !value.isEmpty())
         return;
 
-    updatePlaceholderVisibility();
+    if (isTextField())
+        updatePlaceholderVisibility();
     
     setValueMatchesRenderer(false);
     if (storesValueSeparateFromAttribute()) {
@@ -1032,7 +1033,8 @@ void HTMLInputElement::setValueFromRenderer(const String& value)
     // Renderer and our event handler are responsible for constraining values.
     ASSERT(value == constrainValue(value) || constrainValue(value).isEmpty());
 
-    updatePlaceholderVisibility();
+    if (isTextField())
+        updatePlaceholderVisibility();
     
     if (inputType() == FILE) {
         m_fileList->clear();
@@ -1560,14 +1562,16 @@ void HTMLInputElement::unregisterForActivationCallbackIfNeeded()
 
 void HTMLInputElement::updatePlaceholderVisibility()
 {
+    ASSERT(isTextField());
+
     bool oldPlaceholderShouldBeVisible = m_placeholderShouldBeVisible;
     
     m_placeholderShouldBeVisible = value().isEmpty() 
         && document()->focusedNode() != this
         && !getAttribute(placeholderAttr).isEmpty();
 
-    if (oldPlaceholderShouldBeVisible != m_placeholderShouldBeVisible)
-        setChanged();
+    if (oldPlaceholderShouldBeVisible != m_placeholderShouldBeVisible && renderer())
+        static_cast<RenderTextControl*>(renderer())->updatePlaceholderVisibility();
 }
 
 String HTMLInputElement::constrainValue(const String& proposedValue, int maxLen) const
index 635b2c1..5c08eb6 100644 (file)
@@ -157,10 +157,18 @@ RenderStyle* RenderTextControl::createInnerBlockStyle(RenderStyle* startStyle)
 
 RenderStyle* RenderTextControl::createInnerTextStyle(RenderStyle* startStyle)
 {
-    RenderStyle* textBlockStyle = new (renderArena()) RenderStyle();
     HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(node());
+    bool placeholderShouldBeVisible = !m_multiLine && static_cast<HTMLInputElement*>(element)->placeholderShouldBeVisible();
 
-    textBlockStyle->inheritFrom(startStyle);
+    RenderStyle* textBlockStyle = 0;
+    if (placeholderShouldBeVisible) {
+        RenderStyle* pseudoStyle = getPseudoStyle(RenderStyle::INPUT_PLACEHOLDER);
+        textBlockStyle = new (renderArena()) RenderStyle(*pseudoStyle);
+    } else {
+        textBlockStyle = new (renderArena()) RenderStyle();    
+        textBlockStyle->inheritFrom(startStyle);
+    }
+    
     // The inner block, if present, always has its direction set to LTR,
     // so we need to inherit the direction from the element.
     textBlockStyle->setDirection(style()->direction());
@@ -206,12 +214,13 @@ RenderStyle* RenderTextControl::createInnerTextStyle(RenderStyle* startStyle)
     
     // When the placeholder is going to be displayed, temporarily override the text security to be "none".
     // After this, updateFromElement will immediately update the text displayed.
-    // When the placeholder is no longer visible, style will be recomputed, and the text security mode will be set back to the computed value correctly.
+    // When the placeholder is no longer visible, updatePlaceholderVisiblity will reset the style, 
+    // and the text security mode will be set back to the computed value correctly.
     if (!m_multiLine && static_cast<HTMLInputElement*>(element)->placeholderShouldBeVisible())
         textBlockStyle->setTextSecurity(TSNONE);
 
     if (!element->isEnabled())
-        textBlockStyle->setColor(disabledTextColor(startStyle->color(), startStyle->backgroundColor()));
+        textBlockStyle->setColor(disabledTextColor(textBlockStyle->color(), startStyle->backgroundColor()));
 
     return textBlockStyle;
 }
@@ -1171,6 +1180,20 @@ FontSelector* RenderTextControl::fontSelector() const
     return document()->styleSelector()->fontSelector();
 }
 
+void RenderTextControl::updatePlaceholderVisibility()
+{
+    RenderStyle* parentStyle = m_innerBlock ? m_innerBlock->renderer()->style() : style();
+    RenderStyle* textBlockStyle = createInnerTextStyle(parentStyle);
+    textBlockStyle->ref();
+    m_innerText->renderer()->setStyle(textBlockStyle);
+    for (Node* n = m_innerText->firstChild(); n; n = n->traverseNextNode(m_innerText.get())) {
+        if (n->renderer())
+            n->renderer()->setStyle(textBlockStyle);
+    }
+    textBlockStyle->deref(renderArena());
+    updateFromElement();
+}
+
 void RenderTextControl::capsLockStateMayHaveChanged()
 {
     // Only draw the caps lock indicator if these things are true:
index 180fc58..c5625f5 100644 (file)
@@ -103,6 +103,7 @@ public:
     void stopSearchEventTimer();
     
     bool placeholderIsVisible() const { return m_placeholderVisible; }
+    void updatePlaceholderVisibility();
 
     virtual void capsLockStateMayHaveChanged();
 
index 7101f1f..329ea95 100644 (file)
@@ -106,8 +106,8 @@ class RenderStyle {
 
 public:
     // static pseudo styles. Dynamic ones are produced on the fly.
-    enum PseudoId { NOPSEUDO, FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, SELECTION, FIRST_LINE_INHERITED, FILE_UPLOAD_BUTTON, SLIDER_THUMB,
-                    SEARCH_CANCEL_BUTTON, SEARCH_DECORATION, SEARCH_RESULTS_DECORATION, SEARCH_RESULTS_BUTTON, MEDIA_CONTROLS_PANEL,
+    enum PseudoId { NOPSEUDO, FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, SELECTION, FIRST_LINE_INHERITED, FILE_UPLOAD_BUTTON, INPUT_PLACEHOLDER,
+                    SLIDER_THUMB, SEARCH_CANCEL_BUTTON, SEARCH_DECORATION, SEARCH_RESULTS_DECORATION, SEARCH_RESULTS_BUTTON, MEDIA_CONTROLS_PANEL,
                     MEDIA_CONTROLS_PLAY_BUTTON, MEDIA_CONTROLS_MUTE_BUTTON, MEDIA_CONTROLS_TIMELINE, MEDIA_CONTROLS_TIME_DISPLAY,
                     MEDIA_CONTROLS_SEEK_BACK_BUTTON, MEDIA_CONTROLS_SEEK_FORWARD_BUTTON , MEDIA_CONTROLS_FULLSCREEN_BUTTON };
     static const int FIRST_INTERNAL_PSEUDOID = FILE_UPLOAD_BUTTON;