<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[36954] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/36954">36954</a></dd>
<dt>Author</dt> <dd>oliver@apple.com</dd>
<dt>Date</dt> <dd>2008-09-26 04:53:40 -0700 (Fri, 26 Sep 2008)</dd>
</dl>
<h3>Log Message</h3>
<pre>Bug 21054: Construction of certain DOM objects is heavily regressed by r36675
<https://bugs.webkit.org/show_bug.cgi?id=21054>
Reviewed by Maciej Stachowiak
This performance regression is actually just a symptom of a correctness
bug. The constructor objects for a number of properties that have security
checks on access were returning new objects each time. The most obvious
symptom of this bug is that window.Image != window.Image, etc.
The solution to this is to make sure we cache these constructors
in the same way as all the other DOM constructors. To achieve this
without causing any refcount cycles it is necessary to replace the
refcounted document pointer in the Image, MessageChannel, Option,
XMLHttpRequest, and Audio constructor objects with a reference to
the document's JS wrapper.
Tests: fast/dom/constructors-cached-navigate.html
fast/dom/constructors-cached.html</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkWebCoreChangeLog">trunk/WebCore/ChangeLog</a></li>
<li><a href="#trunkWebCorebindingsjsJSAudioConstructorcpp">trunk/WebCore/bindings/js/JSAudioConstructor.cpp</a></li>
<li><a href="#trunkWebCorebindingsjsJSAudioConstructorh">trunk/WebCore/bindings/js/JSAudioConstructor.h</a></li>
<li><a href="#trunkWebCorebindingsjsJSDOMWindowBasecpp">trunk/WebCore/bindings/js/JSDOMWindowBase.cpp</a></li>
<li><a href="#trunkWebCorebindingsjsJSDOMWindowBaseh">trunk/WebCore/bindings/js/JSDOMWindowBase.h</a></li>
<li><a href="#trunkWebCorebindingsjsJSHTMLOptionElementConstructorcpp">trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.cpp</a></li>
<li><a href="#trunkWebCorebindingsjsJSHTMLOptionElementConstructorh">trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.h</a></li>
<li><a href="#trunkWebCorebindingsjsJSImageConstructorcpp">trunk/WebCore/bindings/js/JSImageConstructor.cpp</a></li>
<li><a href="#trunkWebCorebindingsjsJSImageConstructorh">trunk/WebCore/bindings/js/JSImageConstructor.h</a></li>
<li><a href="#trunkWebCorebindingsjsJSMessageChannelConstructorcpp">trunk/WebCore/bindings/js/JSMessageChannelConstructor.cpp</a></li>
<li><a href="#trunkWebCorebindingsjsJSMessageChannelConstructorh">trunk/WebCore/bindings/js/JSMessageChannelConstructor.h</a></li>
<li><a href="#trunkWebCorebindingsjsJSXMLHttpRequestConstructorcpp">trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.cpp</a></li>
<li><a href="#trunkWebCorebindingsjsJSXMLHttpRequestConstructorh">trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastdomconstructorscachedexpectedtxt">trunk/LayoutTests/fast/dom/constructors-cached-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomconstructorscachednavigateexpectedtxt">trunk/LayoutTests/fast/dom/constructors-cached-navigate-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastdomconstructorscachednavigatehtml">trunk/LayoutTests/fast/dom/constructors-cached-navigate.html</a></li>
<li><a href="#trunkLayoutTestsfastdomconstructorscachedhtml">trunk/LayoutTests/fast/dom/constructors-cached.html</a></li>
<li><a href="#trunkLayoutTestsfastdomresourcesconstructorscachednavigatejs">trunk/LayoutTests/fast/dom/resources/constructors-cached-navigate.js</a></li>
<li><a href="#trunkLayoutTestsfastdomresourcesconstructorscachedjs">trunk/LayoutTests/fast/dom/resources/constructors-cached.js</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/LayoutTests/ChangeLog 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2008-09-26 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ Bug 21054: Construction of certain DOM objects is heavily regressed by r36675
+ <https://bugs.webkit.org/show_bug.cgi?id=21054>
+
+ Tests to ensure that we correctly only have single instances of the
+ special cased Image, MessageChannel, Option, XMLHttpRequest, and Audio
+ constructors. We also test that we don't expose the cached objects
+ to subsequent documents as navigation occurs.
+
+ * fast/dom/constructors-cached-expected.txt: Added.
+ * fast/dom/constructors-cached-navigate-expected.txt: Added.
+ * fast/dom/constructors-cached-navigate.html: Added.
+ * fast/dom/constructors-cached.html: Added.
+ * fast/dom/resources/constructors-cached-navigate.js: Added.
+ * fast/dom/resources/constructors-cached.js: Added.
+
</ins><span class="cx"> 2008-09-25 Feng Qian <feng@chromium.org>
</span><span class="cx">
</span><span class="cx"> Test for: https://bugs.webkit.org/show_bug.cgi?id=21032
</span></span></pre></div>
<a id="trunkLayoutTestsfastdomconstructorscachedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/constructors-cached-expected.txt (0 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/constructors-cached-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/constructors-cached-expected.txt 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+This test ensures that objects with security restrictions are cached correctly
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Image is Image
+PASS Image.testProperty is "property set successfully"
+PASS MessageChannel is MessageChannel
+PASS MessageChannel.testProperty is "property set successfully"
+PASS Option is Option
+PASS Option.testProperty is "property set successfully"
+PASS XMLHttpRequest is XMLHttpRequest
+PASS XMLHttpRequest.testProperty is "property set successfully"
+PASS Audio is Audio
+PASS Audio.testProperty is "property set successfully"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomconstructorscachednavigateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/constructors-cached-navigate-expected.txt (0 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/constructors-cached-navigate-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/constructors-cached-navigate-expected.txt 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS testFrame.contentWindow.Image is testFrame.contentWindow.Image
+PASS testFrame.contentWindow.Image !== window.Image is true
+PASS testFrame.contentWindow.Image.testProperty is "property set successfully"
+PASS testFrame.contentWindow.MessageChannel is testFrame.contentWindow.MessageChannel
+PASS testFrame.contentWindow.MessageChannel !== window.MessageChannel is true
+PASS testFrame.contentWindow.MessageChannel.testProperty is "property set successfully"
+PASS testFrame.contentWindow.Option is testFrame.contentWindow.Option
+PASS testFrame.contentWindow.Option !== window.Option is true
+PASS testFrame.contentWindow.Option.testProperty is "property set successfully"
+PASS testFrame.contentWindow.XMLHttpRequest is testFrame.contentWindow.XMLHttpRequest
+PASS testFrame.contentWindow.XMLHttpRequest !== window.XMLHttpRequest is true
+PASS testFrame.contentWindow.XMLHttpRequest.testProperty is "property set successfully"
+PASS testFrame.contentWindow.Audio is testFrame.contentWindow.Audio
+PASS testFrame.contentWindow.Audio !== window.Audio is true
+PASS testFrame.contentWindow.Audio.testProperty is "property set successfully"
+PASS testFrame.contentWindow.Image is testFrame.contentWindow.Image
+PASS testFrame.contentWindow.Image !== window.Image is true
+PASS testFrame.contentWindow.Image !== storedConstructors.Image is true
+PASS storedConstructors.Image.testProperty is "property set successfully"
+PASS testFrame.contentWindow.Image.testProperty is undefined.
+PASS testFrame.contentWindow.Image.cachedOnOwnerDocument is true
+PASS testFrame.contentWindow.MessageChannel is testFrame.contentWindow.MessageChannel
+PASS testFrame.contentWindow.MessageChannel !== window.MessageChannel is true
+PASS testFrame.contentWindow.MessageChannel !== storedConstructors.MessageChannel is true
+PASS storedConstructors.MessageChannel.testProperty is "property set successfully"
+PASS testFrame.contentWindow.MessageChannel.testProperty is undefined.
+PASS testFrame.contentWindow.MessageChannel.cachedOnOwnerDocument is true
+PASS testFrame.contentWindow.Option is testFrame.contentWindow.Option
+PASS testFrame.contentWindow.Option !== window.Option is true
+PASS testFrame.contentWindow.Option !== storedConstructors.Option is true
+PASS storedConstructors.Option.testProperty is "property set successfully"
+PASS testFrame.contentWindow.Option.testProperty is undefined.
+PASS testFrame.contentWindow.Option.cachedOnOwnerDocument is true
+PASS testFrame.contentWindow.XMLHttpRequest is testFrame.contentWindow.XMLHttpRequest
+PASS testFrame.contentWindow.XMLHttpRequest !== window.XMLHttpRequest is true
+PASS testFrame.contentWindow.XMLHttpRequest !== storedConstructors.XMLHttpRequest is true
+PASS storedConstructors.XMLHttpRequest.testProperty is "property set successfully"
+PASS testFrame.contentWindow.XMLHttpRequest.testProperty is undefined.
+PASS testFrame.contentWindow.XMLHttpRequest.cachedOnOwnerDocument is true
+PASS testFrame.contentWindow.Audio is testFrame.contentWindow.Audio
+PASS testFrame.contentWindow.Audio !== window.Audio is true
+PASS testFrame.contentWindow.Audio !== storedConstructors.Audio is true
+PASS storedConstructors.Audio.testProperty is "property set successfully"
+PASS testFrame.contentWindow.Audio.testProperty is undefined.
+PASS testFrame.contentWindow.Audio.cachedOnOwnerDocument is true
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomconstructorscachednavigatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/constructors-cached-navigate.html (0 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/constructors-cached-navigate.html (rev 0)
+++ trunk/LayoutTests/fast/dom/constructors-cached-navigate.html 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../js/resources/js-test-style.css">
+<script src="../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<iframe id="testFrame"></iframe>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/constructors-cached-navigate.js"></script>
+<script src="../js/resources/js-test-post.js"></script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomconstructorscachedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/constructors-cached.html (0 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/constructors-cached.html (rev 0)
+++ trunk/LayoutTests/fast/dom/constructors-cached.html 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../js/resources/js-test-style.css">
+<script src="../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="resources/constructors-cached.js"></script>
+<script src="../js/resources/js-test-post.js"></script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomresourcesconstructorscachednavigatejs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/resources/constructors-cached-navigate.js (0 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/resources/constructors-cached-navigate.js (rev 0)
+++ trunk/LayoutTests/fast/dom/resources/constructors-cached-navigate.js 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+if (window.layoutTestController)
+ layoutTestController.waitUntilDone();
+
+var constructors = ["Image", "MessageChannel", "Option", "XMLHttpRequest", "Audio"];
+
+window.onload = function () {
+ testFrame = document.getElementById("testFrame");
+ storedConstructors = [];
+ // Identity checks
+ for (var i = 0; i < constructors.length; i++) {
+ var constructor = constructors[i];
+ try {
+ shouldBe("testFrame.contentWindow." + constructor, "testFrame.contentWindow."+constructor);
+ shouldBeTrue("testFrame.contentWindow." + constructor + " !== window." + constructor);
+ testFrame.contentWindow[constructor].testProperty = "property set successfully";
+ shouldBe("testFrame.contentWindow." + constructor + ".testProperty", '"property set successfully"');
+ storedConstructors[constructor] = testFrame.contentWindow[constructor];
+ } catch (e) {
+ testFailed("Testing " + constructor + " threw " + e);
+ }
+ }
+ testFrame.onload = function() {
+ if (window.GCController)
+ GCController.collect();
+
+ // Test properties after load
+ for (var i = 0; i < constructors.length; i++) {
+ var constructor = constructors[i];
+ try {
+ // Repeat the identity checks to be safe
+ shouldBe("testFrame.contentWindow." + constructor, "testFrame.contentWindow."+constructor);
+ shouldBeTrue("testFrame.contentWindow." + constructor + " !== window." + constructor);
+
+ // Make sure that we haven't reused the constructors from the old document
+ shouldBeTrue("testFrame.contentWindow." + constructor + " !== storedConstructors." + constructor);
+ shouldBe("storedConstructors." + constructor + ".testProperty", '"property set successfully"');
+
+ // Make sure we haven't kept anything over from the original document
+ shouldBeUndefined("testFrame.contentWindow." + constructor + ".testProperty");
+ // Make sure we're getting the same constructor as the frame does internally
+ shouldBeTrue("testFrame.contentWindow." + constructor + ".cachedOnOwnerDocument");
+ } catch (e) {
+ testFailed("Testing " + constructor + " threw " + e);
+ }
+ }
+
+ if (window.layoutTestController)
+ layoutTestController.notifyDone();
+ };
+ testFrame.src = 'data:text/html,<script>var constructors = ["Image", "MessageChannel", "Option", "XMLHttpRequest", "Audio"];'
+ + 'for(var i = 0; i < constructors.length; i++) if(window[constructors[i]])'
+ + 'window[constructors[i]].cachedOnOwnerDocument = true;</script>';
+}
+
+successfullyParsed = true;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastdomresourcesconstructorscachedjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/dom/resources/constructors-cached.js (0 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/dom/resources/constructors-cached.js (rev 0)
+++ trunk/LayoutTests/fast/dom/resources/constructors-cached.js 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+description("This test ensures that objects with security restrictions are cached correctly");
+
+var constructors = ["Image", "MessageChannel", "Option", "XMLHttpRequest", "Audio"];
+
+for (var i = 0; i < constructors.length; i++) {
+ var constructor = constructors[i];
+ try {
+ // Test retrieving the object twice results in the same object
+ shouldBe(constructor, constructor);
+
+ // Be paranoid -- make sure that setting a property results in that property
+ // stays
+ this[constructor].testProperty = "property set successfully";
+ shouldBe(constructor + ".testProperty", '"property set successfully"');
+ } catch (e) {
+ testFailed("Testing " + constructor + " threw " + e);
+ }
+}
+
+successfullyParsed = true;
</ins></span></pre></div>
<a id="trunkWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/ChangeLog (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/ChangeLog 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/ChangeLog 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2008-09-26 Oliver Hunt <oliver@apple.com>
+
+ Reviewed by Maciej Stachowiak.
+
+ Bug 21054: Construction of certain DOM objects is heavily regressed by r36675
+ <https://bugs.webkit.org/show_bug.cgi?id=21054>
+
+ This performance regression is actually just a symptom of a correctness
+ bug. The constructor objects for a number of properties that have security
+ checks on access were returning new objects each time. The most obvious
+ symptom of this bug is that window.Image != window.Image, etc.
+
+ The solution to this is to make sure we cache these constructors
+ in the same way as all the other DOM constructors. To achieve this
+ without causing any refcount cycles it is necessary to replace the
+ refcounted document pointer in the Image, MessageChannel, Option,
+ XMLHttpRequest, and Audio constructor objects with a reference to
+ the document's JS wrapper.
+
+ Tests: fast/dom/constructors-cached-navigate.html
+ fast/dom/constructors-cached.html
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * bindings/js/JSAudioConstructor.cpp:
+ (WebCore::JSAudioConstructor::mark):
+ * bindings/js/JSAudioConstructor.h:
+ (WebCore::JSAudioConstructor::document):
+ * bindings/js/JSDOMWindowBase.cpp:
+ (WebCore::getDOMConstructor):
+ (WebCore::JSDOMWindowBase::getValueProperty):
+ * bindings/js/JSDOMWindowBase.h:
+ * bindings/js/JSHTMLOptionElementConstructor.cpp:
+ (WebCore::JSHTMLOptionElementConstructor::mark):
+ * bindings/js/JSHTMLOptionElementConstructor.h:
+ (WebCore::JSHTMLOptionElementConstructor::document):
+ * bindings/js/JSImageConstructor.cpp:
+ (WebCore::JSImageConstructor::mark):
+ * bindings/js/JSImageConstructor.h:
+ (WebCore::JSImageConstructor::document):
+ * bindings/js/JSXMLHttpRequestConstructor.cpp:
+ (WebCore::JSXMLHttpRequestConstructor::mark):
+ * bindings/js/JSXMLHttpRequestConstructor.h:
+ (WebCore::JSXMLHttpRequestConstructor::document):
+
</ins><span class="cx"> 2008-09-26 Simon Hausmann <hausmann@webkit.org>
</span><span class="cx">
</span><span class="cx"> Unreviewed one-liner build fix for the Qt/Windows build.
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSAudioConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSAudioConstructor.cpp (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSAudioConstructor.cpp 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSAudioConstructor.cpp 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">
</span><span class="cx"> JSAudioConstructor::JSAudioConstructor(ExecState* exec, Document* document)
</span><span class="cx"> : DOMObject(JSAudioConstructor::createStructureID(exec->lexicalGlobalObject()->objectPrototype()))
</span><del>- , m_document(document)
</del><ins>+ , m_document(static_cast<JSDocument*>(toJS(exec, document)))
</ins><span class="cx"> {
</span><span class="cx"> putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum);
</span><span class="cx"> }
</span><span class="lines">@@ -65,6 +65,13 @@
</span><span class="cx"> return ConstructTypeHost;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void JSAudioConstructor::mark()
+{
+ DOMObject::mark();
+ if (!m_document->marked())
+ m_document->mark();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span><span class="cx"> #endif // ENABLE(VIDEO)
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSAudioConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSAudioConstructor.h (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSAudioConstructor.h 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSAudioConstructor.h 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx">
</span><span class="cx"> #include "JSDOMBinding.h"
</span><ins>+#include "JSDocument.h"
</ins><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -37,16 +38,17 @@
</span><span class="cx"> public:
</span><span class="cx"> JSAudioConstructor(JSC::ExecState*, Document*);
</span><span class="cx">
</span><del>- Document* document() const { return m_document.get(); }
</del><ins>+ Document* document() const { return m_document->impl(); }
</ins><span class="cx">
</span><span class="cx"> static const JSC::ClassInfo s_info;
</span><span class="cx">
</span><ins>+ virtual void mark();
</ins><span class="cx"> private:
</span><span class="cx"> virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
</span><span class="cx">
</span><span class="cx"> virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
</span><span class="cx">
</span><del>- RefPtr<Document> m_document;
</del><ins>+ JSDocument* m_document;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSDOMWindowBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSDOMWindowBase.cpp (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSDOMWindowBase.cpp 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSDOMWindowBase.cpp 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -433,6 +433,16 @@
</span><span class="cx"> return returnValue ? returnValue : jsUndefined();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+template<class ConstructorClass> static JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, const JSDOMWindowBase* window)
+{
+ if (JSC::JSObject* constructor = window->constructors().get(&ConstructorClass::s_info))
+ return constructor;
+ JSC::JSObject* constructor = new (exec) ConstructorClass(exec, window->impl()->document());
+ ASSERT(!window->constructors().contains(&ConstructorClass::s_info));
+ window->constructors().set(&ConstructorClass::s_info, constructor);
+ return constructor;
+}
+
</ins><span class="cx"> JSValue *JSDOMWindowBase::getValueProperty(ExecState *exec, int token) const
</span><span class="cx"> {
</span><span class="cx"> ASSERT(impl()->frame());
</span><span class="lines">@@ -449,28 +459,26 @@
</span><span class="cx"> case Image:
</span><span class="cx"> if (!allowsAccessFrom(exec))
</span><span class="cx"> return jsUndefined();
</span><del>- // FIXME: this property (and the few below) probably shouldn't create a new object every
- // time
- return new (exec) JSImageConstructor(exec, impl()->frame()->document());
</del><ins>+ return getDOMConstructor<JSImageConstructor>(exec, this);
</ins><span class="cx"> case MessageChannel:
</span><span class="cx"> if (!allowsAccessFrom(exec))
</span><span class="cx"> return jsUndefined();
</span><del>- return new (exec) JSMessageChannelConstructor(exec, impl()->frame()->document());
</del><ins>+ return getDOMConstructor<JSMessageChannelConstructor>(exec, this);
</ins><span class="cx"> case Option:
</span><span class="cx"> if (!allowsAccessFrom(exec))
</span><span class="cx"> return jsUndefined();
</span><del>- return new (exec) JSHTMLOptionElementConstructor(exec, impl()->frame()->document());
</del><ins>+ return getDOMConstructor<JSHTMLOptionElementConstructor>(exec, this);
</ins><span class="cx"> case XMLHttpRequest:
</span><span class="cx"> if (!allowsAccessFrom(exec))
</span><span class="cx"> return jsUndefined();
</span><del>- return new (exec) JSXMLHttpRequestConstructor(exec, impl()->frame()->document());
</del><ins>+ return getDOMConstructor<JSXMLHttpRequestConstructor>(exec, this);
</ins><span class="cx"> case Audio:
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx"> if (!allowsAccessFrom(exec))
</span><span class="cx"> return jsUndefined();
</span><span class="cx"> if (!MediaPlayer::isAvailable())
</span><span class="cx"> return jsUndefined();
</span><del>- return new (exec) JSAudioConstructor(exec, impl()->frame()->document());
</del><ins>+ return getDOMConstructor<JSAudioConstructor>(exec, this);
</ins><span class="cx"> #else
</span><span class="cx"> return jsUndefined();
</span><span class="cx"> #endif
</span><span class="lines">@@ -478,7 +486,7 @@
</span><span class="cx"> #if ENABLE(XSLT)
</span><span class="cx"> if (!allowsAccessFrom(exec))
</span><span class="cx"> return jsUndefined();
</span><del>- return new (exec) JSXSLTProcessorConstructor(exec);
</del><ins>+ return getDOMConstructor<JSXSLTProcessorConstructor>(exec);
</ins><span class="cx"> #else
</span><span class="cx"> return jsUndefined();
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSDOMWindowBaseh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSDOMWindowBase.h (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSDOMWindowBase.h 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSDOMWindowBase.h 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -129,7 +129,7 @@
</span><span class="cx"> void clearAllTimeouts();
</span><span class="cx">
</span><span class="cx"> JSDOMStructureMap& structures() { return d()->structures; }
</span><del>- JSDOMConstructorMap& constructors() { return d()->constructors; }
</del><ins>+ JSDOMConstructorMap& constructors() const { return d()->constructors; }
</ins><span class="cx">
</span><span class="cx"> enum {
</span><span class="cx"> // Attributes
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSHTMLOptionElementConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.cpp (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.cpp 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.cpp 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx">
</span><span class="cx"> JSHTMLOptionElementConstructor::JSHTMLOptionElementConstructor(ExecState* exec, Document* document)
</span><span class="cx"> : DOMObject(JSHTMLOptionElementConstructor::createStructureID(exec->lexicalGlobalObject()->objectPrototype()))
</span><del>- , m_document(document)
</del><ins>+ , m_document(static_cast<JSDocument*>(toJS(exec, document)))
</ins><span class="cx"> {
</span><span class="cx"> putDirect(exec->propertyNames().length, jsNumber(exec, 4), ReadOnly|DontDelete|DontEnum);
</span><span class="cx"> }
</span><span class="lines">@@ -75,4 +75,11 @@
</span><span class="cx"> return ConstructTypeHost;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void JSHTMLOptionElementConstructor::mark()
+{
+ DOMObject::mark();
+ if (!m_document->marked())
+ m_document->mark();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSHTMLOptionElementConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.h (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.h 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSHTMLOptionElementConstructor.h 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> #define JSHTMLOptionElementConstructor_h
</span><span class="cx">
</span><span class="cx"> #include "JSDOMBinding.h"
</span><ins>+#include "JSDocument.h"
</ins><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -28,15 +29,16 @@
</span><span class="cx"> class JSHTMLOptionElementConstructor : public DOMObject {
</span><span class="cx"> public:
</span><span class="cx"> JSHTMLOptionElementConstructor(JSC::ExecState*, Document*);
</span><del>- Document* document() const { return m_document.get(); }
</del><ins>+ Document* document() const { return m_document->impl(); }
</ins><span class="cx">
</span><span class="cx"> static const JSC::ClassInfo s_info;
</span><del>-
</del><ins>+
+ virtual void mark();
</ins><span class="cx"> private:
</span><span class="cx"> virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
</span><span class="cx"> virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
</span><span class="cx">
</span><del>- RefPtr<Document> m_document;
</del><ins>+ JSDocument* m_document;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSImageConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSImageConstructor.cpp (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSImageConstructor.cpp 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSImageConstructor.cpp 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx">
</span><span class="cx"> JSImageConstructor::JSImageConstructor(ExecState* exec, Document* document)
</span><span class="cx"> : DOMObject(JSImageConstructor::createStructureID(exec->lexicalGlobalObject()->objectPrototype()))
</span><del>- , m_document(document)
</del><ins>+ , m_document(static_cast<JSDocument*>(toJS(exec, document)))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -74,4 +74,11 @@
</span><span class="cx"> return ConstructTypeHost;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void JSImageConstructor::mark()
+{
+ DOMObject::mark();
+ if (!m_document->marked())
+ m_document->mark();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSImageConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSImageConstructor.h (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSImageConstructor.h 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSImageConstructor.h 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> #define JSImageConstructor_h
</span><span class="cx">
</span><span class="cx"> #include "JSDOMBinding.h"
</span><ins>+#include "JSDocument.h"
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -29,15 +30,16 @@
</span><span class="cx"> class JSImageConstructor : public DOMObject {
</span><span class="cx"> public:
</span><span class="cx"> JSImageConstructor(JSC::ExecState*, Document*);
</span><del>- Document* document() const { return m_document.get(); }
</del><ins>+ Document* document() const { return m_document->impl(); }
</ins><span class="cx">
</span><span class="cx"> static const JSC::ClassInfo s_info;
</span><del>-
</del><ins>+
+ virtual void mark();
</ins><span class="cx"> private:
</span><span class="cx"> virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
</span><span class="cx"> virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
</span><span class="cx">
</span><del>- RefPtr<Document> m_document;
</del><ins>+ JSDocument* m_document;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSMessageChannelConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSMessageChannelConstructor.cpp (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSMessageChannelConstructor.cpp 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSMessageChannelConstructor.cpp 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx">
</span><span class="cx"> JSMessageChannelConstructor::JSMessageChannelConstructor(ExecState* exec, Document* document)
</span><span class="cx"> : DOMObject(JSMessageChannelConstructor::createStructureID(exec->lexicalGlobalObject()->objectPrototype()))
</span><del>- , m_document(document)
</del><ins>+ , m_document(static_cast<JSDocument*>(toJS(exec, document)))
</ins><span class="cx"> {
</span><span class="cx"> putDirect(exec->propertyNames().prototype, JSMessageChannelPrototype::self(exec), None);
</span><span class="cx"> }
</span><span class="lines">@@ -55,7 +55,14 @@
</span><span class="cx">
</span><span class="cx"> JSObject* JSMessageChannelConstructor::construct(ExecState* exec, JSObject* constructor, const ArgList&)
</span><span class="cx"> {
</span><del>- return static_cast<JSObject*>(toJS(exec, MessageChannel::create(static_cast<JSMessageChannelConstructor*>(constructor)->m_document.get())));
</del><ins>+ return static_cast<JSObject*>(toJS(exec, MessageChannel::create(static_cast<JSMessageChannelConstructor*>(constructor)->document())));
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void JSMessageChannelConstructor::mark()
+{
+ DOMObject::mark();
+ if (!m_document->marked())
+ m_document->mark();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSMessageChannelConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSMessageChannelConstructor.h (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSMessageChannelConstructor.h 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSMessageChannelConstructor.h 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #define JSMessageChannelConstructor_h
</span><span class="cx">
</span><span class="cx"> #include "JSDOMBinding.h"
</span><ins>+#include "JSDocument.h"
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -39,12 +40,15 @@
</span><span class="cx"> virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
</span><span class="cx"> static const JSC::ClassInfo s_info;
</span><span class="cx">
</span><ins>+ Document* document() const { return m_document->impl(); }
+
</ins><span class="cx"> virtual bool implementsHasInstance() const { return true; }
</span><span class="cx"> static JSC::JSObject* construct(JSC::ExecState*, JSC::JSObject*, const JSC::ArgList&);
</span><span class="cx"> virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
</span><span class="cx">
</span><ins>+ virtual void mark();
</ins><span class="cx"> private:
</span><del>- RefPtr<Document> m_document;
</del><ins>+ JSDocument* m_document;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSXMLHttpRequestConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.cpp (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.cpp 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.cpp 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx">
</span><span class="cx"> JSXMLHttpRequestConstructor::JSXMLHttpRequestConstructor(ExecState* exec, Document* document)
</span><span class="cx"> : DOMObject(JSXMLHttpRequestConstructor::createStructureID(exec->lexicalGlobalObject()->objectPrototype()))
</span><del>- , m_document(document)
</del><ins>+ , m_document(static_cast<JSDocument*>(toJS(exec, document)))
</ins><span class="cx"> {
</span><span class="cx"> putDirect(exec->propertyNames().prototype, JSXMLHttpRequestPrototype::self(exec), None);
</span><span class="cx"> }
</span><span class="lines">@@ -51,4 +51,11 @@
</span><span class="cx"> return ConstructTypeHost;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void JSXMLHttpRequestConstructor::mark()
+{
+ DOMObject::mark();
+ if (!m_document->marked())
+ m_document->mark();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkWebCorebindingsjsJSXMLHttpRequestConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.h (36953 => 36954)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.h 2008-09-26 10:55:32 UTC (rev 36953)
+++ trunk/WebCore/bindings/js/JSXMLHttpRequestConstructor.h 2008-09-26 11:53:40 UTC (rev 36954)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> #define JSXMLHttpRequestConstructor_h
</span><span class="cx">
</span><span class="cx"> #include "JSDOMBinding.h"
</span><ins>+#include "JSDocument.h"
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="lines">@@ -29,14 +30,15 @@
</span><span class="cx"> class JSXMLHttpRequestConstructor : public DOMObject {
</span><span class="cx"> public:
</span><span class="cx"> JSXMLHttpRequestConstructor(JSC::ExecState*, Document*);
</span><del>- Document* document() const { return m_document.get(); }
</del><ins>+ Document* document() const { return m_document->impl(); }
</ins><span class="cx"> static const JSC::ClassInfo s_info;
</span><span class="cx">
</span><ins>+ virtual void mark();
</ins><span class="cx"> private:
</span><span class="cx"> virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
</span><span class="cx"> virtual const JSC::ClassInfo* classInfo() const { return &s_info; }
</span><span class="cx">
</span><del>- RefPtr<Document> m_document;
</del><ins>+ JSDocument* m_document;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>
</body>
</html>