1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
--- .pc/437142_backport_att350047.patch/layout/base/nsCSSFrameConstructor.cpp 2009-01-26 12:09:32.000000000 +0100
+++ layout/base/nsCSSFrameConstructor.cpp 2009-01-26 12:10:17.000000000 +0100
@@ -9902,17 +9902,19 @@ nsCSSFrameConstructor::ContentRemoved(ns
nsFrameManager *frameManager = mPresShell->FrameManager();
nsPresContext *presContext = mPresShell->GetPresContext();
nsresult rv = NS_OK;
// Find the child frame that maps the content
nsIFrame* childFrame;
mPresShell->GetPrimaryFrameFor(aChild, &childFrame);
- if (! childFrame) {
+ if (!childFrame || childFrame->GetContent() != aChild) {
+ // XXXbz the GetContent() != aChild check is needed due to bug 135040.
+ // Remove it once that's fixed.
frameManager->ClearUndisplayedContentIn(aChild, aContainer);
}
// When the last item is removed from a select,
// we need to add a pseudo frame so select gets sized as the best it can
// so here we see if it is a select and then we get the number of options
if (aContainer && childFrame) {
nsCOMPtr<nsIDOMHTMLSelectElement> selectElement = do_QueryInterface(aContainer);
@@ -9991,17 +9993,19 @@ nsCSSFrameConstructor::ContentRemoved(ns
// First update the containing blocks structure by removing the
// existing letter frames. This makes the subsequent logic
// simpler.
RemoveLetterFrames(presContext, mPresShell, frameManager,
containingBlock);
// Recover childFrame and parentFrame
mPresShell->GetPrimaryFrameFor(aChild, &childFrame);
- if (!childFrame) {
+ if (!childFrame || childFrame->GetContent() != aChild) {
+ // XXXbz the GetContent() != aChild check is needed due to bug 135040.
+ // Remove it once that's fixed.
frameManager->ClearUndisplayedContentIn(aChild, aContainer);
return NS_OK;
}
parentFrame = childFrame->GetParent();
#ifdef NOISY_FIRST_LETTER
printf(" ==> revised parentFrame=");
nsFrame::ListTag(stdout, parentFrame);
@@ -10502,16 +10506,24 @@ nsCSSFrameConstructor::ProcessRestyledFr
}
index = count;
while (0 <= --index) {
nsIFrame* frame;
nsIContent* content;
nsChangeHint hint;
aChangeList.ChangeAt(index, frame, content, hint);
+ if (frame && frame->GetContent() != content) {
+ // XXXbz this is due to image maps messing with the primary frame map.
+ // See bug 135040. Remove this block once that's fixed.
+ frame = nsnull;
+ if (!(hint & nsChangeHint_ReconstructFrame)) {
+ continue;
+ }
+ }
// skip any frame that has been destroyed due to a ripple effect
if (frame) {
nsresult res;
propTable->GetProperty(frame, nsLayoutAtoms::changeListProperty, &res);
if (NS_PROPTABLE_PROP_NOT_THERE == res)
@@ -10567,16 +10579,21 @@ nsCSSFrameConstructor::ProcessRestyledFr
return NS_OK;
}
void
nsCSSFrameConstructor::RestyleElement(nsIContent *aContent,
nsIFrame *aPrimaryFrame,
nsChangeHint aMinHint)
{
+ if (aPrimaryFrame && aPrimaryFrame->GetContent() != aContent) {
+ // XXXbz this is due to image maps messing with the primary frame mapping.
+ // See bug 135040. We can remove this block once that's fixed.
+ aPrimaryFrame = nsnull;
+ }
#ifdef ACCESSIBILITY
nsIAtom *prevRenderedFrameType = nsnull;
if (mPresShell->IsAccessibilityActive()) {
prevRenderedFrameType = GetRenderedFrameType(aPrimaryFrame);
}
#endif
if (aMinHint & nsChangeHint_ReconstructFrame) {
RecreateFramesForContent(aContent);
--- .pc/437142_backport_att350047.patch/layout/generic/nsImageMap.cpp 2009-01-26 12:09:32.000000000 +0100
+++ layout/generic/nsImageMap.cpp 2009-01-26 12:10:17.000000000 +0100
@@ -895,16 +895,22 @@ nsImageMap::AddArea(nsIContent* aArea)
return NS_ERROR_OUT_OF_MEMORY;
//Add focus listener to track area focus changes
nsCOMPtr<nsIDOMEventReceiver> rec(do_QueryInterface(aArea));
if (rec) {
rec->AddEventListenerByIID(this, NS_GET_IID(nsIDOMFocusListener));
}
+
+ // This is a nasty hack. It needs to go away: see bug 135040. Once this is
+ // removed, the code added to nsCSSFrameConstructor::RestyleElement,
+ // nsCSSFrameConstructor::ContentRemoved (both hacks there), and
+ // nsCSSFrameConstructor::ProcessRestyledFrames to work around this issue can
+ // be removed.
mPresShell->FrameManager()->SetPrimaryFrameFor(aArea, mImageFrame);
aArea->SetMayHaveFrame(PR_TRUE);
NS_ASSERTION(aArea->MayHaveFrame(), "SetMayHaveFrame failed?");
area->ParseCoords(coords);
mAreas.AppendElement(area);
return NS_OK;
}
|