Changeset 21367 in webkit
- Timestamp:
- May 10, 2007, 5:31:42 AM (18 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 41 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r21359 r21367 1 2007-05-08 Maciej Stachowiak <mjs@apple.com> 2 3 Reviewed by Oliver. 4 5 - new test case for: 6 <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load) 7 <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465) 8 9 (The test case covers both scenarios.) 10 11 * http/tests/misc/frame-access-during-load-expected.checksum: Added. 12 * http/tests/misc/frame-access-during-load-expected.png: Added. 13 * http/tests/misc/frame-access-during-load-expected.txt: Added. 14 * http/tests/misc/frame-access-during-load.html: Added. 15 16 - test results beneficially or harmlessly changed as a result of the above fixes 17 18 * css2.1/t0801-c412-hz-box-00-b-a-expected.checksum: 19 * css2.1/t0801-c412-hz-box-00-b-a-expected.png: 20 * css2.1/t0801-c412-hz-box-00-b-a-expected.txt: This reflects an <object> containing 21 an image now creating an image renderer. 22 23 * dom/xhtml/level2/html/HTMLIFrameElement11-expected.txt: This is updated to a slightly 24 less bad failure for access to a frame that's not loaded yet. 25 26 The following test results now reflect the frame removal that the test was testing: 27 28 * fast/dom/clientWidthAfterDocumentIsRemoved-expected.checksum: 29 * fast/dom/clientWidthAfterDocumentIsRemoved-expected.png: 30 * fast/dom/clientWidthAfterDocumentIsRemoved-expected.txt: 31 * fast/dom/replaceChild-expected.checksum: 32 * fast/dom/replaceChild-expected.png: 33 * fast/dom/replaceChild-expected.txt: 34 35 The following tests results now reflect empty document content for iframes that never load anything: 36 37 * fast/events/focusingUnloadedFrame-expected.txt: 38 * tables/mozilla_expected_failures/bugs/bug137388-1-expected.txt: 39 * tables/mozilla_expected_failures/bugs/bug137388-2-expected.txt: 40 1 41 2007-05-10 Brady Eidson <beidson@apple.com> 2 42 -
trunk/LayoutTests/css2.1/t0801-c412-hz-box-00-b-a-expected.checksum
r14231 r21367 1 428a9c3ebe2494341b8a6722291ee4a8 1 9c92c10fcd15faf0f6d97fa8263b336b -
trunk/LayoutTests/css2.1/t0801-c412-hz-box-00-b-a-expected.txt
r14684 r21367 1 1 layer at (0,0) size 800x600 2 2 RenderView at (0,0) size 800x600 3 layer at (0,0) size 800x 2764 RenderBlock {HTML} at (0,0) size 800x 2765 RenderBody {BODY} at (8,16) size 784x 2443 layer at (0,0) size 800x166 4 RenderBlock {HTML} at (0,0) size 800x166 5 RenderBody {BODY} at (8,16) size 784x134 6 6 RenderBlock {P} at (0,0) size 784x18 7 7 RenderText {#text} at (0,0) size 283x18 8 8 text run at (0,0) width 283: "The two diagrams below should be identical." 9 RenderBlock {DIV} at (0,34) size 784x 2109 RenderBlock {DIV} at (0,34) size 784x100 10 10 RenderBlock {P} at (40,0) size 520x40 [color=#0000FF] [bgcolor=#00FFFF] [border: none (40px solid #FF00FF) none (40px solid #FF00FF)] 11 11 RenderText {#text} at (80,0) size 360x40 12 12 text run at (80,0) width 360: "X X X X X" 13 RenderBlock {P} at (0,56) size 784x154 14 RenderPartObject {OBJECT} at (0,0) size 300x150 15 layer at (0,0) size 600x135 16 RenderView at (0,0) size 300x135 17 layer at (0,0) size 600x44 18 RenderBlock {HTML} at (0,0) size 300x44 19 RenderBody {BODY} at (0,0) size 300x44 20 RenderImage {IMG} at (0,0) size 600x40 13 RenderBlock {P} at (0,56) size 784x44 14 RenderImage {OBJECT} at (0,0) size 600x40 21 15 RenderText {#text} at (0,0) size 0x0 -
trunk/LayoutTests/dom/xhtml/level2/html/HTMLIFrameElement11-expected.txt
r13408 r21367 1 1 Test http://www.w3.org/2001/DOM-Test-Suite/level2/html/HTMLIFrameElement11 2 Status error3 Message TypeError: Undefined value2 Status failure 3 Message titleLink: assertEquals failed, actual , expected NIST DOM HTML Test - FRAME. 4 4 -
trunk/LayoutTests/fast/dom/clientWidthAfterDocumentIsRemoved-expected.checksum
r20277 r21367 1 b0d65e6d722ae42afd88e73711847b6e 1 8209202c03a1a3c14187d06b28d16299 -
trunk/LayoutTests/fast/dom/clientWidthAfterDocumentIsRemoved-expected.txt
r20277 r21367 3 3 layer at (0,0) size 800x600 4 4 RenderBlock {HTML} at (0,0) size 800x600 5 RenderBody {BODY} at (8,8) size 784x5 845 RenderBody {BODY} at (8,8) size 784x576 6 6 RenderBlock {P} at (0,0) size 784x18 7 7 RenderText {#text} at (0,0) size 212x18 8 8 text run at (0,0) width 212: "This test passes if it doesn't crash!" 9 RenderBlock (anonymous) at (0,34) size 784x154 10 RenderPartObject {IFRAME} at (0,0) size 304x154 [border: (2px inset #000000)] 11 layer at (0,0) size 300x150 12 RenderView at (0,0) size 300x150 13 layer at (0,0) size 300x8 14 RenderBlock {HTML} at (0,0) size 300x8 15 RenderBody {BODY} at (8,8) size 284x0 9 RenderBlock (anonymous) at (0,34) size 784x0 16 10 RenderText {#text} at (0,0) size 0x0 17 11 RenderText {#text} at (0,0) size 0x0 -
trunk/LayoutTests/fast/dom/replaceChild-expected.checksum
r20277 r21367 1 ad439a096df9257efc427a8cfa84277e 1 1abdc7e7be0e3914553cf6443452cd2a -
trunk/LayoutTests/fast/dom/replaceChild-expected.txt
r14684 r21367 1 1 layer at (0,0) size 800x600 2 2 RenderView at (0,0) size 800x600 3 layer at (0,0) size 800x152 4 RenderBlock {HTML} at (0,0) size 800x152 5 RenderBody {BODY} at (0,0) size 800x152 [bgcolor=#CCFFCC] 6 RenderBlock {DIV} at (0,0) size 800x152 7 RenderPartObject {IFRAME} at (0,0) size 152x152 [border: (1px solid #000000)] 8 layer at (0,0) size 150x150 9 RenderView at (0,0) size 150x150 10 layer at (0,0) size 150x52 11 RenderBlock {HTML} at (0,0) size 150x52 12 RenderBody {BODY} at (8,8) size 134x36 13 RenderBlock {DIV} at (0,0) size 134x36 14 RenderBlock {DIV} at (0,0) size 134x18 15 RenderText {#text} at (0,0) size 33x18 16 text run at (0,0) width 33: "test 1" 17 RenderBlock {DIV} at (0,18) size 134x18 18 RenderText {#text} at (0,0) size 33x18 19 text run at (0,0) width 33: "test 2" 3 layer at (0,0) size 800x36 4 RenderBlock {HTML} at (0,0) size 800x36 5 RenderBody {BODY} at (0,0) size 800x36 [bgcolor=#CCFFCC] 6 RenderBlock {DIV} at (0,0) size 800x36 7 RenderBlock {DIV} at (0,0) size 800x36 8 RenderBlock {DIV} at (0,0) size 800x18 9 RenderText {#text} at (0,0) size 33x18 10 text run at (0,0) width 33: "test 1" 11 RenderBlock {DIV} at (0,18) size 800x18 12 RenderText {#text} at (0,0) size 33x18 13 text run at (0,0) width 33: "test 2" -
trunk/LayoutTests/fast/events/focusingUnloadedFrame-expected.txt
r20279 r21367 22 22 RenderText {#text} at (0,0) size 0x0 23 23 RenderFrame {FRAME} at (0,0) size 0x0 24 layer at (0,0) size 8x8 25 RenderView at (0,0) size 0x0 26 layer at (0,0) size 8x8 27 RenderBlock {HTML} at (0,0) size 0x8 28 RenderBody {BODY} at (8,8) size 0x0 -
trunk/LayoutTests/tables/mozilla_expected_failures/bugs/bug137388-1-expected.txt
r20957 r21367 9 9 RenderTableCell {TD} at (2,2) size 306x6 [r=0 c=0 rs=1 cs=1] 10 10 RenderPartObject {IFRAME} at (1,1) size 308x4 [border: (2px inset #000000)] 11 layer at (0,0) size 289x8 12 RenderView at (0,0) size 289x0 13 layer at (0,0) size 289x8 14 RenderBlock {HTML} at (0,0) size 289x8 15 RenderBody {BODY} at (8,8) size 273x0 11 16 RenderText {#text} at (0,0) size 0x0 -
trunk/LayoutTests/tables/mozilla_expected_failures/bugs/bug137388-2-expected.txt
r20957 r21367 9 9 RenderTableCell {TD} at (2,2) size 306x306 [r=0 c=0 rs=1 cs=1] 10 10 RenderPartObject {IFRAME} at (1,1) size 308x304 [border: (2px inset #000000)] 11 layer at (0,0) size 304x300 12 RenderView at (0,0) size 304x300 13 layer at (0,0) size 304x300 14 RenderBlock {HTML} at (0,0) size 304x300 15 RenderBody {BODY} at (8,8) size 288x284 11 16 RenderText {#text} at (0,0) size 0x0 12 17 RenderTable {TABLE} at (0,310) size 606x306 … … 21 26 RenderTableCell {TD} at (2,2) size 306x6 [r=0 c=0 rs=1 cs=1] 22 27 RenderPartObject {IFRAME} at (1,1) size 308x4 [border: (2px inset #000000)] 28 layer at (0,0) size 289x8 29 RenderView at (0,0) size 289x0 30 layer at (0,0) size 289x8 31 RenderBlock {HTML} at (0,0) size 289x8 32 RenderBody {BODY} at (8,8) size 273x0 23 33 RenderText {#text} at (0,0) size 0x0 24 34 RenderTable {TABLE} at (0,626) size 606x6 -
trunk/WebCore/ChangeLog
r21365 r21367 1 2007-05-10 Maciej Stachowiak <mjs@apple.com> 2 3 Reviewed by Oliver. 4 5 - WebCore part of fix for: 6 <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load) 7 <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465) 8 9 The basic approach is to have Frames start out containing an empty document instead of absolutely nothing, 10 so there is no need to initialize them on demand. Various side effects of that cause both of these bugs. 11 12 However, this caused many regressions so I had to fix the fallout. 13 14 * WebCore.exp: fix symbol exports 15 * bindings/js/kjs_window.cpp: 16 (KJS::createNewWindow): useless "created" bool (we don't need it here) 17 (KJS::WindowFunc::callAsFunction): detect if we created a new frame, because if so, 18 we need to initialize the domain (can't count on it not having a document), also 19 don't try to make a new document for it. 20 Also, stop properly. 21 * css/cssstyleselector.cpp: 22 (WebCore::CSSStyleSelector::CSSStyleSelector): don't count on document having a view here 23 * html/HTMLObjectElement.cpp: 24 (WebCore::HTMLObjectElement::isImageType): Ask client, to match how other <object> renderer 25 decisions are made. 26 * loader/FrameLoader.cpp: 27 (WebCore::FrameLoader::FrameLoader): Initialize new data members 28 (WebCore::FrameLoader::init): Do the slightly tricky sequence of steps to properly make 29 an empty document with everything hooked up. 30 (WebCore::FrameLoader::createWindow): Added "created" bool. 31 (WebCore::FrameLoader::stopLoading): (whitespace change) 32 (WebCore::FrameLoader::begin): Don't try to create an empty document. 33 (WebCore::FrameLoader::finishedParsing): If creating an initial empty document, don't 34 do any of this work. 35 (WebCore::FrameLoader::checkCompleted): Do checkLoadComplete() as well. 36 (WebCore::FrameLoader::baseURL): don't check for null document 37 (WebCore::FrameLoader::baseTarget): ditto 38 (WebCore::FrameLoader::completeURL): ditto 39 (WebCore::FrameLoader::didTellBridgeAboutLoad): ditto 40 (WebCore::FrameLoader::scheduleLocationChange): determine duringLoad differently; doc won't 41 be null. 42 (WebCore::FrameLoader::gotoAnchor): don't check for null document 43 (WebCore::FrameLoader::canTarget): don't check for null document 44 (WebCore::FrameLoader::stopForUserCancel): new method for explicit stops like window.stop(). 45 (WebCore::FrameLoader::transitionToCommitted): check for pre-loaded state properly 46 (WebCore::FrameLoader::createEmptyDocument): removed 47 (WebCore::FrameLoader::checkLoadCompleteForThisFrame): don't send delegate callbacks when making initial 48 doc. 49 (WebCore::FrameLoader::tokenizerProcessedData): Assume document; just checkCompleted now that it 50 does checkLoadComplete. 51 (WebCore::FrameLoader::receivedMainResourceError): assume document 52 (WebCore::FrameLoader::saveDocumentState): Assume there's a document except during initial load 53 (WebCore::FrameLoader::mainReceivedCompleteError): do checkCompleted, not checkLoadComplete 54 (WebCore::FrameLoader::continueLoadWithData): assume document 55 * loader/FrameLoader.h: 56 * loader/MainResourceLoader.cpp: 57 (WebCore::MainResourceLoader::receivedError): Add more ref protection and do things in a slightly 58 different order. 59 * page/DOMWindow.cpp: 60 (WebCore::DOMWindow::document): don't force document creation, just assert there is one. 61 * page/Frame.cpp: 62 (WebCore::Frame::init): Added init method. 63 (WebCore::Frame::pageDestroyed): when a frame is removed, make sure to check if the parent is 64 done loading. 65 * page/Frame.h: 66 * page/mac/WebCoreFrameBridge.mm: 67 (-[WebCoreFrameBridge stringByEvaluatingJavaScriptFromString:forceUserGesture:]): No need to force 68 document. 69 (-[WebCoreFrameBridge aeDescByEvaluatingJavaScriptFromString:]): ditto 70 * platform/graphics/svg/SVGImage.cpp: 71 (WebCore::SVGImage::dataChanged): init the frame 72 * rendering/RenderPart.cpp: 73 (WebCore::RenderPart::updateWidgetPosition): If a subframe needs layout, then lay it out even 74 if the bounds did not change; the content size might be wrong. 75 * rendering/RenderTreeAsText.cpp: 76 (WebCore::externalRepresentation): Don't crash if the frame lacks a view. 77 1 78 2007-05-10 David Hyatt <hyatt@apple.com> 2 79 -
trunk/WebCore/WebCore.exp
r21307 r21367 146 146 __ZN7WebCore11FrameLoader14stopAllLoadersEv 147 147 __ZN7WebCore11FrameLoader16detachFromParentEv 148 __ZN7WebCore11FrameLoader17stopForUserCancelEv 148 149 __ZN7WebCore11FrameLoader18currentHistoryItemEv 149 150 __ZN7WebCore11FrameLoader18shouldHideReferrerERKNS_4KURLERKNS_6StringE … … 360 361 __ZN7WebCore5Frame21setProhibitsScrollingEb 361 362 __ZN7WebCore5Frame26dashboardRegionsDictionaryEv 363 __ZN7WebCore5Frame4initEv 362 364 __ZN7WebCore5Frame9setBridgeEP18WebCoreFrameBridge 363 365 __ZN7WebCore5FrameC1EPNS_4PageEPNS_21HTMLFrameOwnerElementEPNS_17FrameLoaderClientE -
trunk/WebCore/bindings/js/kjs_window.cpp
r21014 r21367 612 612 // We'd have to resolve all those issues to pass the URL instead of "". 613 613 614 Frame* newFrame = openerFrame->loader()->createWindow(frameRequest, windowFeatures); 614 bool created; 615 Frame* newFrame = openerFrame->loader()->createWindow(frameRequest, windowFeatures, created); 615 616 if (!newFrame) 616 617 return 0; … … 1691 1692 // request window (new or existing if framename is set) 1692 1693 frameRequest.resourceRequest().setHTTPReferrer(activeFrame->loader()->outgoingReferrer()); 1693 Frame* newFrame = frame->loader()->createWindow(frameRequest, windowFeatures); 1694 bool created; 1695 Frame* newFrame = frame->loader()->createWindow(frameRequest, windowFeatures, created); 1694 1696 if (!newFrame) 1695 1697 return jsUndefined(); 1696 1698 newFrame->loader()->setOpener(frame); 1697 1699 newFrame->loader()->setOpenedByJavaScript(); 1698 1699 if (!newFrame->document()) { 1700 Document* oldDoc = frame->document(); 1701 if (oldDoc && oldDoc->baseURL() != 0) 1702 newFrame->loader()->begin(oldDoc->baseURL()); 1703 else 1704 newFrame->loader()->begin(); 1705 newFrame->loader()->write("<HTML><BODY>"); 1706 newFrame->loader()->end(); 1707 if (oldDoc) { 1700 1701 if (created) { 1702 if (Document* oldDoc = frame->document()) { 1708 1703 newFrame->document()->setDomain(oldDoc->domain(), true); 1709 1704 newFrame->document()->setBaseURL(oldDoc->baseURL()); … … 1864 1859 } 1865 1860 case Window::Stop: 1866 frame->loader()->stop AllLoaders();1861 frame->loader()->stopForUserCancel(); 1867 1862 return jsUndefined(); 1868 1863 case Window::Find: -
trunk/WebCore/css/cssstyleselector.cpp
r21328 r21367 226 226 view = doc->view(); 227 227 strictParsing = _strictParsing; 228 settings = view ? view->frame()->settings() : 0;228 settings = doc->frame() ? doc->frame()->settings() : 0; 229 229 if (!defaultStyle) 230 230 loadDefaultStyle(); -
trunk/WebCore/html/HTMLObjectElement.cpp
r21359 r21367 29 29 #include "ExceptionCode.h" 30 30 #include "Frame.h" 31 #include "FrameLoader.h" 32 #include "FrameLoaderClient.h" 31 33 #include "FrameView.h" 32 34 #include "HTMLFormElement.h" … … 295 297 } 296 298 } 297 299 if (document()->frame()) 300 return document()->frame()->loader()->client()->objectContentType(KURL(m_url.deprecatedString()), m_serviceType) == ObjectContentImage; 301 298 302 return Image::supportsType(m_serviceType); 299 303 } -
trunk/WebCore/loader/FrameLoader.cpp
r21261 r21367 231 231 , m_opener(0) 232 232 , m_openedByJavaScript(false) 233 , m_creatingInitialEmptyDocument(false) 234 , m_committedFirstRealDocumentLoad(false) 233 235 #if USE(LOW_BANDWIDTH_DISPLAY) 234 236 , m_useLowBandwidthDisplay(true) … … 248 250 249 251 m_client->frameLoaderDestroyed(); 252 } 253 254 void FrameLoader::init() 255 { 256 // this somewhat odd set of steps is needed to give the frame an initial empty document 257 m_creatingInitialEmptyDocument = true; 258 setPolicyDocumentLoader(m_client->createDocumentLoader(ResourceRequest(String("")), SubstituteData()).get()); 259 setProvisionalDocumentLoader(m_policyDocumentLoader.get()); 260 setState(FrameStateProvisional); 261 m_provisionalDocumentLoader->finishedLoading(); 262 begin(); 263 write("<body>"); 264 end(); 265 m_frame->document()->cancelParsing(); 266 m_creatingInitialEmptyDocument = false; 267 m_wasLoadEventEmitted = true; 250 268 } 251 269 … … 261 279 } 262 280 263 Frame* FrameLoader::createWindow(const FrameLoadRequest& request, const WindowFeatures& features )281 Frame* FrameLoader::createWindow(const FrameLoadRequest& request, const WindowFeatures& features, bool& created) 264 282 { 265 283 ASSERT(!features.dialog || request.frameName().isEmpty()); … … 270 288 frame->loader()->load(request, true, 0, 0, HashMap<String, String>()); 271 289 frame->page()->chrome()->focus(); 290 created = false; 272 291 return frame; 273 292 } … … 313 332 page->chrome()->show(); 314 333 334 created = true; 315 335 return frame; 316 336 } … … 533 553 if (m_frame->document() && m_frame->document()->tokenizer()) 534 554 m_frame->document()->tokenizer()->stopParsing(); 535 555 536 556 if (sendUnload) { 537 557 if (m_frame->document()) { … … 818 838 void FrameLoader::begin(const KURL& url) 819 839 { 820 if (m_workingURL.isEmpty())821 createEmptyDocument(); // Creates an empty document if we don't have one already822 823 840 clear(); 824 841 partClearedInBegin(); … … 842 859 RefPtr<Document> document = DOMImplementation::instance()->createDocument(m_responseMIMEType, m_frame, m_frame->inViewSourceMode()); 843 860 m_frame->setDocument(document); 861 862 if (!m_creatingInitialEmptyDocument) 863 m_committedFirstRealDocumentLoad = true; 844 864 845 865 document->setURL(m_URL.url()); … … 1088 1108 void FrameLoader::finishedParsing() 1089 1109 { 1110 if (m_creatingInitialEmptyDocument) 1111 return; 1112 1090 1113 // This can be called from the Frame's destructor, in which case we shouldn't protect ourselves 1091 1114 // because doing so will cause us to re-enter the destructor when protector goes out of scope. … … 1150 1173 1151 1174 completed(); 1175 if (m_frame->page()) 1176 checkLoadComplete(); 1152 1177 } 1153 1178 … … 1190 1215 KURL FrameLoader::baseURL() const 1191 1216 { 1192 if (!m_frame->document()) 1193 return KURL(); 1217 ASSERT(m_frame->document()); 1194 1218 return m_frame->document()->baseURL(); 1195 1219 } … … 1197 1221 String FrameLoader::baseTarget() const 1198 1222 { 1199 if (!m_frame->document()) 1200 return String(); 1223 ASSERT(m_frame->document()); 1201 1224 return m_frame->document()->baseTarget(); 1202 1225 } … … 1204 1227 KURL FrameLoader::completeURL(const String& url) 1205 1228 { 1206 if (!m_frame->document()) 1207 return url.deprecatedString(); 1229 ASSERT(m_frame->document()); 1208 1230 return m_frame->document()->completeURL(url).deprecatedString(); 1209 1231 } … … 1232 1254 // Handle a location change of a page with no document as a special case. 1233 1255 // This may happen when a frame changes the location of another frame. 1234 bool duringLoad = !m_ frame->document();1256 bool duringLoad = !m_committedFirstRealDocumentLoad; 1235 1257 1236 1258 // If a redirect was scheduled during a load, then stop the current load. 1237 1259 // Otherwise when the current load transitions from a provisional to a 1238 1260 // committed state, pending redirects may be cancelled. 1239 if (duringLoad) 1261 if (duringLoad) { 1262 if (m_provisionalDocumentLoader) 1263 m_provisionalDocumentLoader->stopLoading(); 1240 1264 stopLoading(true); 1265 } 1241 1266 1242 1267 ScheduledRedirection::Type type = duringLoad … … 1362 1387 bool FrameLoader::gotoAnchor(const String& name) 1363 1388 { 1364 if (!m_frame->document()) 1365 return false; 1389 ASSERT(m_frame->document()); 1366 1390 1367 1391 Node* anchorNode = m_frame->document()->getElementById(AtomicString(name)); … … 1717 1741 ASSERT_NOT_REACHED(); 1718 1742 } 1719 }1720 1721 void FrameLoader::updateBaseURLForEmptyDocument()1722 {1723 HTMLFrameOwnerElement* owner = m_frame->ownerElement();1724 // FIXME: Should embed be included?1725 if (owner && (owner->hasTagName(iframeTag) || owner->hasTagName(objectTag) || owner->hasTagName(embedTag)))1726 m_frame->document()->setBaseURL(m_frame->tree()->parent()->document()->baseURL());1727 1743 } 1728 1744 … … 2171 2187 return true; 2172 2188 2173 String domain; 2174 if (Document* document = m_frame->document()) 2175 domain = document->domain(); 2189 ASSERT(m_frame->document()); 2190 String domain = m_frame->document()->domain(); 2176 2191 // Allow if the request is made from a local file. 2177 2192 if (domain.isEmpty()) … … 2215 2230 2216 2231 m_inStopAllLoaders = false; 2232 } 2233 2234 void FrameLoader::stopForUserCancel() 2235 { 2236 stopAllLoaders(); 2237 if (m_frame->page()) 2238 checkLoadComplete(); 2217 2239 } 2218 2240 … … 2379 2401 // or the two will stomp each other. 2380 2402 DocumentLoader* pdl = m_provisionalDocumentLoader.get(); 2381 closeURL(); 2403 if (m_documentLoader) 2404 closeURL(); 2382 2405 if (pdl != m_provisionalDocumentLoader) 2383 2406 return; … … 2444 2467 // Tell the client we've committed this URL. 2445 2468 ASSERT(m_client->hasFrameView()); 2469 2470 if (m_creatingInitialEmptyDocument) 2471 return; 2472 2446 2473 m_client->dispatchDidCommitLoad(); 2447 2474 … … 2748 2775 && m_frame->page() && m_frame->page()->backForwardList()) 2749 2776 restoreScrollPositionAndViewState(); 2777 2778 if (m_creatingInitialEmptyDocument) 2779 return; 2750 2780 2751 2781 const ResourceError& error = dl->mainDocumentError(); … … 2916 2946 } 2917 2947 2918 void FrameLoader::createEmptyDocument()2919 {2920 // Although it's not completely clear from the name of this function,2921 // it does nothing if we already have a document, and just creates an2922 // empty one if we have no document at all.2923 if (!m_frame->document()) {2924 loadEmptyDocumentSynchronously();2925 updateBaseURLForEmptyDocument();2926 }2927 }2928 2929 2948 void FrameLoader::tokenizerProcessedData() 2930 2949 { 2931 if (m_frame->document()) 2932 checkCompleted(); 2933 checkLoadComplete(); 2950 ASSERT(m_frame->page()); 2951 ASSERT(m_frame->document()); 2952 2953 checkCompleted(); 2934 2954 } 2935 2955 … … 3169 3189 // transitioned to the new page (before WebFrameState == commit). The goal here is to restore any state 3170 3190 // so that the existing view (that wenever got far enough to replace) can continue being used. 3171 Document* document = m_frame->document(); 3172 if (document) 3173 document->setInPageCache(false); 3191 m_frame->document()->setInPageCache(false); 3174 3192 invalidateCurrentItemCachedPage(); 3175 3193 … … 3733 3751 void FrameLoader::saveDocumentState() 3734 3752 { 3753 if (m_creatingInitialEmptyDocument) 3754 return; 3755 3735 3756 // Do not save doc state if the page has a password field and a form that would be submitted via https. 3736 3757 Document* document = m_frame->document(); 3737 if (document && document->hasPasswordField() && document->hasSecureForm()) 3758 ASSERT(document); 3759 if (document->hasPasswordField() && document->hasSecureForm()) 3738 3760 return; 3739 3761 … … 4175 4197 loader->setPrimaryLoadComplete(true); 4176 4198 m_client->dispatchDidLoadMainResource(activeDocumentLoader()); 4177 check LoadComplete();4199 checkCompleted(); 4178 4200 } 4179 4201 … … 4376 4398 setEncoding(encoding, userChosen); 4377 4399 4378 if (!m_frame->document()) 4379 return; 4400 ASSERT(m_frame->document()); 4380 4401 4381 4402 addData(buffer->data(), buffer->size()); -
trunk/WebCore/loader/FrameLoader.h
r21244 r21367 132 132 ~FrameLoader(); 133 133 134 void init(); 135 134 136 Frame* frame() const { return m_frame; } 135 137 … … 163 165 static bool shouldHideReferrer(const KURL& url, const String& referrer); 164 166 165 Frame* createWindow(const FrameLoadRequest&, const WindowFeatures& );167 Frame* createWindow(const FrameLoadRequest&, const WindowFeatures&, bool& created); 166 168 167 169 void loadResourceSynchronously(const ResourceRequest&, ResourceError&, ResourceResponse&, Vector<char>& data); … … 171 173 // Also not cool. 172 174 void stopAllLoaders(); 175 void stopForUserCancel(); 173 176 void cancelPendingArchiveLoad(ResourceLoader*); 174 177 … … 331 334 Widget* createJavaAppletWidget(const IntSize&, Element*, const HashMap<String, String>& args); 332 335 333 void createEmptyDocument();334 335 336 void partClearedInBegin(); 336 337 void restoreDocumentState(); … … 621 622 bool m_openedByJavaScript; 622 623 624 bool m_creatingInitialEmptyDocument; 625 bool m_committedFirstRealDocumentLoad; 626 623 627 RefPtr<HistoryItem> m_currentHistoryItem; 624 628 RefPtr<HistoryItem> m_previousHistoryItem; -
trunk/WebCore/loader/MainResourceLoader.cpp
r21254 r21367 63 63 // Calling receivedMainResourceError will likely result in the last reference to this object to go away. 64 64 RefPtr<MainResourceLoader> protect(this); 65 66 frameLoader()->receivedMainResourceError(error, true); 65 RefPtr<Frame> protectFrame(m_frame); 67 66 68 67 if (!cancelled()) { 69 68 ASSERT(!reachedTerminalState()); 70 69 frameLoader()->didFailToLoad(this, error); 71 70 } 71 72 frameLoader()->receivedMainResourceError(error, true); 73 74 if (!cancelled()) { 72 75 releaseResources(); 73 76 } 74 77 75 78 ASSERT(reachedTerminalState()); 76 79 } -
trunk/WebCore/page/DOMWindow.cpp
r17652 r21367 59 59 if (!m_frame) 60 60 return 0; 61 62 if (!m_frame->document()) { 63 m_frame->loader()->createEmptyDocument(); 64 m_frame->loader()->begin(); 65 m_frame->loader()->write("<HTML><BODY>"); 66 m_frame->loader()->end(); 67 } 61 62 ASSERT(m_frame->document()); 68 63 return m_frame->document(); 69 64 } -
trunk/WebCore/page/Frame.cpp
r21222 r21367 253 253 } 254 254 255 void Frame::init() 256 { 257 d->m_loader->init(); 258 } 259 255 260 FrameLoader* Frame::loader() const 256 261 { … … 1713 1718 void Frame::pageDestroyed() 1714 1719 { 1720 if (Frame* parent = tree()->parent()) 1721 parent->loader()->checkLoadComplete(); 1722 1715 1723 if (d->m_page && d->m_page->focusController()->focusedFrame() == this) 1716 1724 d->m_page->focusController()->setFocusedFrame(0); -
trunk/WebCore/page/Frame.h
r21219 r21367 124 124 virtual ~Frame(); 125 125 126 void init(); 127 126 128 #if PLATFORM(MAC) 127 129 void setBridge(WebCoreFrameBridge*); -
trunk/WebCore/page/mac/WebCoreFrameBridge.mm
r21157 r21367 682 682 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)string forceUserGesture:(BOOL)forceUserGesture 683 683 { 684 m_frame->loader()->createEmptyDocument();684 ASSERT(m_frame->document()); 685 685 JSValue* result = m_frame->loader()->executeScript(0, string, forceUserGesture); 686 686 if (!result) … … 692 692 - (NSAppleEventDescriptor *)aeDescByEvaluatingJavaScriptFromString:(NSString *)string 693 693 { 694 m_frame->loader()->createEmptyDocument();694 ASSERT(m_frame->document()); 695 695 JSValue* result = m_frame->loader()->executeScript(0, string, true); 696 696 if (!result) // FIXME: pass errors -
trunk/WebCore/platform/graphics/svg/SVGImage.cpp
r20837 r21367 137 137 m_page.set(new Page(dummyChromeClient, dummyContextMenuClient, dummyEditorClient, dummyDragClient)); 138 138 m_frame = new Frame(m_page.get(), 0, dummyFrameLoaderClient); 139 m_frame->init(); 139 140 m_frameView = new FrameView(m_frame.get()); 140 141 m_frameView->deref(); // FIXME: FrameView starts with a refcount of 1 -
trunk/WebCore/rendering/RenderPart.cpp
r21079 r21367 98 98 height = m_height - borderTop() - borderBottom() - paddingTop() - paddingBottom(); 99 99 IntRect newBounds(x,y,width,height); 100 if (newBounds != m_widget->frameGeometry()) { 100 bool boundsChanged = newBounds != m_widget->frameGeometry(); 101 if (boundsChanged) { 101 102 // The widget changed positions. Update the frame geometry. 102 103 RenderArena *arena = ref(); … … 105 106 element()->deref(); 106 107 deref(arena); 107 108 if (m_widget && m_widget->isFrameView()) 109 static_cast<FrameView*>(m_widget)->layout(); 108 } 109 110 // if the frame bounds got changed, or if view needs layout (possibly indicating 111 // content size is wrong) we have to do a layout to set the right widget size 112 if (m_widget && m_widget->isFrameView()) { 113 FrameView* frameView = static_cast<FrameView*>(m_widget); 114 if (boundsChanged || frameView->needsLayout()) 115 frameView->layout(); 110 116 } 111 117 } -
trunk/WebCore/rendering/RenderTreeAsText.cpp
r21082 r21367 486 486 writeRenderResources(ts, o->document()); 487 487 #endif 488 o->view()->frameView()->layout(); 488 if (o->view()->frameView()) 489 o->view()->frameView()->layout(); 489 490 RenderLayer* l = o->layer(); 490 491 if (l) { -
trunk/WebKit/ChangeLog
r21349 r21367 1 2007-05-10 Maciej Stachowiak <mjs@apple.com> 2 3 Reviewed by Oliver. 4 5 - WebKit part of fix for: 6 <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load) 7 <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465) 8 9 The basic approach is to have Frames start out containing an empty document instead of absolutely nothing, 10 so there is no need to initialize them on demand. Various side effects of that cause both of these bugs. 11 12 However, this caused many regressions so I had to fix the fallout. 13 14 * WebCoreSupport/WebChromeClient.mm: 15 (WebChromeClient::takeFocus): Avoid focus cycle problems (can happen in DumpRenderTree 16 with initial empty document now). 17 * WebCoreSupport/WebFrameBridge.mm: 18 (-[WebFrameBridge finishInitializingWithPage:frameName:frameView:ownerElement:]): init the frame. 19 (-[WebFrameBridge determineObjectFromMIMEType:URL:]): return image type when appropriate 20 * WebView/WebFrame.mm: 21 (-[WebFrame stopLoading]): use stopForUserCancel(). 22 * WebView/WebFrameView.mm: 23 (-[WebFrameView _makeDocumentViewForDataSource:]): assume html when no mime type available. 24 * WebView/WebView.mm: 25 (-[WebView becomeFirstResponder]): Track whether we are becoming first responder from 26 outside the view. 27 (-[WebView _becomingFirstResponderFromOutside]): Return this value. 28 * WebView/WebViewInternal.h: 29 1 30 2007-05-09 Oliver Hunt <oliver@apple.com> 2 31 -
trunk/WebKit/WebCoreSupport/WebChromeClient.mm
r21091 r21367 117 117 // behave as if it had no subviews, which is the behavior we want. 118 118 NSView *lastView = [m_webView _findLastViewInKeyViewLoop]; 119 // avoid triggering assertions if the WebView is the only thing in the key loop 120 if ([m_webView _becomingFirstResponderFromOutside] && m_webView == [lastView nextValidKeyView]) 121 return; 119 122 [[m_webView window] selectKeyViewFollowingView:lastView]; 120 } else 123 } else { 124 // avoid triggering assertions if the WebView is the only thing in the key loop 125 if ([m_webView _becomingFirstResponderFromOutside] && m_webView == [m_webView previousValidKeyView]) 126 return; 121 127 [[m_webView window] selectKeyViewPrecedingView:m_webView]; 128 } 122 129 } 123 130 -
trunk/WebKit/WebCoreSupport/WebFrameBridge.mm
r21307 r21367 144 144 m_frame->setBridge(self); 145 145 m_frame->tree()->setName(name); 146 m_frame->init(); 146 147 147 148 [self setTextSizeMultiplier:[webView textSizeMultiplier]]; … … 650 651 651 652 if (MimeTypeRegistry::isSupportedImageMIMEType(MIMEType)) 652 return ObjectElement Frame;653 return ObjectElementImage; 653 654 654 655 if ([[self webView] _isMIMETypeRegisteredAsPlugin:MIMEType]) -
trunk/WebKit/WebView/WebFrame.mm
r21307 r21367 848 848 { 849 849 if (FrameLoader* frameLoader = [self _frameLoader]) 850 frameLoader->stop AllLoaders();850 frameLoader->stopForUserCancel(); 851 851 } 852 852 -
trunk/WebKit/WebView/WebFrameView.mm
r20269 r21367 170 170 171 171 -(NSView <WebDocumentView> *)_makeDocumentViewForDataSource:(WebDataSource *)dataSource 172 { 173 Class viewClass = [[self class] _viewClassForMIMEType:[[dataSource response] MIMEType]]; 172 { 173 NSString* MIMEType = [[dataSource response] MIMEType]; 174 if (!MIMEType) 175 MIMEType = @"text/html"; 176 Class viewClass = [[self class] _viewClassForMIMEType:MIMEType]; 174 177 NSView <WebDocumentView> *documentView; 175 178 if (viewClass) { -
trunk/WebKit/WebView/WebView.mm
r21306 r21367 249 249 @end 250 250 251 @interface NSWindow (AppKitSecretsIKnow) 252 - (id)_oldFirstResponderBeforeBecoming; 253 @end 254 251 255 @interface NSObject (ValidateWithoutDelegate) 252 256 - (BOOL)validateUserInterfaceItemWithoutDelegate:(id <NSValidatedUserInterfaceItem>)item; … … 300 304 BOOL tabKeyCyclesThroughElementsChanged; 301 305 BOOL becomingFirstResponder; 306 BOOL becomingFirstResponderFromOutside; 302 307 BOOL hoverFeedbackSuspended; 303 308 … … 2258 2263 NSWindow *window = [self window]; 2259 2264 WebFrameView *mainFrameView = [[self mainFrame] frameView]; 2265 2266 NSResponder *previousFirstResponder = [[self window] _oldFirstResponderBeforeBecoming]; 2267 BOOL fromOutside = ![previousFirstResponder isKindOfClass:[NSView class]] || (![(NSView *)previousFirstResponder isDescendantOf:self] && previousFirstResponder != self); 2260 2268 2261 2269 if ([window keyViewSelectionDirection] == NSSelectingPrevious) { … … 2263 2271 if ((previousValidKeyView != self) && (previousValidKeyView != mainFrameView)) { 2264 2272 _private->becomingFirstResponder = YES; 2273 _private->becomingFirstResponderFromOutside = fromOutside; 2265 2274 [window makeFirstResponder:previousValidKeyView]; 2275 _private->becomingFirstResponderFromOutside = NO; 2266 2276 _private->becomingFirstResponder = NO; 2267 2277 return YES; … … 2273 2283 if ([mainFrameView acceptsFirstResponder]) { 2274 2284 _private->becomingFirstResponder = YES; 2285 _private->becomingFirstResponderFromOutside = fromOutside; 2275 2286 [window makeFirstResponder:mainFrameView]; 2287 _private->becomingFirstResponderFromOutside = NO; 2276 2288 _private->becomingFirstResponder = NO; 2277 2289 return YES; … … 3582 3594 @implementation WebView (WebViewInternal) 3583 3595 3596 - (BOOL)_becomingFirstResponderFromOutside 3597 { 3598 return _private->becomingFirstResponderFromOutside; 3599 } 3600 3584 3601 - (NSString *)_userVisibleBundleVersionFromFullVersion:(NSString *)fullVersion 3585 3602 { -
trunk/WebKit/WebView/WebViewInternal.h
r21159 r21367 110 110 - (id)_objectForIdentifier:(unsigned long)identifier; 111 111 - (void)_removeObjectForIdentifier:(unsigned long)identifier; 112 - (BOOL)_becomingFirstResponderFromOutside; 112 113 @end -
trunk/WebKitTools/ChangeLog
r21364 r21367 1 2007-05-08 Maciej Stachowiak <mjs@apple.com> 2 3 Reviewed by Oliver. 4 5 - don't clear events whenever an EventSendingController goes away, only do it at predictable times, 6 since destroying a subframe can make one go away 7 8 (Discovered while fixing: 9 10 <rdar://problem/5063277> blank screen after login to Citibank Online (accessing document before frame starts loading cancels load) 11 <rdar://problem/5159541> REGRESSION (r20972): Wall Street Journal pages replaced by advertisements (13465) 12 13 * DumpRenderTree/DumpRenderTree.m: 14 (runTest): explicitly clear saved events after every page load 15 * DumpRenderTree/EventSendingController.h: 16 * DumpRenderTree/EventSendingController.m: 17 (-[EventSendingController dealloc]): don't clear saved events here... 18 (+[EventSendingController clearSavedEvents]): do it here 19 * Scripts/check-for-global-initializers: 20 1 21 2007-05-10 Mark Rowe <mrowe@apple.com> 2 22 -
trunk/WebKitTools/DumpRenderTree/DumpRenderTree.m
r21354 r21367 1552 1552 } 1553 1553 pool = [[NSAutoreleasePool alloc] init]; 1554 [EventSendingController clearSavedEvents]; 1554 1555 [[frame webView] setSelectedDOMRange:nil affinity:NSSelectionAffinityDownstream]; 1555 1556 -
trunk/WebKitTools/DumpRenderTree/EventSendingController.h
r19101 r21367 42 42 + (void)saveEvent:(NSInvocation *)event; 43 43 + (void)replaySavedEvents; 44 + (void)clearSavedEvents; 44 45 45 46 - (void)enableDOMUIEventLogging:(WebScriptObject *)node; -
trunk/WebKitTools/DumpRenderTree/EventSendingController.m
r20407 r21367 147 147 - (void)dealloc 148 148 { 149 [savedMouseEvents release];150 savedMouseEvents = nil;151 149 [super dealloc]; 152 150 } … … 328 326 } 329 327 replayingSavedEvents = NO; 328 } 329 330 + (void)clearSavedEvents 331 { 332 [savedMouseEvents release]; 333 savedMouseEvents = nil; 330 334 } 331 335 -
trunk/WebKitTools/Scripts/check-for-global-initializers
r21228 r21367 82 82 $shortName =~ s/.*\///; 83 83 84 next if $shortName eq "array_object.o"; 85 84 86 # Special cases for files that have initializers in debug builds. 85 87 if ($configuration eq "Debug") {
Note:
See TracChangeset
for help on using the changeset viewer.