Index: Source/bindings/core/v8/ScriptStreamerTest.cpp |
diff --git a/Source/bindings/core/v8/ScriptStreamerTest.cpp b/Source/bindings/core/v8/ScriptStreamerTest.cpp |
index 261971d5a9d49fce95e2f4cb53211c229671eb46..825498908690f6157cf22d48b6b3fb5c1cfeec20 100644 |
--- a/Source/bindings/core/v8/ScriptStreamerTest.cpp |
+++ b/Source/bindings/core/v8/ScriptStreamerTest.cpp |
@@ -12,6 +12,7 @@ |
#include "core/dom/PendingScript.h" |
#include "core/frame/Settings.h" |
#include "platform/Task.h" |
+#include "platform/heap/Handle.h" |
#include "public/platform/Platform.h" |
#include <gtest/gtest.h> |
@@ -21,6 +22,41 @@ namespace blink { |
namespace { |
+// For the benefit of Oilpan, put the part object PendingScript inside |
+// a wrapper that's on the Oilpan heap and hold a reference to that wrapper |
+// from ScriptStreamingTest. |
+class PendingScriptWrapper : public NoBaseWillBeGarbageCollectedFinalized<PendingScriptWrapper> { |
+public: |
+ static PassOwnPtrWillBeRawPtr<PendingScriptWrapper> create() |
+ { |
+ return adoptPtrWillBeNoop(new PendingScriptWrapper()); |
+ } |
+ |
+ static PassOwnPtrWillBeRawPtr<PendingScriptWrapper> create(Element* element, ScriptResource* resource) |
+ { |
+ return adoptPtrWillBeNoop(new PendingScriptWrapper(element, resource)); |
+ } |
+ |
+ PendingScript& get() { return m_pendingScript; } |
+ |
+ void trace(Visitor* visitor) |
+ { |
+ visitor->trace(m_pendingScript); |
+ } |
+ |
+private: |
+ PendingScriptWrapper() |
+ { |
+ } |
+ |
+ PendingScriptWrapper(Element* element, ScriptResource* resource) |
+ : m_pendingScript(PendingScript(element, resource)) |
+ { |
+ } |
+ |
+ PendingScript m_pendingScript; |
+}; |
+ |
class ScriptStreamingTest : public testing::Test { |
public: |
ScriptStreamingTest() |
@@ -28,7 +64,7 @@ public: |
, m_settings(Settings::create()) |
, m_resourceRequest("http://www.streaming-test.com/") |
, m_resource(new ScriptResource(m_resourceRequest, "text/utf-8")) |
- , m_pendingScript(0, m_resource) // Takes ownership of m_resource. |
+ , m_pendingScript(PendingScriptWrapper::create(0, m_resource)) // Takes ownership of m_resource. |
{ |
m_settings->setV8ScriptStreamingEnabled(true); |
m_resource->setLoading(true); |
@@ -37,10 +73,7 @@ public: |
ScriptState* scriptState() const { return m_scope.scriptState(); } |
v8::Isolate* isolate() const { return m_scope.isolate(); } |
- void trace(Visitor* visitor) |
- { |
- visitor->trace(m_pendingScript); |
- } |
+ PendingScript& pendingScript() const { return m_pendingScript->get(); } |
protected: |
void appendData(const char* data) |
@@ -85,7 +118,7 @@ protected: |
// ScriptResource::appendData. |
ResourceRequest m_resourceRequest; |
ScriptResource* m_resource; |
- PendingScript m_pendingScript; |
+ OwnPtrWillBePersistent<PendingScriptWrapper> m_pendingScript; |
}; |
class TestScriptResourceClient : public ScriptResourceClient { |
@@ -104,9 +137,9 @@ private: |
TEST_F(ScriptStreamingTest, CompilingStreamedScript) |
{ |
// Test that we can successfully compile a streamed script. |
- bool started = ScriptStreamer::startStreaming(m_pendingScript, m_settings.get(), m_scope.scriptState()); |
+ bool started = ScriptStreamer::startStreaming(pendingScript(), m_settings.get(), m_scope.scriptState()); |
TestScriptResourceClient client; |
- m_pendingScript.watchForLoad(&client); |
+ pendingScript().watchForLoad(&client); |
EXPECT_TRUE(started); |
appendData("function foo() {"); |
@@ -122,7 +155,7 @@ TEST_F(ScriptStreamingTest, CompilingStreamedScript) |
processTasksUntilStreamingComplete(); |
EXPECT_TRUE(client.finished()); |
bool errorOccurred = false; |
- ScriptSourceCode sourceCode = m_pendingScript.getSource(KURL(), errorOccurred); |
+ ScriptSourceCode sourceCode = pendingScript().getSource(KURL(), errorOccurred); |
EXPECT_FALSE(errorOccurred); |
EXPECT_TRUE(sourceCode.streamer()); |
v8::TryCatch tryCatch; |
@@ -136,9 +169,9 @@ TEST_F(ScriptStreamingTest, CompilingStreamedScriptWithParseError) |
// Test that scripts with parse errors are handled properly. In those cases, |
// the V8 side typically finished before loading finishes: make sure we |
// handle it gracefully. |
- bool started = ScriptStreamer::startStreaming(m_pendingScript, m_settings.get(), m_scope.scriptState()); |
+ bool started = ScriptStreamer::startStreaming(pendingScript(), m_settings.get(), m_scope.scriptState()); |
TestScriptResourceClient client; |
- m_pendingScript.watchForLoad(&client); |
+ pendingScript().watchForLoad(&client); |
EXPECT_TRUE(started); |
appendData("function foo() {"); |
appendData("this is the part which will be a parse error"); |
@@ -156,7 +189,7 @@ TEST_F(ScriptStreamingTest, CompilingStreamedScriptWithParseError) |
EXPECT_TRUE(client.finished()); |
bool errorOccurred = false; |
- ScriptSourceCode sourceCode = m_pendingScript.getSource(KURL(), errorOccurred); |
+ ScriptSourceCode sourceCode = pendingScript().getSource(KURL(), errorOccurred); |
EXPECT_FALSE(errorOccurred); |
EXPECT_TRUE(sourceCode.streamer()); |
v8::TryCatch tryCatch; |
@@ -169,9 +202,9 @@ TEST_F(ScriptStreamingTest, CancellingStreaming) |
{ |
// Test that the upper layers (PendingScript and up) can be ramped down |
// while streaming is ongoing, and ScriptStreamer handles it gracefully. |
- bool started = ScriptStreamer::startStreaming(m_pendingScript, m_settings.get(), m_scope.scriptState()); |
+ bool started = ScriptStreamer::startStreaming(pendingScript(), m_settings.get(), m_scope.scriptState()); |
TestScriptResourceClient client; |
- m_pendingScript.watchForLoad(&client); |
+ pendingScript().watchForLoad(&client); |
EXPECT_TRUE(started); |
appendData("function foo() {"); |
@@ -182,8 +215,8 @@ TEST_F(ScriptStreamingTest, CancellingStreaming) |
// Simulate cancelling the network load (e.g., because the user navigated |
// away). |
EXPECT_FALSE(client.finished()); |
- m_pendingScript.stopWatchingForLoad(&client); |
- m_pendingScript = PendingScript(); // This will destroy m_resource. |
+ pendingScript().stopWatchingForLoad(&client); |
+ m_pendingScript = PendingScriptWrapper::create(); // This will destroy m_resource. |
m_resource = 0; |
// The V8 side will complete too. This should not crash. We don't receive |
@@ -198,9 +231,9 @@ TEST_F(ScriptStreamingTest, SuppressingStreaming) |
// is suppressed (V8 doesn't parse while the script is loading), and the |
// upper layer (ScriptResourceClient) should get a notification when the |
// script is loaded. |
- bool started = ScriptStreamer::startStreaming(m_pendingScript, m_settings.get(), m_scope.scriptState()); |
+ bool started = ScriptStreamer::startStreaming(pendingScript(), m_settings.get(), m_scope.scriptState()); |
TestScriptResourceClient client; |
- m_pendingScript.watchForLoad(&client); |
+ pendingScript().watchForLoad(&client); |
EXPECT_TRUE(started); |
appendData("function foo() {"); |
appendPadding(); |
@@ -213,7 +246,7 @@ TEST_F(ScriptStreamingTest, SuppressingStreaming) |
EXPECT_TRUE(client.finished()); |
bool errorOccurred = false; |
- ScriptSourceCode sourceCode = m_pendingScript.getSource(KURL(), errorOccurred); |
+ ScriptSourceCode sourceCode = pendingScript().getSource(KURL(), errorOccurred); |
EXPECT_FALSE(errorOccurred); |
// ScriptSourceCode doesn't refer to the streamer, since we have suppressed |
// the streaming and resumed the non-streaming code path for script |