| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/test/layer_tree_test_common.h" | 7 #include "cc/test/layer_tree_test_common.h" |
| 8 | 8 |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "cc/active_animation.h" | 10 #include "cc/active_animation.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 bool TestHooks::prepareToDrawOnThread(cc::LayerTreeHostImpl*) | 81 bool TestHooks::prepareToDrawOnThread(cc::LayerTreeHostImpl*) |
| 82 { | 82 { |
| 83 return true; | 83 return true; |
| 84 } | 84 } |
| 85 | 85 |
| 86 scoped_ptr<WebCompositorOutputSurface> TestHooks::createOutputSurface() | 86 scoped_ptr<WebCompositorOutputSurface> TestHooks::createOutputSurface() |
| 87 { | 87 { |
| 88 return FakeWebCompositorOutputSurface::create(CompositorFakeWebGraphicsConte
xt3DWithTextureTracking::create(WebGraphicsContext3D::Attributes()).PassAs<WebKi
t::WebGraphicsContext3D>()).PassAs<WebKit::WebCompositorOutputSurface>(); | 88 return FakeWebCompositorOutputSurface::create(CompositorFakeWebGraphicsConte
xt3DWithTextureTracking::create(WebGraphicsContext3D::Attributes()).PassAs<WebKi
t::WebGraphicsContext3D>()).PassAs<WebKit::WebCompositorOutputSurface>(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 scoped_ptr<MockLayerTreeHostImpl> MockLayerTreeHostImpl::create(TestHooks* testH
ooks, const LayerTreeSettings& settings, LayerTreeHostImplClient* client) | 91 scoped_ptr<MockLayerTreeHostImpl> MockLayerTreeHostImpl::create(TestHooks* testH
ooks, const LayerTreeSettings& settings, LayerTreeHostImplClient* client, Proxy*
proxy) |
| 92 { | 92 { |
| 93 return make_scoped_ptr(new MockLayerTreeHostImpl(testHooks, settings, client
)); | 93 return make_scoped_ptr(new MockLayerTreeHostImpl(testHooks, settings, client
, proxy)); |
| 94 } | 94 } |
| 95 | 95 |
| 96 void MockLayerTreeHostImpl::beginCommit() | 96 void MockLayerTreeHostImpl::beginCommit() |
| 97 { | 97 { |
| 98 LayerTreeHostImpl::beginCommit(); | 98 LayerTreeHostImpl::beginCommit(); |
| 99 m_testHooks->beginCommitOnThread(this); | 99 m_testHooks->beginCommitOnThread(this); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void MockLayerTreeHostImpl::commitComplete() | 102 void MockLayerTreeHostImpl::commitComplete() |
| 103 { | 103 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 124 m_testHooks->willAnimateLayers(this, monotonicTime); | 124 m_testHooks->willAnimateLayers(this, monotonicTime); |
| 125 LayerTreeHostImpl::animateLayers(monotonicTime, wallClockTime); | 125 LayerTreeHostImpl::animateLayers(monotonicTime, wallClockTime); |
| 126 m_testHooks->animateLayers(this, monotonicTime); | 126 m_testHooks->animateLayers(this, monotonicTime); |
| 127 } | 127 } |
| 128 | 128 |
| 129 base::TimeDelta MockLayerTreeHostImpl::lowFrequencyAnimationInterval() const | 129 base::TimeDelta MockLayerTreeHostImpl::lowFrequencyAnimationInterval() const |
| 130 { | 130 { |
| 131 return base::TimeDelta::FromMilliseconds(16); | 131 return base::TimeDelta::FromMilliseconds(16); |
| 132 } | 132 } |
| 133 | 133 |
| 134 MockLayerTreeHostImpl::MockLayerTreeHostImpl(TestHooks* testHooks, const LayerTr
eeSettings& settings, LayerTreeHostImplClient* client) | 134 MockLayerTreeHostImpl::MockLayerTreeHostImpl(TestHooks* testHooks, const LayerTr
eeSettings& settings, LayerTreeHostImplClient* client, Proxy* proxy) |
| 135 : LayerTreeHostImpl(settings, client) | 135 : LayerTreeHostImpl(settings, client, proxy) |
| 136 , m_testHooks(testHooks) | 136 , m_testHooks(testHooks) |
| 137 { | 137 { |
| 138 } | 138 } |
| 139 | 139 |
| 140 // Adapts LayerTreeHost for test. Injects MockLayerTreeHostImpl. | 140 // Adapts LayerTreeHost for test. Injects MockLayerTreeHostImpl. |
| 141 class MockLayerTreeHost : public cc::LayerTreeHost { | 141 class MockLayerTreeHost : public cc::LayerTreeHost { |
| 142 public: | 142 public: |
| 143 static scoped_ptr<MockLayerTreeHost> create(TestHooks* testHooks, cc::LayerT
reeHostClient* client, scoped_refptr<cc::Layer> rootLayer, const cc::LayerTreeSe
ttings& settings) | 143 static scoped_ptr<MockLayerTreeHost> create(TestHooks* testHooks, cc::LayerT
reeHostClient* client, scoped_refptr<cc::Layer> rootLayer, const cc::LayerTreeSe
ttings& settings, scoped_ptr<cc::Thread> implThread) |
| 144 { | 144 { |
| 145 scoped_ptr<MockLayerTreeHost> layerTreeHost(new MockLayerTreeHost(testHo
oks, client, settings)); | 145 scoped_ptr<MockLayerTreeHost> layerTreeHost(new MockLayerTreeHost(testHo
oks, client, settings)); |
| 146 bool success = layerTreeHost->initialize(); | 146 bool success = layerTreeHost->initialize(implThread.Pass()); |
| 147 EXPECT_TRUE(success); | 147 EXPECT_TRUE(success); |
| 148 layerTreeHost->setRootLayer(rootLayer); | 148 layerTreeHost->setRootLayer(rootLayer); |
| 149 | 149 |
| 150 // LayerTreeHostImpl won't draw if it has 1x1 viewport. | 150 // LayerTreeHostImpl won't draw if it has 1x1 viewport. |
| 151 layerTreeHost->setViewportSize(gfx::Size(1, 1), gfx::Size(1, 1)); | 151 layerTreeHost->setViewportSize(gfx::Size(1, 1), gfx::Size(1, 1)); |
| 152 | 152 |
| 153 layerTreeHost->rootLayer()->setLayerAnimationDelegate(testHooks); | 153 layerTreeHost->rootLayer()->setLayerAnimationDelegate(testHooks); |
| 154 | 154 |
| 155 return layerTreeHost.Pass(); | 155 return layerTreeHost.Pass(); |
| 156 } | 156 } |
| 157 | 157 |
| 158 virtual scoped_ptr<cc::LayerTreeHostImpl> createLayerTreeHostImpl(cc::LayerT
reeHostImplClient* client) | 158 virtual scoped_ptr<cc::LayerTreeHostImpl> createLayerTreeHostImpl(cc::LayerT
reeHostImplClient* client) |
| 159 { | 159 { |
| 160 return MockLayerTreeHostImpl::create(m_testHooks, settings(), client).Pa
ssAs<cc::LayerTreeHostImpl>(); | 160 return MockLayerTreeHostImpl::create(m_testHooks, settings(), client, pr
oxy()).PassAs<cc::LayerTreeHostImpl>(); |
| 161 } | 161 } |
| 162 | 162 |
| 163 virtual void didAddAnimation() OVERRIDE | 163 virtual void didAddAnimation() OVERRIDE |
| 164 { | 164 { |
| 165 LayerTreeHost::didAddAnimation(); | 165 LayerTreeHost::didAddAnimation(); |
| 166 m_testHooks->didAddAnimation(); | 166 m_testHooks->didAddAnimation(); |
| 167 } | 167 } |
| 168 | 168 |
| 169 virtual void setNeedsCommit() OVERRIDE | 169 virtual void setNeedsCommit() OVERRIDE |
| 170 { | 170 { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 TestHooks* m_testHooks; | 267 TestHooks* m_testHooks; |
| 268 }; | 268 }; |
| 269 | 269 |
| 270 ThreadedTest::ThreadedTest() | 270 ThreadedTest::ThreadedTest() |
| 271 : m_beginning(false) | 271 : m_beginning(false) |
| 272 , m_endWhenBeginReturns(false) | 272 , m_endWhenBeginReturns(false) |
| 273 , m_timedOut(false) | 273 , m_timedOut(false) |
| 274 , m_finished(false) | 274 , m_finished(false) |
| 275 , m_scheduled(false) | 275 , m_scheduled(false) |
| 276 , m_started(false) | 276 , m_started(false) |
| 277 , m_implThread(0) |
| 277 { | 278 { |
| 278 } | 279 } |
| 279 | 280 |
| 280 ThreadedTest::~ThreadedTest() | 281 ThreadedTest::~ThreadedTest() |
| 281 { | 282 { |
| 282 } | 283 } |
| 283 | 284 |
| 284 void ThreadedTest::endTest() | 285 void ThreadedTest::endTest() |
| 285 { | 286 { |
| 286 m_finished = true; | 287 m_finished = true; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSet
Visible, base::Unretained(this), visible)); | 339 m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchSet
Visible, base::Unretained(this), visible)); |
| 339 } | 340 } |
| 340 | 341 |
| 341 void ThreadedTest::postDidAddAnimationToMainThread() | 342 void ThreadedTest::postDidAddAnimationToMainThread() |
| 342 { | 343 { |
| 343 m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchDid
AddAnimation, base::Unretained(this))); | 344 m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchDid
AddAnimation, base::Unretained(this))); |
| 344 } | 345 } |
| 345 | 346 |
| 346 void ThreadedTest::doBeginTest() | 347 void ThreadedTest::doBeginTest() |
| 347 { | 348 { |
| 348 DCHECK(Proxy::isMainThread()); | |
| 349 m_client = ThreadedMockLayerTreeHostClient::create(this); | 349 m_client = ThreadedMockLayerTreeHostClient::create(this); |
| 350 | 350 |
| 351 scoped_refptr<Layer> rootLayer = Layer::create(); | 351 scoped_refptr<Layer> rootLayer = Layer::create(); |
| 352 m_layerTreeHost = MockLayerTreeHost::create(this, m_client.get(), rootLayer,
m_settings); | 352 scoped_ptr<cc::Thread> implCCThread(NULL); |
| 353 if (m_implThread) |
| 354 implCCThread = cc::ThreadImpl::createForDifferentThread(m_implThread->me
ssage_loop_proxy()); |
| 355 m_layerTreeHost = MockLayerTreeHost::create(this, m_client.get(), rootLayer,
m_settings, implCCThread.Pass()); |
| 353 ASSERT_TRUE(m_layerTreeHost.get()); | 356 ASSERT_TRUE(m_layerTreeHost.get()); |
| 354 rootLayer->setLayerTreeHost(m_layerTreeHost.get()); | 357 rootLayer->setLayerTreeHost(m_layerTreeHost.get()); |
| 355 m_layerTreeHost->setSurfaceReady(); | 358 m_layerTreeHost->setSurfaceReady(); |
| 356 | 359 |
| 357 m_started = true; | 360 m_started = true; |
| 358 m_beginning = true; | 361 m_beginning = true; |
| 359 beginTest(); | 362 beginTest(); |
| 360 m_beginning = false; | 363 m_beginning = false; |
| 361 if (m_endWhenBeginReturns) | 364 if (m_endWhenBeginReturns) |
| 362 realEndTest(); | 365 realEndTest(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 376 void ThreadedTest::scheduleComposite() | 379 void ThreadedTest::scheduleComposite() |
| 377 { | 380 { |
| 378 if (!m_started || m_scheduled || m_finished) | 381 if (!m_started || m_scheduled || m_finished) |
| 379 return; | 382 return; |
| 380 m_scheduled = true; | 383 m_scheduled = true; |
| 381 m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchCom
posite, base::Unretained(this))); | 384 m_mainThreadProxy->postTask(FROM_HERE, base::Bind(&ThreadedTest::dispatchCom
posite, base::Unretained(this))); |
| 382 } | 385 } |
| 383 | 386 |
| 384 void ThreadedTest::realEndTest() | 387 void ThreadedTest::realEndTest() |
| 385 { | 388 { |
| 386 DCHECK(Proxy::isMainThread()); | |
| 387 MessageLoop::current()->Quit(); | 389 MessageLoop::current()->Quit(); |
| 388 } | 390 } |
| 389 | 391 |
| 390 void ThreadedTest::dispatchSetNeedsAnimate() | 392 void ThreadedTest::dispatchSetNeedsAnimate() |
| 391 { | 393 { |
| 392 DCHECK(Proxy::isMainThread()); | 394 DCHECK(!proxy() || proxy()->isMainThread()); |
| 393 | 395 |
| 394 if (m_finished) | 396 if (m_finished) |
| 395 return; | 397 return; |
| 396 | 398 |
| 397 if (m_layerTreeHost.get()) | 399 if (m_layerTreeHost.get()) |
| 398 m_layerTreeHost->setNeedsAnimate(); | 400 m_layerTreeHost->setNeedsAnimate(); |
| 399 } | 401 } |
| 400 | 402 |
| 401 void ThreadedTest::dispatchAddInstantAnimation() | 403 void ThreadedTest::dispatchAddInstantAnimation() |
| 402 { | 404 { |
| 403 DCHECK(Proxy::isMainThread()); | 405 DCHECK(!proxy() || proxy()->isMainThread()); |
| 404 | 406 |
| 405 if (m_finished) | 407 if (m_finished) |
| 406 return; | 408 return; |
| 407 | 409 |
| 408 if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer()) | 410 if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer()) |
| 409 addOpacityTransitionToLayer(*m_layerTreeHost->rootLayer(), 0, 0, 0.5, fa
lse); | 411 addOpacityTransitionToLayer(*m_layerTreeHost->rootLayer(), 0, 0, 0.5, fa
lse); |
| 410 } | 412 } |
| 411 | 413 |
| 412 void ThreadedTest::dispatchAddAnimation(Layer* layerToReceiveAnimation) | 414 void ThreadedTest::dispatchAddAnimation(Layer* layerToReceiveAnimation) |
| 413 { | 415 { |
| 414 DCHECK(Proxy::isMainThread()); | 416 DCHECK(!proxy() || proxy()->isMainThread()); |
| 415 | 417 |
| 416 if (m_finished) | 418 if (m_finished) |
| 417 return; | 419 return; |
| 418 | 420 |
| 419 if (layerToReceiveAnimation) | 421 if (layerToReceiveAnimation) |
| 420 addOpacityTransitionToLayer(*layerToReceiveAnimation, 10, 0, 0.5, true); | 422 addOpacityTransitionToLayer(*layerToReceiveAnimation, 10, 0, 0.5, true); |
| 421 } | 423 } |
| 422 | 424 |
| 423 void ThreadedTest::dispatchSetNeedsAnimateAndCommit() | 425 void ThreadedTest::dispatchSetNeedsAnimateAndCommit() |
| 424 { | 426 { |
| 425 DCHECK(Proxy::isMainThread()); | 427 DCHECK(!proxy() || proxy()->isMainThread()); |
| 426 | 428 |
| 427 if (m_finished) | 429 if (m_finished) |
| 428 return; | 430 return; |
| 429 | 431 |
| 430 if (m_layerTreeHost.get()) { | 432 if (m_layerTreeHost.get()) { |
| 431 m_layerTreeHost->setNeedsAnimate(); | 433 m_layerTreeHost->setNeedsAnimate(); |
| 432 m_layerTreeHost->setNeedsCommit(); | 434 m_layerTreeHost->setNeedsCommit(); |
| 433 } | 435 } |
| 434 } | 436 } |
| 435 | 437 |
| 436 void ThreadedTest::dispatchSetNeedsCommit() | 438 void ThreadedTest::dispatchSetNeedsCommit() |
| 437 { | 439 { |
| 438 DCHECK(Proxy::isMainThread()); | 440 DCHECK(!proxy() || proxy()->isMainThread()); |
| 439 | 441 |
| 440 if (m_finished) | 442 if (m_finished) |
| 441 return; | 443 return; |
| 442 | 444 |
| 443 if (m_layerTreeHost.get()) | 445 if (m_layerTreeHost.get()) |
| 444 m_layerTreeHost->setNeedsCommit(); | 446 m_layerTreeHost->setNeedsCommit(); |
| 445 } | 447 } |
| 446 | 448 |
| 447 void ThreadedTest::dispatchAcquireLayerTextures() | 449 void ThreadedTest::dispatchAcquireLayerTextures() |
| 448 { | 450 { |
| 449 DCHECK(Proxy::isMainThread()); | 451 DCHECK(!proxy() || proxy()->isMainThread()); |
| 450 | 452 |
| 451 if (m_finished) | 453 if (m_finished) |
| 452 return; | 454 return; |
| 453 | 455 |
| 454 if (m_layerTreeHost.get()) | 456 if (m_layerTreeHost.get()) |
| 455 m_layerTreeHost->acquireLayerTextures(); | 457 m_layerTreeHost->acquireLayerTextures(); |
| 456 } | 458 } |
| 457 | 459 |
| 458 void ThreadedTest::dispatchSetNeedsRedraw() | 460 void ThreadedTest::dispatchSetNeedsRedraw() |
| 459 { | 461 { |
| 460 DCHECK(Proxy::isMainThread()); | 462 DCHECK(!proxy() || proxy()->isMainThread()); |
| 461 | 463 |
| 462 if (m_finished) | 464 if (m_finished) |
| 463 return; | 465 return; |
| 464 | 466 |
| 465 if (m_layerTreeHost.get()) | 467 if (m_layerTreeHost.get()) |
| 466 m_layerTreeHost->setNeedsRedraw(); | 468 m_layerTreeHost->setNeedsRedraw(); |
| 467 } | 469 } |
| 468 | 470 |
| 469 void ThreadedTest::dispatchSetVisible(bool visible) | 471 void ThreadedTest::dispatchSetVisible(bool visible) |
| 470 { | 472 { |
| 471 DCHECK(Proxy::isMainThread()); | 473 DCHECK(!proxy() || proxy()->isMainThread()); |
| 472 | 474 |
| 473 if (m_finished) | 475 if (m_finished) |
| 474 return; | 476 return; |
| 475 | 477 |
| 476 if (m_layerTreeHost.get()) | 478 if (m_layerTreeHost.get()) |
| 477 m_layerTreeHost->setVisible(visible); | 479 m_layerTreeHost->setVisible(visible); |
| 478 } | 480 } |
| 479 | 481 |
| 480 void ThreadedTest::dispatchComposite() | 482 void ThreadedTest::dispatchComposite() |
| 481 { | 483 { |
| 482 m_scheduled = false; | 484 m_scheduled = false; |
| 483 if (m_layerTreeHost.get() && !m_finished) | 485 if (m_layerTreeHost.get() && !m_finished) |
| 484 m_layerTreeHost->composite(); | 486 m_layerTreeHost->composite(); |
| 485 } | 487 } |
| 486 | 488 |
| 487 void ThreadedTest::dispatchDidAddAnimation() | 489 void ThreadedTest::dispatchDidAddAnimation() |
| 488 { | 490 { |
| 489 DCHECK(Proxy::isMainThread()); | 491 DCHECK(!proxy() || proxy()->isMainThread()); |
| 490 | 492 |
| 491 if (m_finished) | 493 if (m_finished) |
| 492 return; | 494 return; |
| 493 | 495 |
| 494 if (m_layerTreeHost.get()) | 496 if (m_layerTreeHost.get()) |
| 495 m_layerTreeHost->didAddAnimation(); | 497 m_layerTreeHost->didAddAnimation(); |
| 496 } | 498 } |
| 497 | 499 |
| 498 void ThreadedTest::runTest(bool threaded) | 500 void ThreadedTest::runTest(bool threaded) |
| 499 { | 501 { |
| 500 // For these tests, we will enable threaded animations. | 502 // For these tests, we will enable threaded animations. |
| 501 ScopedSettings scopedSettings; | 503 ScopedSettings scopedSettings; |
| 502 Settings::setAcceleratedAnimationEnabled(true); | 504 Settings::setAcceleratedAnimationEnabled(true); |
| 503 | 505 |
| 504 if (threaded) { | 506 if (threaded) { |
| 505 m_implThread.reset(new base::Thread("ThreadedTest")); | 507 m_implThread.reset(new base::Thread("ThreadedTest")); |
| 506 ASSERT_TRUE(m_implThread->Start()); | 508 ASSERT_TRUE(m_implThread->Start()); |
| 507 m_implCCThread = cc::ThreadImpl::createForDifferentThread(m_implThread->
message_loop_proxy()); | |
| 508 cc::Proxy::setImplThread(m_implCCThread.get()); | |
| 509 } | 509 } |
| 510 | 510 |
| 511 DCHECK(Proxy::isMainThread()); | 511 m_mainCCThread = cc::ThreadImpl::createForCurrentThread(); |
| 512 m_mainThreadProxy = ScopedThreadProxy::create(Proxy::mainThread()); | 512 m_mainThreadProxy = ScopedThreadProxy::create(m_mainCCThread.get()); |
| 513 | 513 |
| 514 initializeSettings(m_settings); | 514 initializeSettings(m_settings); |
| 515 | 515 |
| 516 cc::Proxy::mainThread()->postTask(base::Bind(&ThreadedTest::doBeginTest, bas
e::Unretained(this))); | 516 m_mainCCThread->postTask(base::Bind(&ThreadedTest::doBeginTest, base::Unreta
ined(this))); |
| 517 m_timeout.Reset(base::Bind(&ThreadedTest::timeout, base::Unretained(this))); | 517 m_timeout.Reset(base::Bind(&ThreadedTest::timeout, base::Unretained(this))); |
| 518 cc::Proxy::mainThread()->postDelayedTask(m_timeout.callback(), 5000); | 518 m_mainCCThread->postDelayedTask(m_timeout.callback(), 5000); |
| 519 MessageLoop::current()->Run(); | 519 MessageLoop::current()->Run(); |
| 520 if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer()) | 520 if (m_layerTreeHost.get() && m_layerTreeHost->rootLayer()) |
| 521 m_layerTreeHost->rootLayer()->setLayerTreeHost(0); | 521 m_layerTreeHost->rootLayer()->setLayerTreeHost(0); |
| 522 m_layerTreeHost.reset(); | 522 m_layerTreeHost.reset(); |
| 523 | 523 |
| 524 cc::Proxy::setImplThread(0); | |
| 525 | |
| 526 m_timeout.Cancel(); | 524 m_timeout.Cancel(); |
| 527 | 525 |
| 528 ASSERT_FALSE(m_layerTreeHost.get()); | 526 ASSERT_FALSE(m_layerTreeHost.get()); |
| 529 m_client.reset(); | 527 m_client.reset(); |
| 530 if (m_timedOut) { | 528 if (m_timedOut) { |
| 531 FAIL() << "Test timed out"; | 529 FAIL() << "Test timed out"; |
| 532 return; | 530 return; |
| 533 } | 531 } |
| 534 afterTest(); | 532 afterTest(); |
| 535 } | 533 } |
| 536 | 534 |
| 537 } // namespace WebKitTests | 535 } // namespace WebKitTests |
| OLD | NEW |