Reviewed by Oliver.
- new test case for:
<rdar://problem/
5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
<rdar://problem/
5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
(The test case covers both scenarios.)
* http/tests/misc/frame-access-during-load-expected.checksum: Added.
* http/tests/misc/frame-access-during-load-expected.png: Added.
* http/tests/misc/frame-access-during-load-expected.txt: Added.
* http/tests/misc/frame-access-during-load.html: Added.
- test results beneficially or harmlessly changed as a result of the above fixes
* css2.1/t0801-c412-hz-box-00-b-a-expected.checksum:
* css2.1/t0801-c412-hz-box-00-b-a-expected.png:
* css2.1/t0801-c412-hz-box-00-b-a-expected.txt: This reflects an <object> containing
an image now creating an image renderer.
* dom/xhtml/level2/html/HTMLIFrameElement11-expected.txt: This is updated to a slightly
less bad failure for access to a frame that's not loaded yet.
The following test results now reflect the frame removal that the test was testing:
* fast/dom/clientWidthAfterDocumentIsRemoved-expected.checksum:
* fast/dom/clientWidthAfterDocumentIsRemoved-expected.png:
* fast/dom/clientWidthAfterDocumentIsRemoved-expected.txt:
* fast/dom/replaceChild-expected.checksum:
* fast/dom/replaceChild-expected.png:
* fast/dom/replaceChild-expected.txt:
The following tests results now reflect empty document content for iframes that never load anything:
* fast/events/focusingUnloadedFrame-expected.txt:
* tables/mozilla_expected_failures/bugs/bug137388-1-expected.txt:
* tables/mozilla_expected_failures/bugs/bug137388-2-expected.txt:
WebCore:
Reviewed by Oliver.
- WebCore part of fix for:
<rdar://problem/
5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
<rdar://problem/
5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
The basic approach is to have Frames start out containing an empty document instead of absolutely nothing,
so there is no need to initialize them on demand. Various side effects of that cause both of these bugs.
However, this caused many regressions so I had to fix the fallout.
* WebCore.exp: fix symbol exports
* bindings/js/kjs_window.cpp:
(KJS::createNewWindow): useless "created" bool (we don't need it here)
(KJS::WindowFunc::callAsFunction): detect if we created a new frame, because if so,
we need to initialize the domain (can't count on it not having a document), also
don't try to make a new document for it.
Also, stop properly.
* css/cssstyleselector.cpp:
(WebCore::CSSStyleSelector::CSSStyleSelector): don't count on document having a view here
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::isImageType): Ask client, to match how other <object> renderer
decisions are made.
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::FrameLoader): Initialize new data members
(WebCore::FrameLoader::init): Do the slightly tricky sequence of steps to properly make
an empty document with everything hooked up.
(WebCore::FrameLoader::createWindow): Added "created" bool.
(WebCore::FrameLoader::stopLoading): (whitespace change)
(WebCore::FrameLoader::begin): Don't try to create an empty document.
(WebCore::FrameLoader::finishedParsing): If creating an initial empty document, don't
do any of this work.
(WebCore::FrameLoader::checkCompleted): Do checkLoadComplete() as well.
(WebCore::FrameLoader::baseURL): don't check for null document
(WebCore::FrameLoader::baseTarget): ditto
(WebCore::FrameLoader::completeURL): ditto
(WebCore::FrameLoader::didTellBridgeAboutLoad): ditto
(WebCore::FrameLoader::scheduleLocationChange): determine duringLoad differently; doc won't
be null.
(WebCore::FrameLoader::gotoAnchor): don't check for null document
(WebCore::FrameLoader::canTarget): don't check for null document
(WebCore::FrameLoader::stopForUserCancel): new method for explicit stops like window.stop().
(WebCore::FrameLoader::transitionToCommitted): check for pre-loaded state properly
(WebCore::FrameLoader::createEmptyDocument): removed
(WebCore::FrameLoader::checkLoadCompleteForThisFrame): don't send delegate callbacks when making initial
doc.
(WebCore::FrameLoader::tokenizerProcessedData): Assume document; just checkCompleted now that it
does checkLoadComplete.
(WebCore::FrameLoader::receivedMainResourceError): assume document
(WebCore::FrameLoader::saveDocumentState): Assume there's a document except during initial load
(WebCore::FrameLoader::mainReceivedCompleteError): do checkCompleted, not checkLoadComplete
(WebCore::FrameLoader::continueLoadWithData): assume document
* loader/FrameLoader.h:
* loader/MainResourceLoader.cpp:
(WebCore::MainResourceLoader::receivedError): Add more ref protection and do things in a slightly
different order.
* page/DOMWindow.cpp:
(WebCore::DOMWindow::document): don't force document creation, just assert there is one.
* page/Frame.cpp:
(WebCore::Frame::init): Added init method.
(WebCore::Frame::pageDestroyed): when a frame is removed, make sure to check if the parent is
done loading.
* page/Frame.h:
* page/mac/WebCoreFrameBridge.mm:
(-[WebCoreFrameBridge stringByEvaluatingJavaScriptFromString:forceUserGesture:]): No need to force
document.
(-[WebCoreFrameBridge aeDescByEvaluatingJavaScriptFromString:]): ditto
* platform/graphics/svg/SVGImage.cpp:
(WebCore::SVGImage::dataChanged): init the frame
* rendering/RenderPart.cpp:
(WebCore::RenderPart::updateWidgetPosition): If a subframe needs layout, then lay it out even
if the bounds did not change; the content size might be wrong.
* rendering/RenderTreeAsText.cpp:
(WebCore::externalRepresentation): Don't crash if the frame lacks a view.
WebKit:
Reviewed by Oliver.
- WebKit part of fix for:
<rdar://problem/
5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
<rdar://problem/
5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
The basic approach is to have Frames start out containing an empty document instead of absolutely nothing,
so there is no need to initialize them on demand. Various side effects of that cause both of these bugs.
However, this caused many regressions so I had to fix the fallout.
* WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::takeFocus): Avoid focus cycle problems (can happen in DumpRenderTree
with initial empty document now).
* WebCoreSupport/WebFrameBridge.mm:
(-[WebFrameBridge finishInitializingWithPage:frameName:frameView:ownerElement:]): init the frame.
(-[WebFrameBridge determineObjectFromMIMEType:URL:]): return image type when appropriate
* WebView/WebFrame.mm:
(-[WebFrame stopLoading]): use stopForUserCancel().
* WebView/WebFrameView.mm:
(-[WebFrameView _makeDocumentViewForDataSource:]): assume html when no mime type available.
* WebView/WebView.mm:
(-[WebView becomeFirstResponder]): Track whether we are becoming first responder from
outside the view.
(-[WebView _becomingFirstResponderFromOutside]): Return this value.
* WebView/WebViewInternal.h:
WebKitTools:
Reviewed by Oliver.
- don't clear events whenever an EventSendingController goes away, only do it at predictable times,
since destroying a subframe can make one go away
(Discovered while fixing:
<rdar://problem/
5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
<rdar://problem/
5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
* DumpRenderTree/DumpRenderTree.m:
(runTest): explicitly clear saved events after every page load
* DumpRenderTree/EventSendingController.h:
* DumpRenderTree/EventSendingController.m:
(-[EventSendingController dealloc]): don't clear saved events here...
(+[EventSendingController clearSavedEvents]): do it here
* Scripts/check-for-global-initializers:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@21367
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2007-05-08 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Oliver.
+
+ - new test case for:
+ <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
+ <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
+
+ (The test case covers both scenarios.)
+
+ * http/tests/misc/frame-access-during-load-expected.checksum: Added.
+ * http/tests/misc/frame-access-during-load-expected.png: Added.
+ * http/tests/misc/frame-access-during-load-expected.txt: Added.
+ * http/tests/misc/frame-access-during-load.html: Added.
+
+ - test results beneficially or harmlessly changed as a result of the above fixes
+
+ * css2.1/t0801-c412-hz-box-00-b-a-expected.checksum:
+ * css2.1/t0801-c412-hz-box-00-b-a-expected.png:
+ * css2.1/t0801-c412-hz-box-00-b-a-expected.txt: This reflects an <object> containing
+ an image now creating an image renderer.
+
+ * dom/xhtml/level2/html/HTMLIFrameElement11-expected.txt: This is updated to a slightly
+ less bad failure for access to a frame that's not loaded yet.
+
+ The following test results now reflect the frame removal that the test was testing:
+
+ * fast/dom/clientWidthAfterDocumentIsRemoved-expected.checksum:
+ * fast/dom/clientWidthAfterDocumentIsRemoved-expected.png:
+ * fast/dom/clientWidthAfterDocumentIsRemoved-expected.txt:
+ * fast/dom/replaceChild-expected.checksum:
+ * fast/dom/replaceChild-expected.png:
+ * fast/dom/replaceChild-expected.txt:
+
+ The following tests results now reflect empty document content for iframes that never load anything:
+
+ * fast/events/focusingUnloadedFrame-expected.txt:
+ * tables/mozilla_expected_failures/bugs/bug137388-1-expected.txt:
+ * tables/mozilla_expected_failures/bugs/bug137388-2-expected.txt:
+
2007-05-10 Brady Eidson <beidson@apple.com>
Reviewed by Oliver
-428a9c3ebe2494341b8a6722291ee4a8
\ No newline at end of file
+9c92c10fcd15faf0f6d97fa8263b336b
\ No newline at end of file
layer at (0,0) size 800x600
RenderView at (0,0) size 800x600
-layer at (0,0) size 800x276
- RenderBlock {HTML} at (0,0) size 800x276
- RenderBody {BODY} at (8,16) size 784x244
+layer at (0,0) size 800x166
+ RenderBlock {HTML} at (0,0) size 800x166
+ RenderBody {BODY} at (8,16) size 784x134
RenderBlock {P} at (0,0) size 784x18
RenderText {#text} at (0,0) size 283x18
text run at (0,0) width 283: "The two diagrams below should be identical."
- RenderBlock {DIV} at (0,34) size 784x210
+ RenderBlock {DIV} at (0,34) size 784x100
RenderBlock {P} at (40,0) size 520x40 [color=#0000FF] [bgcolor=#00FFFF] [border: none (40px solid #FF00FF) none (40px solid #FF00FF)]
RenderText {#text} at (80,0) size 360x40
text run at (80,0) width 360: "X X X X X"
- RenderBlock {P} at (0,56) size 784x154
- RenderPartObject {OBJECT} at (0,0) size 300x150
- layer at (0,0) size 600x135
- RenderView at (0,0) size 300x135
- layer at (0,0) size 600x44
- RenderBlock {HTML} at (0,0) size 300x44
- RenderBody {BODY} at (0,0) size 300x44
- RenderImage {IMG} at (0,0) size 600x40
+ RenderBlock {P} at (0,56) size 784x44
+ RenderImage {OBJECT} at (0,0) size 600x40
RenderText {#text} at (0,0) size 0x0
Test http://www.w3.org/2001/DOM-Test-Suite/level2/html/HTMLIFrameElement11
-Status error
-Message TypeError: Undefined value
+Status failure
+Message titleLink: assertEquals failed, actual , expected NIST DOM HTML Test - FRAME.
-b0d65e6d722ae42afd88e73711847b6e
\ No newline at end of file
+8209202c03a1a3c14187d06b28d16299
\ No newline at end of file
RenderView 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
+ RenderBody {BODY} at (8,8) size 784x576
RenderBlock {P} at (0,0) size 784x18
RenderText {#text} at (0,0) size 212x18
text run at (0,0) width 212: "This test passes if it doesn't crash!"
- RenderBlock (anonymous) at (0,34) size 784x154
- RenderPartObject {IFRAME} at (0,0) size 304x154 [border: (2px inset #000000)]
- layer at (0,0) size 300x150
- RenderView at (0,0) size 300x150
- layer at (0,0) size 300x8
- RenderBlock {HTML} at (0,0) size 300x8
- RenderBody {BODY} at (8,8) size 284x0
+ RenderBlock (anonymous) at (0,34) size 784x0
RenderText {#text} at (0,0) size 0x0
RenderText {#text} at (0,0) size 0x0
-ad439a096df9257efc427a8cfa84277e
\ No newline at end of file
+1abdc7e7be0e3914553cf6443452cd2a
\ No newline at end of file
layer at (0,0) size 800x600
RenderView at (0,0) size 800x600
-layer at (0,0) size 800x152
- RenderBlock {HTML} at (0,0) size 800x152
- RenderBody {BODY} at (0,0) size 800x152 [bgcolor=#CCFFCC]
- RenderBlock {DIV} at (0,0) size 800x152
- RenderPartObject {IFRAME} at (0,0) size 152x152 [border: (1px solid #000000)]
- layer at (0,0) size 150x150
- RenderView at (0,0) size 150x150
- layer at (0,0) size 150x52
- RenderBlock {HTML} at (0,0) size 150x52
- RenderBody {BODY} at (8,8) size 134x36
- RenderBlock {DIV} at (0,0) size 134x36
- RenderBlock {DIV} at (0,0) size 134x18
- RenderText {#text} at (0,0) size 33x18
- text run at (0,0) width 33: "test 1"
- RenderBlock {DIV} at (0,18) size 134x18
- RenderText {#text} at (0,0) size 33x18
- text run at (0,0) width 33: "test 2"
+layer at (0,0) size 800x36
+ RenderBlock {HTML} at (0,0) size 800x36
+ RenderBody {BODY} at (0,0) size 800x36 [bgcolor=#CCFFCC]
+ RenderBlock {DIV} at (0,0) size 800x36
+ RenderBlock {DIV} at (0,0) size 800x36
+ RenderBlock {DIV} at (0,0) size 800x18
+ RenderText {#text} at (0,0) size 33x18
+ text run at (0,0) width 33: "test 1"
+ RenderBlock {DIV} at (0,18) size 800x18
+ RenderText {#text} at (0,0) size 33x18
+ text run at (0,0) width 33: "test 2"
RenderText {#text} at (0,0) size 0x0
RenderText {#text} at (0,0) size 0x0
RenderFrame {FRAME} at (0,0) size 0x0
+ layer at (0,0) size 8x8
+ RenderView at (0,0) size 0x0
+ layer at (0,0) size 8x8
+ RenderBlock {HTML} at (0,0) size 0x8
+ RenderBody {BODY} at (8,8) size 0x0
--- /dev/null
+bb3f4fc836407714e9c8a31142489c8c
\ No newline at end of file
--- /dev/null
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x576
+ RenderBlock {P} at (0,0) size 784x36
+ RenderText {#text} at (0,0) size 780x36
+ text run at (0,0) width 134: "This test verifies that "
+ text run at (134,0) width 646: "accessing a frame's document while it is still loading does not prevent the load, but can access at least a"
+ text run at (0,18) width 177: "temporary empty document."
+ RenderBlock (anonymous) at (0,52) size 784x116
+ RenderPartObject {IFRAME} at (0,0) size 300x40
+ layer at (0,0) size 300x40
+ RenderView at (0,0) size 300x40
+ layer at (0,0) size 300x40
+ RenderBlock {HTML} at (0,0) size 300x40
+ RenderBody {BODY} at (8,8) size 284x24
+ RenderText {#text} at (0,0) size 71x18
+ text run at (0,0) width 71: "SUCCESS"
+ RenderText {#text} at (0,0) size 0x0
+ RenderText {#text} at (0,0) size 0x0
+ RenderBR {BR} at (300,40) size 0x0
+ RenderPartObject {IFRAME} at (0,40) size 300x40
+ layer at (0,0) size 300x40
+ RenderView at (0,0) size 300x40
+ layer at (0,0) size 300x40
+ RenderBlock {HTML} at (0,0) size 300x40
+ RenderBody {BODY} at (8,8) size 284x24
+ RenderText {#text} at (0,0) size 71x18
+ text run at (0,0) width 71: "SUCCESS"
+ RenderText {#text} at (0,0) size 0x0
+ RenderText {#text} at (0,0) size 0x0
+ RenderBR {BR} at (300,80) size 0x0
+ RenderText {#text} at (0,80) size 164x18
+ text run at (0,80) width 164: "[object HTMLDocument]"
+ RenderBR {BR} at (164,94) size 0x0
+ RenderText {#text} at (0,98) size 164x18
+ text run at (0,98) width 164: "[object HTMLDocument]"
+ RenderBlock {P} at (0,184) size 784x18
+ RenderText {#text} at (0,0) size 614x18
+ text run at (0,0) width 614: "If this test passes, you should see SUCCESS twice, followed by [object HTMLDocument] twice."
+ RenderText {#text} at (0,0) size 0x0
+ RenderText {#text} at (0,0) size 0x0
--- /dev/null
+<html>
+<body>
+<p>This test verifies that accessing a frame's document while it is still loading does not prevent the load, but can
+access at least a temporary empty document.</p>
+<iframe frameborder=0 height=40 id="frame1" src="resources/success.html"></iframe><br>
+<iframe frameborder=0 height=40 id="frame2" src="resources/success.html"></iframe><br>
+<script>
+document.write(frames[0].document);
+document.write('<br>');
+document.write(document.getElementById("frame2").contentDocument);
+</script>
+<p>If this test passes, you should see SUCCESS twice, followed by [object HTMLDocument] twice.
+
+</body>
+</html>
RenderTableRow {TR} at (0,2) size 310x6
RenderTableCell {TD} at (2,2) size 306x6 [r=0 c=0 rs=1 cs=1]
RenderPartObject {IFRAME} at (1,1) size 308x4 [border: (2px inset #000000)]
+ layer at (0,0) size 289x8
+ RenderView at (0,0) size 289x0
+ layer at (0,0) size 289x8
+ RenderBlock {HTML} at (0,0) size 289x8
+ RenderBody {BODY} at (8,8) size 273x0
RenderText {#text} at (0,0) size 0x0
RenderTableRow {TR} at (0,2) size 310x306
RenderTableCell {TD} at (2,2) size 306x306 [r=0 c=0 rs=1 cs=1]
RenderPartObject {IFRAME} at (1,1) size 308x304 [border: (2px inset #000000)]
+ layer at (0,0) size 304x300
+ RenderView at (0,0) size 304x300
+ layer at (0,0) size 304x300
+ RenderBlock {HTML} at (0,0) size 304x300
+ RenderBody {BODY} at (8,8) size 288x284
RenderText {#text} at (0,0) size 0x0
RenderTable {TABLE} at (0,310) size 606x306
RenderTableSection {TBODY} at (0,0) size 606x306
RenderTableRow {TR} at (0,2) size 310x6
RenderTableCell {TD} at (2,2) size 306x6 [r=0 c=0 rs=1 cs=1]
RenderPartObject {IFRAME} at (1,1) size 308x4 [border: (2px inset #000000)]
+ layer at (0,0) size 289x8
+ RenderView at (0,0) size 289x0
+ layer at (0,0) size 289x8
+ RenderBlock {HTML} at (0,0) size 289x8
+ RenderBody {BODY} at (8,8) size 273x0
RenderText {#text} at (0,0) size 0x0
RenderTable {TABLE} at (0,626) size 606x6
RenderTableSection {TBODY} at (0,0) size 606x6
+2007-05-10 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Oliver.
+
+ - WebCore part of fix for:
+ <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
+ <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
+
+ The basic approach is to have Frames start out containing an empty document instead of absolutely nothing,
+ so there is no need to initialize them on demand. Various side effects of that cause both of these bugs.
+
+ However, this caused many regressions so I had to fix the fallout.
+
+ * WebCore.exp: fix symbol exports
+ * bindings/js/kjs_window.cpp:
+ (KJS::createNewWindow): useless "created" bool (we don't need it here)
+ (KJS::WindowFunc::callAsFunction): detect if we created a new frame, because if so,
+ we need to initialize the domain (can't count on it not having a document), also
+ don't try to make a new document for it.
+ Also, stop properly.
+ * css/cssstyleselector.cpp:
+ (WebCore::CSSStyleSelector::CSSStyleSelector): don't count on document having a view here
+ * html/HTMLObjectElement.cpp:
+ (WebCore::HTMLObjectElement::isImageType): Ask client, to match how other <object> renderer
+ decisions are made.
+ * loader/FrameLoader.cpp:
+ (WebCore::FrameLoader::FrameLoader): Initialize new data members
+ (WebCore::FrameLoader::init): Do the slightly tricky sequence of steps to properly make
+ an empty document with everything hooked up.
+ (WebCore::FrameLoader::createWindow): Added "created" bool.
+ (WebCore::FrameLoader::stopLoading): (whitespace change)
+ (WebCore::FrameLoader::begin): Don't try to create an empty document.
+ (WebCore::FrameLoader::finishedParsing): If creating an initial empty document, don't
+ do any of this work.
+ (WebCore::FrameLoader::checkCompleted): Do checkLoadComplete() as well.
+ (WebCore::FrameLoader::baseURL): don't check for null document
+ (WebCore::FrameLoader::baseTarget): ditto
+ (WebCore::FrameLoader::completeURL): ditto
+ (WebCore::FrameLoader::didTellBridgeAboutLoad): ditto
+ (WebCore::FrameLoader::scheduleLocationChange): determine duringLoad differently; doc won't
+ be null.
+ (WebCore::FrameLoader::gotoAnchor): don't check for null document
+ (WebCore::FrameLoader::canTarget): don't check for null document
+ (WebCore::FrameLoader::stopForUserCancel): new method for explicit stops like window.stop().
+ (WebCore::FrameLoader::transitionToCommitted): check for pre-loaded state properly
+ (WebCore::FrameLoader::createEmptyDocument): removed
+ (WebCore::FrameLoader::checkLoadCompleteForThisFrame): don't send delegate callbacks when making initial
+ doc.
+ (WebCore::FrameLoader::tokenizerProcessedData): Assume document; just checkCompleted now that it
+ does checkLoadComplete.
+ (WebCore::FrameLoader::receivedMainResourceError): assume document
+ (WebCore::FrameLoader::saveDocumentState): Assume there's a document except during initial load
+ (WebCore::FrameLoader::mainReceivedCompleteError): do checkCompleted, not checkLoadComplete
+ (WebCore::FrameLoader::continueLoadWithData): assume document
+ * loader/FrameLoader.h:
+ * loader/MainResourceLoader.cpp:
+ (WebCore::MainResourceLoader::receivedError): Add more ref protection and do things in a slightly
+ different order.
+ * page/DOMWindow.cpp:
+ (WebCore::DOMWindow::document): don't force document creation, just assert there is one.
+ * page/Frame.cpp:
+ (WebCore::Frame::init): Added init method.
+ (WebCore::Frame::pageDestroyed): when a frame is removed, make sure to check if the parent is
+ done loading.
+ * page/Frame.h:
+ * page/mac/WebCoreFrameBridge.mm:
+ (-[WebCoreFrameBridge stringByEvaluatingJavaScriptFromString:forceUserGesture:]): No need to force
+ document.
+ (-[WebCoreFrameBridge aeDescByEvaluatingJavaScriptFromString:]): ditto
+ * platform/graphics/svg/SVGImage.cpp:
+ (WebCore::SVGImage::dataChanged): init the frame
+ * rendering/RenderPart.cpp:
+ (WebCore::RenderPart::updateWidgetPosition): If a subframe needs layout, then lay it out even
+ if the bounds did not change; the content size might be wrong.
+ * rendering/RenderTreeAsText.cpp:
+ (WebCore::externalRepresentation): Don't crash if the frame lacks a view.
+
2007-05-10 David Hyatt <hyatt@apple.com>
Fix for:
__ZN7WebCore11FrameLoader14scrollToAnchorERKNS_4KURLE
__ZN7WebCore11FrameLoader14stopAllLoadersEv
__ZN7WebCore11FrameLoader16detachFromParentEv
+__ZN7WebCore11FrameLoader17stopForUserCancelEv
__ZN7WebCore11FrameLoader18currentHistoryItemEv
__ZN7WebCore11FrameLoader18shouldHideReferrerERKNS_4KURLERKNS_6StringE
__ZN7WebCore11FrameLoader20continueLoadWithDataEPNS_12SharedBufferERKNS_6StringES5_RKNS_4KURLE
__ZN7WebCore5Frame20windowScriptNPObjectEv
__ZN7WebCore5Frame21setProhibitsScrollingEb
__ZN7WebCore5Frame26dashboardRegionsDictionaryEv
+__ZN7WebCore5Frame4initEv
__ZN7WebCore5Frame9setBridgeEP18WebCoreFrameBridge
__ZN7WebCore5FrameC1EPNS_4PageEPNS_21HTMLFrameOwnerElementEPNS_17FrameLoaderClientE
__ZN7WebCore5Image10getNSImageEv
// do an isSafeScript call using the window we create, which can't be done before creating it.
// We'd have to resolve all those issues to pass the URL instead of "".
- Frame* newFrame = openerFrame->loader()->createWindow(frameRequest, windowFeatures);
+ bool created;
+ Frame* newFrame = openerFrame->loader()->createWindow(frameRequest, windowFeatures, created);
if (!newFrame)
return 0;
// request window (new or existing if framename is set)
frameRequest.resourceRequest().setHTTPReferrer(activeFrame->loader()->outgoingReferrer());
- Frame* newFrame = frame->loader()->createWindow(frameRequest, windowFeatures);
+ bool created;
+ Frame* newFrame = frame->loader()->createWindow(frameRequest, windowFeatures, created);
if (!newFrame)
return jsUndefined();
newFrame->loader()->setOpener(frame);
newFrame->loader()->setOpenedByJavaScript();
-
- if (!newFrame->document()) {
- Document* oldDoc = frame->document();
- if (oldDoc && oldDoc->baseURL() != 0)
- newFrame->loader()->begin(oldDoc->baseURL());
- else
- newFrame->loader()->begin();
- newFrame->loader()->write("<HTML><BODY>");
- newFrame->loader()->end();
- if (oldDoc) {
+
+ if (created) {
+ if (Document* oldDoc = frame->document()) {
newFrame->document()->setDomain(oldDoc->domain(), true);
newFrame->document()->setBaseURL(oldDoc->baseURL());
}
return result;
}
case Window::Stop:
- frame->loader()->stopAllLoaders();
+ frame->loader()->stopForUserCancel();
return jsUndefined();
case Window::Find:
if (!window->isSafeScript(exec))
view = doc->view();
strictParsing = _strictParsing;
- settings = view ? view->frame()->settings() : 0;
+ settings = doc->frame() ? doc->frame()->settings() : 0;
if (!defaultStyle)
loadDefaultStyle();
#include "EventNames.h"
#include "ExceptionCode.h"
#include "Frame.h"
+#include "FrameLoader.h"
+#include "FrameLoaderClient.h"
#include "FrameView.h"
#include "HTMLFormElement.h"
#include "HTMLDocument.h"
m_serviceType = "text/plain"; // Data URLs with no MIME type are considered text/plain.
}
}
-
+ if (document()->frame())
+ return document()->frame()->loader()->client()->objectContentType(KURL(m_url.deprecatedString()), m_serviceType) == ObjectContentImage;
+
return Image::supportsType(m_serviceType);
}
, m_checkCompletedTimer(this, &FrameLoader::checkCompletedTimerFired)
, m_opener(0)
, m_openedByJavaScript(false)
+ , m_creatingInitialEmptyDocument(false)
+ , m_committedFirstRealDocumentLoad(false)
#if USE(LOW_BANDWIDTH_DISPLAY)
, m_useLowBandwidthDisplay(true)
, m_finishedParsingDuringLowBandwidthDisplay(false)
m_client->frameLoaderDestroyed();
}
+void FrameLoader::init()
+{
+ // this somewhat odd set of steps is needed to give the frame an initial empty document
+ m_creatingInitialEmptyDocument = true;
+ setPolicyDocumentLoader(m_client->createDocumentLoader(ResourceRequest(String("")), SubstituteData()).get());
+ setProvisionalDocumentLoader(m_policyDocumentLoader.get());
+ setState(FrameStateProvisional);
+ m_provisionalDocumentLoader->finishedLoading();
+ begin();
+ write("<body>");
+ end();
+ m_frame->document()->cancelParsing();
+ m_creatingInitialEmptyDocument = false;
+ m_wasLoadEventEmitted = true;
+}
+
void FrameLoader::setDefersLoading(bool defers)
{
if (m_documentLoader)
m_client->setDefersLoading(defers);
}
-Frame* FrameLoader::createWindow(const FrameLoadRequest& request, const WindowFeatures& features)
+Frame* FrameLoader::createWindow(const FrameLoadRequest& request, const WindowFeatures& features, bool& created)
{
ASSERT(!features.dialog || request.frameName().isEmpty());
if (!request.resourceRequest().url().isEmpty())
frame->loader()->load(request, true, 0, 0, HashMap<String, String>());
frame->page()->chrome()->focus();
+ created = false;
return frame;
}
page->chrome()->show();
+ created = true;
return frame;
}
{
if (m_frame->document() && m_frame->document()->tokenizer())
m_frame->document()->tokenizer()->stopParsing();
-
+
if (sendUnload) {
if (m_frame->document()) {
if (m_wasLoadEventEmitted && !m_wasUnloadEventEmitted) {
void FrameLoader::begin(const KURL& url)
{
- if (m_workingURL.isEmpty())
- createEmptyDocument(); // Creates an empty document if we don't have one already
-
clear();
partClearedInBegin();
RefPtr<Document> document = DOMImplementation::instance()->createDocument(m_responseMIMEType, m_frame, m_frame->inViewSourceMode());
m_frame->setDocument(document);
+ if (!m_creatingInitialEmptyDocument)
+ m_committedFirstRealDocumentLoad = true;
+
document->setURL(m_URL.url());
// We prefer m_baseURL over m_URL because m_URL changes when we are
// about to load a new page.
void FrameLoader::finishedParsing()
{
+ if (m_creatingInitialEmptyDocument)
+ return;
+
// This can be called from the Frame's destructor, in which case we shouldn't protect ourselves
// because doing so will cause us to re-enter the destructor when protector goes out of scope.
RefPtr<Frame> protector = m_frame->refCount() > 0 ? m_frame : 0;
startRedirectionTimer();
completed();
+ if (m_frame->page())
+ checkLoadComplete();
}
void FrameLoader::checkCompletedTimerFired(Timer<FrameLoader>*)
KURL FrameLoader::baseURL() const
{
- if (!m_frame->document())
- return KURL();
+ ASSERT(m_frame->document());
return m_frame->document()->baseURL();
}
String FrameLoader::baseTarget() const
{
- if (!m_frame->document())
- return String();
+ ASSERT(m_frame->document());
return m_frame->document()->baseTarget();
}
KURL FrameLoader::completeURL(const String& url)
{
- if (!m_frame->document())
- return url.deprecatedString();
+ ASSERT(m_frame->document());
return m_frame->document()->completeURL(url).deprecatedString();
}
// Handle a location change of a page with no document as a special case.
// This may happen when a frame changes the location of another frame.
- bool duringLoad = !m_frame->document();
+ bool duringLoad = !m_committedFirstRealDocumentLoad;
// If a redirect was scheduled during a load, then stop the current load.
// Otherwise when the current load transitions from a provisional to a
// committed state, pending redirects may be cancelled.
- if (duringLoad)
+ if (duringLoad) {
+ if (m_provisionalDocumentLoader)
+ m_provisionalDocumentLoader->stopLoading();
stopLoading(true);
+ }
ScheduledRedirection::Type type = duringLoad
? ScheduledRedirection::locationChangeDuringLoad : ScheduledRedirection::locationChange;
bool FrameLoader::gotoAnchor(const String& name)
{
- if (!m_frame->document())
- return false;
+ ASSERT(m_frame->document());
Node* anchorNode = m_frame->document()->getElementById(AtomicString(name));
if (!anchorNode)
}
}
-void FrameLoader::updateBaseURLForEmptyDocument()
-{
- HTMLFrameOwnerElement* owner = m_frame->ownerElement();
- // FIXME: Should embed be included?
- if (owner && (owner->hasTagName(iframeTag) || owner->hasTagName(objectTag) || owner->hasTagName(embedTag)))
- m_frame->document()->setBaseURL(m_frame->tree()->parent()->document()->baseURL());
-}
-
void FrameLoader::completed()
{
RefPtr<Frame> protect(m_frame);
if (m_frame->page() == target->page())
return true;
- String domain;
- if (Document* document = m_frame->document())
- domain = document->domain();
+ ASSERT(m_frame->document());
+ String domain = m_frame->document()->domain();
// Allow if the request is made from a local file.
if (domain.isEmpty())
return true;
m_inStopAllLoaders = false;
}
+void FrameLoader::stopForUserCancel()
+{
+ stopAllLoaders();
+ if (m_frame->page())
+ checkLoadComplete();
+}
+
void FrameLoader::cancelPendingArchiveLoad(ResourceLoader* loader)
{
m_client->cancelPendingArchiveLoad(loader);
// JavaScript. If the script initiates a new load, we need to abandon the current load,
// or the two will stomp each other.
DocumentLoader* pdl = m_provisionalDocumentLoader.get();
- closeURL();
+ if (m_documentLoader)
+ closeURL();
if (pdl != m_provisionalDocumentLoader)
return;
// Tell the client we've committed this URL.
ASSERT(m_client->hasFrameView());
+
+ if (m_creatingInitialEmptyDocument)
+ return;
+
m_client->dispatchDidCommitLoad();
// If we have a title let the WebView know about it.
&& m_frame->page() && m_frame->page()->backForwardList())
restoreScrollPositionAndViewState();
+ if (m_creatingInitialEmptyDocument)
+ return;
+
const ResourceError& error = dl->mainDocumentError();
if (!error.isNull())
m_client->dispatchDidFailLoad(error);
return m_client->userAgent(url);
}
-void FrameLoader::createEmptyDocument()
-{
- // Although it's not completely clear from the name of this function,
- // it does nothing if we already have a document, and just creates an
- // empty one if we have no document at all.
- if (!m_frame->document()) {
- loadEmptyDocumentSynchronously();
- updateBaseURLForEmptyDocument();
- }
-}
-
void FrameLoader::tokenizerProcessedData()
{
- if (m_frame->document())
- checkCompleted();
- checkLoadComplete();
+ ASSERT(m_frame->page());
+ ASSERT(m_frame->document());
+
+ checkCompleted();
}
void FrameLoader::didTellBridgeAboutLoad(const String& URL)
// We might have made a page cache item, but now we're bailing out due to an error before we ever
// transitioned to the new page (before WebFrameState == commit). The goal here is to restore any state
// so that the existing view (that wenever got far enough to replace) can continue being used.
- Document* document = m_frame->document();
- if (document)
- document->setInPageCache(false);
+ m_frame->document()->setInPageCache(false);
invalidateCurrentItemCachedPage();
// Call clientRedirectCancelledOrFinished here so that the frame load delegate is notified that the redirect's
void FrameLoader::saveDocumentState()
{
+ if (m_creatingInitialEmptyDocument)
+ return;
+
// Do not save doc state if the page has a password field and a form that would be submitted via https.
Document* document = m_frame->document();
- if (document && document->hasPasswordField() && document->hasSecureForm())
+ ASSERT(document);
+ if (document->hasPasswordField() && document->hasSecureForm())
return;
// For a standard page load, we will have a previous item set, which will be used to
{
loader->setPrimaryLoadComplete(true);
m_client->dispatchDidLoadMainResource(activeDocumentLoader());
- checkLoadComplete();
+ checkCompleted();
}
void FrameLoader::mainReceivedError(const ResourceError& error, bool isComplete)
encoding = textEncoding;
setEncoding(encoding, userChosen);
- if (!m_frame->document())
- return;
+ ASSERT(m_frame->document());
addData(buffer->data(), buffer->size());
}
FrameLoader(Frame*, FrameLoaderClient*);
~FrameLoader();
+ void init();
+
Frame* frame() const { return m_frame; }
// FIXME: This is not cool, people.
static bool shouldHideReferrer(const KURL& url, const String& referrer);
- Frame* createWindow(const FrameLoadRequest&, const WindowFeatures&);
+ Frame* createWindow(const FrameLoadRequest&, const WindowFeatures&, bool& created);
void loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data);
// Also not cool.
void stopAllLoaders();
+ void stopForUserCancel();
void cancelPendingArchiveLoad(ResourceLoader*);
bool isLoadingMainResource() const;
Widget* createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>& args);
- void createEmptyDocument();
-
void partClearedInBegin();
void restoreDocumentState();
bool m_openedByJavaScript;
+ bool m_creatingInitialEmptyDocument;
+ bool m_committedFirstRealDocumentLoad;
+
RefPtr<HistoryItem> m_currentHistoryItem;
RefPtr<HistoryItem> m_previousHistoryItem;
RefPtr<HistoryItem> m_provisionalHistoryItem;
{
// Calling receivedMainResourceError will likely result in the last reference to this object to go away.
RefPtr<MainResourceLoader> protect(this);
-
- frameLoader()->receivedMainResourceError(error, true);
+ RefPtr<Frame> protectFrame(m_frame);
if (!cancelled()) {
ASSERT(!reachedTerminalState());
frameLoader()->didFailToLoad(this, error);
+ }
+
+ frameLoader()->receivedMainResourceError(error, true);
+ if (!cancelled()) {
releaseResources();
}
-
+
ASSERT(reachedTerminalState());
}
{
if (!m_frame)
return 0;
-
- if (!m_frame->document()) {
- m_frame->loader()->createEmptyDocument();
- m_frame->loader()->begin();
- m_frame->loader()->write("<HTML><BODY>");
- m_frame->loader()->end();
- }
+
+ ASSERT(m_frame->document());
return m_frame->document();
}
d = 0;
}
+void Frame::init()
+{
+ d->m_loader->init();
+}
+
FrameLoader* Frame::loader() const
{
return d->m_loader;
void Frame::pageDestroyed()
{
+ if (Frame* parent = tree()->parent())
+ parent->loader()->checkLoadComplete();
+
if (d->m_page && d->m_page->focusController()->focusedFrame() == this)
d->m_page->focusController()->setFocusedFrame(0);
virtual void setView(FrameView*);
virtual ~Frame();
+ void init();
+
#if PLATFORM(MAC)
void setBridge(WebCoreFrameBridge*);
WebCoreFrameBridge* bridge() const;
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string forceUserGesture:(BOOL)forceUserGesture
{
- m_frame->loader()->createEmptyDocument();
+ ASSERT(m_frame->document());
JSValue* result = m_frame->loader()->executeScript(0, string, forceUserGesture);
if (!result)
return 0;
- (NSAppleEventDescriptor *)aeDescByEvaluatingJavaScriptFromString:(NSString *)string
{
- m_frame->loader()->createEmptyDocument();
+ ASSERT(m_frame->document());
JSValue* result = m_frame->loader()->executeScript(0, string, true);
if (!result) // FIXME: pass errors
return 0;
// The Cache code does not know about CachedImages holding Frames and won't know to break the cycle.
m_page.set(new Page(dummyChromeClient, dummyContextMenuClient, dummyEditorClient, dummyDragClient));
m_frame = new Frame(m_page.get(), 0, dummyFrameLoaderClient);
+ m_frame->init();
m_frameView = new FrameView(m_frame.get());
m_frameView->deref(); // FIXME: FrameView starts with a refcount of 1
m_frame->setView(m_frameView.get());
width = m_width - borderLeft() - borderRight() - paddingLeft() - paddingRight();
height = m_height - borderTop() - borderBottom() - paddingTop() - paddingBottom();
IntRect newBounds(x,y,width,height);
- if (newBounds != m_widget->frameGeometry()) {
+ bool boundsChanged = newBounds != m_widget->frameGeometry();
+ if (boundsChanged) {
// The widget changed positions. Update the frame geometry.
RenderArena *arena = ref();
element()->ref();
m_widget->setFrameGeometry(newBounds);
element()->deref();
deref(arena);
-
- if (m_widget && m_widget->isFrameView())
- static_cast<FrameView*>(m_widget)->layout();
+ }
+
+ // if the frame bounds got changed, or if view needs layout (possibly indicating
+ // content size is wrong) we have to do a layout to set the right widget size
+ if (m_widget && m_widget->isFrameView()) {
+ FrameView* frameView = static_cast<FrameView*>(m_widget);
+ if (boundsChanged || frameView->needsLayout())
+ frameView->layout();
}
}
#if ENABLE(SVG)
writeRenderResources(ts, o->document());
#endif
- o->view()->frameView()->layout();
+ if (o->view()->frameView())
+ o->view()->frameView()->layout();
RenderLayer* l = o->layer();
if (l) {
writeLayers(ts, l, l, IntRect(l->xPos(), l->yPos(), l->width(), l->height()));
+2007-05-10 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Oliver.
+
+ - WebKit part of fix for:
+ <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
+ <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
+
+ The basic approach is to have Frames start out containing an empty document instead of absolutely nothing,
+ so there is no need to initialize them on demand. Various side effects of that cause both of these bugs.
+
+ However, this caused many regressions so I had to fix the fallout.
+
+ * WebCoreSupport/WebChromeClient.mm:
+ (WebChromeClient::takeFocus): Avoid focus cycle problems (can happen in DumpRenderTree
+ with initial empty document now).
+ * WebCoreSupport/WebFrameBridge.mm:
+ (-[WebFrameBridge finishInitializingWithPage:frameName:frameView:ownerElement:]): init the frame.
+ (-[WebFrameBridge determineObjectFromMIMEType:URL:]): return image type when appropriate
+ * WebView/WebFrame.mm:
+ (-[WebFrame stopLoading]): use stopForUserCancel().
+ * WebView/WebFrameView.mm:
+ (-[WebFrameView _makeDocumentViewForDataSource:]): assume html when no mime type available.
+ * WebView/WebView.mm:
+ (-[WebView becomeFirstResponder]): Track whether we are becoming first responder from
+ outside the view.
+ (-[WebView _becomingFirstResponderFromOutside]): Return this value.
+ * WebView/WebViewInternal.h:
+
2007-05-09 Oliver Hunt <oliver@apple.com>
rs=Adele.
// view of the last view in its key view loop. This makes m_webView
// behave as if it had no subviews, which is the behavior we want.
NSView *lastView = [m_webView _findLastViewInKeyViewLoop];
+ // avoid triggering assertions if the WebView is the only thing in the key loop
+ if ([m_webView _becomingFirstResponderFromOutside] && m_webView == [lastView nextValidKeyView])
+ return;
[[m_webView window] selectKeyViewFollowingView:lastView];
- } else
+ } else {
+ // avoid triggering assertions if the WebView is the only thing in the key loop
+ if ([m_webView _becomingFirstResponderFromOutside] && m_webView == [m_webView previousValidKeyView])
+ return;
[[m_webView window] selectKeyViewPrecedingView:m_webView];
+ }
}
Page* WebChromeClient::createWindow(Frame*, const FrameLoadRequest& request)
m_frame = new Frame(page, ownerElement, new WebFrameLoaderClient(_frame));
m_frame->setBridge(self);
m_frame->tree()->setName(name);
+ m_frame->init();
[self setTextSizeMultiplier:[webView textSizeMultiplier]];
return ObjectElementFrame; // Go ahead and hope that we can display the content.
if (MimeTypeRegistry::isSupportedImageMIMEType(MIMEType))
- return ObjectElementFrame;
+ return ObjectElementImage;
if ([[self webView] _isMIMETypeRegisteredAsPlugin:MIMEType])
return ObjectElementPlugin;
- (void)stopLoading
{
if (FrameLoader* frameLoader = [self _frameLoader])
- frameLoader->stopAllLoaders();
+ frameLoader->stopForUserCancel();
}
- (void)reload
}
-(NSView <WebDocumentView> *)_makeDocumentViewForDataSource:(WebDataSource *)dataSource
-{
- Class viewClass = [[self class] _viewClassForMIMEType:[[dataSource response] MIMEType]];
+{
+ NSString* MIMEType = [[dataSource response] MIMEType];
+ if (!MIMEType)
+ MIMEType = @"text/html";
+ Class viewClass = [[self class] _viewClassForMIMEType:MIMEType];
NSView <WebDocumentView> *documentView;
if (viewClass) {
// If the dataSource's representation has already been created, and it is also the
- (BOOL)_shouldAutoscrollForDraggingInfo:(id)dragInfo;
@end
+@interface NSWindow (AppKitSecretsIKnow)
+- (id)_oldFirstResponderBeforeBecoming;
+@end
+
@interface NSObject (ValidateWithoutDelegate)
- (BOOL)validateUserInterfaceItemWithoutDelegate:(id <NSValidatedUserInterfaceItem>)item;
@end
BOOL editable;
BOOL tabKeyCyclesThroughElementsChanged;
BOOL becomingFirstResponder;
+ BOOL becomingFirstResponderFromOutside;
BOOL hoverFeedbackSuspended;
NSColor *backgroundColor;
// WebFrameView has very similar code.
NSWindow *window = [self window];
WebFrameView *mainFrameView = [[self mainFrame] frameView];
+
+ NSResponder *previousFirstResponder = [[self window] _oldFirstResponderBeforeBecoming];
+ BOOL fromOutside = ![previousFirstResponder isKindOfClass:[NSView class]] || (![(NSView *)previousFirstResponder isDescendantOf:self] && previousFirstResponder != self);
if ([window keyViewSelectionDirection] == NSSelectingPrevious) {
NSView *previousValidKeyView = [self previousValidKeyView];
if ((previousValidKeyView != self) && (previousValidKeyView != mainFrameView)) {
_private->becomingFirstResponder = YES;
+ _private->becomingFirstResponderFromOutside = fromOutside;
[window makeFirstResponder:previousValidKeyView];
+ _private->becomingFirstResponderFromOutside = NO;
_private->becomingFirstResponder = NO;
return YES;
} else {
if ([mainFrameView acceptsFirstResponder]) {
_private->becomingFirstResponder = YES;
+ _private->becomingFirstResponderFromOutside = fromOutside;
[window makeFirstResponder:mainFrameView];
+ _private->becomingFirstResponderFromOutside = NO;
_private->becomingFirstResponder = NO;
return YES;
}
@implementation WebView (WebViewInternal)
+- (BOOL)_becomingFirstResponderFromOutside
+{
+ return _private->becomingFirstResponderFromOutside;
+}
+
- (NSString *)_userVisibleBundleVersionFromFullVersion:(NSString *)fullVersion
{
// If the version is 4 digits long or longer, then the first digit represents
- (void)_addObject:(id)object forIdentifier:(unsigned long)identifier;
- (id)_objectForIdentifier:(unsigned long)identifier;
- (void)_removeObjectForIdentifier:(unsigned long)identifier;
+- (BOOL)_becomingFirstResponderFromOutside;
@end
+2007-05-08 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Oliver.
+
+ - don't clear events whenever an EventSendingController goes away, only do it at predictable times,
+ since destroying a subframe can make one go away
+
+ (Discovered while fixing:
+
+ <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load)
+ <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465)
+
+ * DumpRenderTree/DumpRenderTree.m:
+ (runTest): explicitly clear saved events after every page load
+ * DumpRenderTree/EventSendingController.h:
+ * DumpRenderTree/EventSendingController.m:
+ (-[EventSendingController dealloc]): don't clear saved events here...
+ (+[EventSendingController clearSavedEvents]): do it here
+ * Scripts/check-for-global-initializers:
+
2007-05-10 Mark Rowe <mrowe@apple.com>
Build fix for DumpRenderTree. Enable Objective-C exceptions in Release configuration.
[pool release];
}
pool = [[NSAutoreleasePool alloc] init];
+ [EventSendingController clearSavedEvents];
[[frame webView] setSelectedDOMRange:nil affinity:NSSelectionAffinityDownstream];
if (closeRemainingWindowsWhenComplete) {
+ (void)saveEvent:(NSInvocation *)event;
+ (void)replaySavedEvents;
++ (void)clearSavedEvents;
- (void)enableDOMUIEventLogging:(WebScriptObject *)node;
- (void)dealloc
{
- [savedMouseEvents release];
- savedMouseEvents = nil;
[super dealloc];
}
replayingSavedEvents = NO;
}
++ (void)clearSavedEvents
+{
+ [savedMouseEvents release];
+ savedMouseEvents = nil;
+}
+
- (void)keyDown:(NSString *)character withModifiers:(WebScriptObject *)modifiers
{
NSString *modifier = nil;
my $shortName = $file;
$shortName =~ s/.*\///;
+ next if $shortName eq "array_object.o";
+
# Special cases for files that have initializers in debug builds.
if ($configuration eq "Debug") {
if ($target eq "JavaScriptCore") {