mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-16 22:04:36 +00:00
Bug 221820 - Part 5: Make lazy editor initialization compatible with placeholder values; r=bzbarsky
This commit is contained in:
parent
82c0a0f238
commit
d42f42731a
@ -1651,6 +1651,10 @@ nsTextControlFrame::CreateAnonymousContent(nsTArray<nsIContent*>& aElements)
|
|||||||
if (!aElements.AppendElement(mValueDiv))
|
if (!aElements.AppendElement(mValueDiv))
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
// Now create the placeholder anonymous content
|
||||||
|
rv = CreatePlaceholderDiv(aElements, doc->NodeInfoManager());
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
rv = UpdateValueDisplay(PR_FALSE);
|
rv = UpdateValueDisplay(PR_FALSE);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
@ -1704,10 +1708,6 @@ nsTextControlFrame::CreateAnonymousContent(nsTArray<nsIContent*>& aElements)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now create the placeholder anonymous content
|
|
||||||
rv = CreatePlaceholderDiv(aElements, doc->NodeInfoManager());
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2436,6 +2436,15 @@ nsTextControlFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
|||||||
nsIAtom* aAttribute,
|
nsIAtom* aAttribute,
|
||||||
PRInt32 aModType)
|
PRInt32 aModType)
|
||||||
{
|
{
|
||||||
|
// First, check for the placeholder attribute, because it doesn't
|
||||||
|
// depend on the editor being present.
|
||||||
|
if (nsGkAtoms::placeholder == aAttribute)
|
||||||
|
{
|
||||||
|
nsWeakFrame weakFrame(this);
|
||||||
|
UpdatePlaceholderText(PR_TRUE);
|
||||||
|
NS_ENSURE_STATE(weakFrame.IsAlive());
|
||||||
|
}
|
||||||
|
|
||||||
if (!mEditor || !mSelCon)
|
if (!mEditor || !mSelCon)
|
||||||
return nsBoxFrame::AttributeChanged(aNameSpaceID, aAttribute, aModType);;
|
return nsBoxFrame::AttributeChanged(aNameSpaceID, aAttribute, aModType);;
|
||||||
|
|
||||||
@ -2497,12 +2506,6 @@ nsTextControlFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
|||||||
}
|
}
|
||||||
mEditor->SetFlags(flags);
|
mEditor->SetFlags(flags);
|
||||||
}
|
}
|
||||||
else if (nsGkAtoms::placeholder == aAttribute)
|
|
||||||
{
|
|
||||||
nsWeakFrame weakFrame(this);
|
|
||||||
UpdatePlaceholderText(PR_TRUE);
|
|
||||||
NS_ENSURE_STATE(weakFrame.IsAlive());
|
|
||||||
}
|
|
||||||
else if (!mUseEditor && nsGkAtoms::value == aAttribute) {
|
else if (!mUseEditor && nsGkAtoms::value == aAttribute) {
|
||||||
UpdateValueDisplay(PR_TRUE);
|
UpdateValueDisplay(PR_TRUE);
|
||||||
}
|
}
|
||||||
@ -2926,6 +2929,7 @@ nsTextControlFrame::UpdateValueDisplay(PRBool aNotify,
|
|||||||
"Do not call this after editor has been initialized");
|
"Do not call this after editor has been initialized");
|
||||||
NS_ASSERTION(mValueDiv->GetChildCount() <= 1,
|
NS_ASSERTION(mValueDiv->GetChildCount() <= 1,
|
||||||
"Cannot have more than one child node");
|
"Cannot have more than one child node");
|
||||||
|
NS_ASSERTION(mPlaceholderDiv, "A placeholder div must exist");
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NO_NODE,
|
NO_NODE,
|
||||||
@ -2957,6 +2961,17 @@ nsTextControlFrame::UpdateValueDisplay(PRBool aNotify,
|
|||||||
GetValue(value, PR_TRUE);
|
GetValue(value, PR_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update the display of the placeholder value if needed.
|
||||||
|
{
|
||||||
|
nsWeakFrame weakFrame(this);
|
||||||
|
if (value.IsEmpty()) {
|
||||||
|
ShowPlaceholder();
|
||||||
|
} else {
|
||||||
|
HidePlaceholder();
|
||||||
|
}
|
||||||
|
NS_ENSURE_STATE(weakFrame.IsAlive());
|
||||||
|
}
|
||||||
|
|
||||||
if (aBeforeEditorInit && value.IsEmpty()) {
|
if (aBeforeEditorInit && value.IsEmpty()) {
|
||||||
mValueDiv->RemoveChildAt(0, PR_TRUE, PR_FALSE);
|
mValueDiv->RemoveChildAt(0, PR_TRUE, PR_FALSE);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
@ -72,7 +72,7 @@
|
|||||||
function doTest() {
|
function doTest() {
|
||||||
var t1 = $("t1");
|
var t1 = $("t1");
|
||||||
var t2 = $("t2");
|
var t2 = $("t2");
|
||||||
t1.value = "1";
|
setTextboxValue(t1, "1");
|
||||||
var t1Enabled = {};
|
var t1Enabled = {};
|
||||||
var t1CanUndo = {};
|
var t1CanUndo = {};
|
||||||
t1.editor.canUndo(t1Enabled, t1CanUndo);
|
t1.editor.canUndo(t1Enabled, t1CanUndo);
|
||||||
@ -80,7 +80,7 @@
|
|||||||
"undo correctly enabled when placeholder was not changed through property");
|
"undo correctly enabled when placeholder was not changed through property");
|
||||||
|
|
||||||
t2.placeholder = "reallyempty";
|
t2.placeholder = "reallyempty";
|
||||||
t2.value = "2";
|
setTextboxValue(t2, "2");
|
||||||
var t2Enabled = {};
|
var t2Enabled = {};
|
||||||
var t2CanUndo = {};
|
var t2CanUndo = {};
|
||||||
t2.editor.canUndo(t2Enabled, t2CanUndo);
|
t2.editor.canUndo(t2Enabled, t2CanUndo);
|
||||||
@ -90,6 +90,14 @@
|
|||||||
SimpleTest.finish();
|
SimpleTest.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setTextboxValue(textbox, value) {
|
||||||
|
textbox.focus();
|
||||||
|
for (var i = 0; i < value.length; ++i) {
|
||||||
|
synthesizeKey(value.charAt(i), {});
|
||||||
|
}
|
||||||
|
textbox.blur();
|
||||||
|
}
|
||||||
|
|
||||||
SimpleTest.waitForFocus(doTest);
|
SimpleTest.waitForFocus(doTest);
|
||||||
|
|
||||||
]]></script>
|
]]></script>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user