Example A (ace:textAreaEntry w/ p:placeholder="placeholder")
<span id="form2:emailInput" placeholder="placeholder">
<span id="form2:emailInput_markup" class="ui-textareaentry-container">
<textarea id="form2:emailInput_input" class="ui-inputfield ui-textareaentry ui-widget ui-state-default ui-corner-all ui-state-optional ui-textareaentry-resizable" role="textbox" placeholder="placeholder" onfocus="var widget_form2_emailInput = ice.ace.lazy("TextAreaEntry",["form2:emailInput",{"inFieldLabelStyleClass":"ui-input-label-infield","maxlength":0,"placeholder":"placeholder"}]);" name="form2:emailInput_input" aria-multiline="true"/>
</span>
In this scenario, the "p:placeholder" attribute is being picked up by both the JSF passthrough attribute handler, which is adding it to the outer SPAN element, and also by the ace:textAreaEntry component itself (which has a "placeholder" attribute), which renders it onto the TEXTAREA element. It appears that the component ignores any namespace prefix on the attribute name and simply processes it as it's own attribute, whether or not a valid namespace prefix exists in front of it.
Example B (ace:textAreaEntry w/ placeholder="placeholder")
<span id="form2:emailInput">
<span id="form2:emailInput_markup" class="ui-textareaentry-container">
<textarea id="form2:emailInput_input" class="ui-inputfield ui-textareaentry ui-widget ui-state-default ui-corner-all ui-state-optional ui-textareaentry-resizable" role="textbox" placeholder="placeholder" onfocus="var widget_form2_emailInput = ice.ace.lazy("TextAreaEntry",["form2:emailInput",{"inFieldLabelStyleClass":"ui-input-label-infield","maxlength":0,"placeholder":"placeholder"}]);" name="form2:emailInput_input" aria-multiline="true"/>
Here we see the component processing the attribute as it's own, which is the expected behaviour in this scenario.
Example A (ace:textAreaEntry w/ p:placeholder="placeholder")
In this scenario, the "p:placeholder" attribute is being picked up by both the JSF passthrough attribute handler, which is adding it to the outer SPAN element, and also by the ace:textAreaEntry component itself (which has a "placeholder" attribute), which renders it onto the TEXTAREA element. It appears that the component ignores any namespace prefix on the attribute name and simply processes it as it's own attribute, whether or not a valid namespace prefix exists in front of it.
Example B (ace:textAreaEntry w/ placeholder="placeholder")
Here we see the component processing the attribute as it's own, which is the expected behaviour in this scenario.