| Index: Source/web/tests/TouchActionTest.cpp
 | 
| diff --git a/Source/web/tests/TouchActionTest.cpp b/Source/web/tests/TouchActionTest.cpp
 | 
| index f5d1c4f26d8f82dd13076aaf73805219b925f6ac..648a08de5edc034d8b9bd0d0f9ee5ff862d54296 100644
 | 
| --- a/Source/web/tests/TouchActionTest.cpp
 | 
| +++ b/Source/web/tests/TouchActionTest.cpp
 | 
| @@ -131,9 +131,19 @@ void TouchActionTest::runTouchActionTest(std::string file)
 | 
|  {
 | 
|      TouchActionTrackingWebViewClient client;
 | 
|  
 | 
| +    // runTouchActionTest() loads a document in a frame, setting up a
 | 
| +    // nested message loop. Should any Oilpan GC happen while it is in
 | 
| +    // effect, the implicit assumption that we're outside any event
 | 
| +    // loop (=> there being no pointers on the stack needing scanning)
 | 
| +    // when that GC strikes will no longer hold.
 | 
| +    //
 | 
| +    // To ensure that the references on the stack are also traced, we
 | 
| +    // turn them into persistent, stack allocated references. This
 | 
| +    // workaround is sufficient to handle this artificial test
 | 
| +    // scenario.
 | 
|      WebView* webView = setupTest(file, client);
 | 
|  
 | 
| -    RefPtrWillBeRawPtr<WebCore::Document> document = static_cast<PassRefPtrWillBeRawPtr<WebCore::Document> >(webView->mainFrame()->document());
 | 
| +    RefPtrWillBePersistent<WebCore::Document> document = static_cast<PassRefPtrWillBeRawPtr<WebCore::Document> >(webView->mainFrame()->document());
 | 
|      runTestOnTree(document.get(), webView, client);
 | 
|  
 | 
|      m_webViewHelper.reset(); // Explicitly reset to break dependency on locally scoped client.
 | 
| @@ -146,8 +156,10 @@ void TouchActionTest::runShadowDOMTest(std::string file)
 | 
|      WebView* webView = setupTest(file, client);
 | 
|  
 | 
|      WebCore::TrackExceptionState es;
 | 
| -    RefPtrWillBeRawPtr<WebCore::Document> document = static_cast<PassRefPtrWillBeRawPtr<WebCore::Document> >(webView->mainFrame()->document());
 | 
| -    RefPtr<WebCore::NodeList> hostNodes = document->querySelectorAll("[shadow-host]", es);
 | 
| +
 | 
| +    // Oilpan: see runTouchActionTest() comment why these are persistent references.
 | 
| +    RefPtrWillBePersistent<WebCore::Document> document = static_cast<PassRefPtrWillBeRawPtr<WebCore::Document> >(webView->mainFrame()->document());
 | 
| +    RefPtrWillBePersistent<WebCore::NodeList> hostNodes = document->querySelectorAll("[shadow-host]", es);
 | 
|      ASSERT_FALSE(es.hadException());
 | 
|      ASSERT_GE(hostNodes->length(), 1u);
 | 
|  
 | 
| @@ -186,7 +198,9 @@ void TouchActionTest::runTestOnTree(WebCore::ContainerNode* root, WebView* webVi
 | 
|  {
 | 
|      // Find all elements to test the touch-action of in the document.
 | 
|      WebCore::TrackExceptionState es;
 | 
| -    RefPtr<WebCore::NodeList> nodes = root->querySelectorAll("[expected-action]", es);
 | 
| +
 | 
| +    // Oilpan: see runTouchActionTest() comment why these are persistent references.
 | 
| +    RefPtrWillBePersistent<WebCore::NodeList> nodes = root->querySelectorAll("[expected-action]", es);
 | 
|      ASSERT_FALSE(es.hadException());
 | 
|  
 | 
|      for (unsigned index = 0; index < nodes->length(); index++) {
 | 
| @@ -209,9 +223,9 @@ void TouchActionTest::runTestOnTree(WebCore::ContainerNode* root, WebView* webVi
 | 
|          // Note that we don't want the bounding box because our tests sometimes have elements with
 | 
|          // multiple border boxes with other elements in between. Use the first border box (which
 | 
|          // we can easily visualize in a browser for debugging).
 | 
| -        RefPtrWillBeRawPtr<WebCore::ClientRectList> rects = element->getClientRects();
 | 
| +        RefPtrWillBePersistent<WebCore::ClientRectList> rects = element->getClientRects();
 | 
|          ASSERT_GE(rects->length(), 0u) << failureContext;
 | 
| -        RefPtrWillBeRawPtr<WebCore::ClientRect> r = rects->item(0);
 | 
| +        RefPtrWillBePersistent<WebCore::ClientRect> r = rects->item(0);
 | 
|          WebCore::FloatRect clientFloatRect = WebCore::FloatRect(r->left(), r->top(), r->width(), r->height());
 | 
|          WebCore::IntRect clientRect =  enclosedIntRect(clientFloatRect);
 | 
|          for (int locIdx = 0; locIdx < 3; locIdx++) {
 | 
| 
 |