- Revision
- 87566
- Author
- beid...@apple.com
- Date
- 2011-05-27 14:15:46 -0700 (Fri, 27 May 2011)
Log Message
First swipe at resolving <rdar://problem/9125145> and https://bugs.webkit.org/show_bug.cgi?id=61494
Reviewed by Darin Adler.
Make the Document be intelligent about returning its DocumentLoader, including the possibility that
the DocumentLoader will be null.
No new tests. No change in behavior.
Instead of storing the DocumentLoader at construction and never changing it,
always calculate it based on the FrameLoader's current DocumentLoader:
* dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::suggestedMIMEType):
(WebCore::Document::lastModified):
(WebCore::Document::initSecurityContext):
(WebCore::Document::updateURLForPushOrReplaceState):
(WebCore::Document::loader):
* dom/Document.h:
Null-check or ASSERT that the DocumentLoader exists (or both) depending on the scenario:
* bindings/ScriptControllerBase.cpp:
(WebCore::ScriptController::executeIfJavaScriptURL):
* html/MediaDocument.cpp:
(WebCore::MediaDocument::replaceMediaElementTimerFired):
* html/PluginDocument.cpp:
(WebCore::PluginDocumentParser::createDocumentStructure):
* platform/mac/HTMLConverter.mm:
(fileWrapperForElement):
* WebCore.exp.in:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (87565 => 87566)
--- trunk/Source/WebCore/ChangeLog 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/ChangeLog 2011-05-27 21:15:46 UTC (rev 87566)
@@ -1,3 +1,37 @@
+2011-05-27 Brady Eidson <beid...@apple.com>
+
+ Reviewed by Darin Adler.
+
+ First swipe at resolving <rdar://problem/9125145> and https://bugs.webkit.org/show_bug.cgi?id=61494
+
+ Make the Document be intelligent about returning its DocumentLoader, including the possibility that
+ the DocumentLoader will be null.
+
+ No new tests. No change in behavior.
+
+ Instead of storing the DocumentLoader at construction and never changing it,
+ always calculate it based on the FrameLoader's current DocumentLoader:
+ * dom/Document.cpp:
+ (WebCore::Document::Document):
+ (WebCore::Document::suggestedMIMEType):
+ (WebCore::Document::lastModified):
+ (WebCore::Document::initSecurityContext):
+ (WebCore::Document::updateURLForPushOrReplaceState):
+ (WebCore::Document::loader):
+ * dom/Document.h:
+
+ Null-check or ASSERT that the DocumentLoader exists (or both) depending on the scenario:
+ * bindings/ScriptControllerBase.cpp:
+ (WebCore::ScriptController::executeIfJavaScriptURL):
+ * html/MediaDocument.cpp:
+ (WebCore::MediaDocument::replaceMediaElementTimerFired):
+ * html/PluginDocument.cpp:
+ (WebCore::PluginDocumentParser::createDocumentStructure):
+ * platform/mac/HTMLConverter.mm:
+ (fileWrapperForElement):
+
+ * WebCore.exp.in:
+
2011-05-27 Jer Noble <jer.no...@apple.com>
Reviewed by Maciej Stachowiak.
Modified: trunk/Source/WebCore/WebCore.exp.in (87565 => 87566)
--- trunk/Source/WebCore/WebCore.exp.in 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/WebCore.exp.in 2011-05-27 21:15:46 UTC (rev 87566)
@@ -1283,6 +1283,7 @@
__ZNK7WebCore8Document31displayStringModifiedByEncodingERKN3WTF6StringE
__ZNK7WebCore8Document4bodyEv
__ZNK7WebCore8Document6domainEv
+__ZNK7WebCore8Document6loaderEv
__ZNK7WebCore8IntPointcv7CGPointEv
__ZNK7WebCore8IntPointcv8_NSPointEv
__ZNK7WebCore8Position10downstreamENS_27EditingBoundaryCrossingRuleE
Modified: trunk/Source/WebCore/bindings/ScriptControllerBase.cpp (87565 => 87566)
--- trunk/Source/WebCore/bindings/ScriptControllerBase.cpp 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/bindings/ScriptControllerBase.cpp 2011-05-27 21:15:46 UTC (rev 87566)
@@ -114,9 +114,12 @@
// FIXME: We should always replace the document, but doing so
// synchronously can cause crashes:
// http://bugs.webkit.org/show_bug.cgi?id=16782
- if (shouldReplaceDocumentIfJavaScriptURL == ReplaceDocumentIfJavaScriptURL)
- m_frame->document()->loader()->writer()->replaceDocument(scriptResult);
-
+ if (shouldReplaceDocumentIfJavaScriptURL == ReplaceDocumentIfJavaScriptURL) {
+ // We're still in a frame, so there should be a DocumentLoader.
+ ASSERT(m_frame->document()->loader());
+ if (DocumentLoader* loader = m_frame->document()->loader())
+ loader->writer()->replaceDocument(scriptResult);
+ }
return true;
}
Modified: trunk/Source/WebCore/dom/Document.cpp (87565 => 87566)
--- trunk/Source/WebCore/dom/Document.cpp 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/dom/Document.cpp 2011-05-27 21:15:46 UTC (rev 87566)
@@ -435,7 +435,6 @@
m_ignoreAutofocus = false;
m_frame = frame;
- m_documentLoader = frame ? frame->loader()->activeDocumentLoader() : 0;
// We depend on the url getting immediately set in subframes, but we
// also depend on the url NOT getting immediately set in opened windows.
@@ -1106,7 +1105,9 @@
if (m_document->isHTMLDocument())
return "text/html";
- return m_documentLoader->responseMIMEType();
+ if (DocumentLoader* documentLoader = loader())
+ return documentLoader->responseMIMEType();
+ return String();
}
// FIXME: We need to discuss the DOM API here at some point. Ideas:
@@ -3781,7 +3782,11 @@
DateComponents date;
bool foundDate = false;
if (m_frame) {
- String httpLastModified = m_documentLoader->response().httpHeaderField("Last-Modified");
+ // Since we're still in a Frame, we should have a DocumentLoader.
+ ASSERT(loader());
+ String httpLastModified;
+ if (loader())
+ httpLastModified = loader()->response().httpHeaderField("Last-Modified");
if (!httpLastModified.isEmpty()) {
date.setMillisecondsSinceEpochForDateTime(parseDate(httpLastModified));
foundDate = true;
@@ -4510,7 +4515,11 @@
// load local resources. See https://bugs.webkit.org/show_bug.cgi?id=16756
// and https://bugs.webkit.org/show_bug.cgi?id=19760 for further
// discussion.
- if (m_documentLoader->substituteData().isValid())
+
+ DocumentLoader* documentLoader = loader();
+ // Since we're still in a Frame, we should have a DocumentLoader.
+ ASSERT(documentLoader);
+ if (documentLoader && documentLoader->substituteData().isValid())
securityOrigin()->grantLoadLocalResources();
}
@@ -4591,7 +4600,10 @@
setURL(url);
f->loader()->setOutgoingReferrer(url);
- m_documentLoader->replaceRequestURLForSameDocumentNavigation(url);
+ // Since we're still in a frame, we should have a DocumentLoader.
+ ASSERT(loader());
+ if (DocumentLoader* documentLoader = loader())
+ documentLoader->replaceRequestURLForSameDocumentNavigation(url);
}
void Document::statePopped(SerializedScriptValue* stateObject)
@@ -5142,4 +5154,19 @@
mainFrame->notifyChromeClientWheelEventHandlerCountChanged();
}
+DocumentLoader* Document::loader() const
+{
+ if (!m_frame)
+ return 0;
+
+ DocumentLoader* loader = m_frame->loader()->activeDocumentLoader();
+ if (!loader)
+ return 0;
+
+ if (m_frame->document() != this)
+ return 0;
+
+ return loader;
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/dom/Document.h (87565 => 87566)
--- trunk/Source/WebCore/dom/Document.h 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/dom/Document.h 2011-05-27 21:15:46 UTC (rev 87566)
@@ -569,8 +569,7 @@
void setVisuallyOrdered();
bool visuallyOrdered() const { return m_visuallyOrdered; }
- void setDocumentLoader(DocumentLoader* documentLoader) { m_documentLoader = documentLoader; }
- DocumentLoader* loader() const { return m_documentLoader; }
+ DocumentLoader* loader() const;
void open(Document* ownerDocument = 0);
void implicitOpen();
@@ -1174,7 +1173,6 @@
mutable RefPtr<CSSPrimitiveValueCache> m_cssPrimitiveValueCache;
Frame* m_frame;
- DocumentLoader* m_documentLoader;
OwnPtr<CachedResourceLoader> m_cachedResourceLoader;
RefPtr<DocumentParser> m_parser;
bool m_wellFormed;
Modified: trunk/Source/WebCore/html/MediaDocument.cpp (87565 => 87566)
--- trunk/Source/WebCore/html/MediaDocument.cpp 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/html/MediaDocument.cpp 2011-05-27 21:15:46 UTC (rev 87566)
@@ -221,8 +221,12 @@
embedElement->setAttribute(heightAttr, "100%");
embedElement->setAttribute(nameAttr, "plugin");
embedElement->setAttribute(srcAttr, url().string());
- embedElement->setAttribute(typeAttr, loader()->writer()->mimeType());
+ DocumentLoader* documentLoader = loader();
+ ASSERT(documentLoader);
+ if (documentLoader)
+ embedElement->setAttribute(typeAttr, documentLoader->writer()->mimeType());
+
ExceptionCode ec;
videoElement->parentNode()->replaceChild(embedElement, videoElement, ec);
}
Modified: trunk/Source/WebCore/html/PluginDocument.cpp (87565 => 87566)
--- trunk/Source/WebCore/html/PluginDocument.cpp 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/html/PluginDocument.cpp 2011-05-27 21:15:46 UTC (rev 87566)
@@ -92,7 +92,11 @@
m_embedElement->setAttribute(nameAttr, "plugin");
m_embedElement->setAttribute(srcAttr, document()->url().string());
- m_embedElement->setAttribute(typeAttr, document()->loader()->writer()->mimeType());
+
+ DocumentLoader* loader = document()->loader();
+ ASSERT(loader);
+ if (loader)
+ m_embedElement->setAttribute(typeAttr, loader->writer()->mimeType());
static_cast<PluginDocument*>(document())->setPluginNode(m_embedElement);
Modified: trunk/Source/WebCore/platform/mac/HTMLConverter.mm (87565 => 87566)
--- trunk/Source/WebCore/platform/mac/HTMLConverter.mm 2011-05-27 21:15:01 UTC (rev 87565)
+++ trunk/Source/WebCore/platform/mac/HTMLConverter.mm 2011-05-27 21:15:46 UTC (rev 87566)
@@ -1753,7 +1753,8 @@
const AtomicString& attr = element->getAttribute(srcAttr);
if (!attr.isEmpty()) {
NSURL *URL = ""
- wrapper = fileWrapperForURL(element->document()->loader(), URL);
+ if (DocumentLoader* loader = element->document()->loader())
+ wrapper = fileWrapperForURL(loader, URL);
}
if (!wrapper) {
RenderImage* renderer = toRenderImage(element->renderer());