| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 m_bridge->suspend(); | 221 m_bridge->suspend(); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void WorkerThreadableWebSocketChannel::resume() | 224 void WorkerThreadableWebSocketChannel::resume() |
| 225 { | 225 { |
| 226 m_workerClientWrapper->resume(); | 226 m_workerClientWrapper->resume(); |
| 227 if (m_bridge) | 227 if (m_bridge) |
| 228 m_bridge->resume(); | 228 m_bridge->resume(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re
ference, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, Work
erLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL,
unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper
) | 231 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) |
| 232 { |
| 233 visitor->trace(m_workerClientWrapper); |
| 234 WebSocketChannel::trace(visitor); |
| 235 } |
| 236 |
| 237 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re
ference, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientW
rapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* context, const String&
sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper
> syncHelper) |
| 232 : m_workerClientWrapper(clientWrapper) | 238 : m_workerClientWrapper(clientWrapper) |
| 233 , m_loaderProxy(loaderProxy) | 239 , m_loaderProxy(loaderProxy) |
| 234 , m_mainWebSocketChannel(nullptr) | 240 , m_mainWebSocketChannel(nullptr) |
| 235 , m_syncHelper(syncHelper) | 241 , m_syncHelper(syncHelper) |
| 236 , m_weakFactory(reference, this) | 242 , m_weakFactory(reference, this) |
| 237 { | 243 { |
| 238 ASSERT(isMainThread()); | 244 ASSERT(isMainThread()); |
| 239 ASSERT(m_workerClientWrapper.get()); | 245 ASSERT(m_workerClientWrapper.get()); |
| 240 | 246 |
| 241 Document* document = toDocument(context); | 247 Document* document = toDocument(context); |
| 242 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { | 248 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { |
| 243 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this,
sourceURL, lineNumber); | 249 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this,
sourceURL, lineNumber); |
| 244 } else { | 250 } else { |
| 245 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th
is, sourceURL, lineNumber); | 251 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th
is, sourceURL, lineNumber); |
| 246 } | 252 } |
| 247 | 253 |
| 248 m_syncHelper->signalWorkerThread(); | 254 m_syncHelper->signalWorkerThread(); |
| 249 } | 255 } |
| 250 | 256 |
| 251 WorkerThreadableWebSocketChannel::Peer::~Peer() | 257 WorkerThreadableWebSocketChannel::Peer::~Peer() |
| 252 { | 258 { |
| 253 ASSERT(isMainThread()); | 259 ASSERT(isMainThread()); |
| 254 if (m_mainWebSocketChannel) | 260 if (m_mainWebSocketChannel) |
| 255 m_mainWebSocketChannel->disconnect(); | 261 m_mainWebSocketChannel->disconnect(); |
| 256 } | 262 } |
| 257 | 263 |
| 258 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex
t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P
assRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, const String&
sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<ThreadableWeb
SocketChannelSyncHelper> syncHelper) | 264 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex
t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, co
nst String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<T
hreadableWebSocketChannelSyncHelper> syncHelper) |
| 259 { | 265 { |
| 260 // The caller must call destroy() to free the peer. | 266 // The caller must call destroy() to free the peer. |
| 261 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect
ion, lineNumberAtConnection, syncHelper); | 267 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect
ion, lineNumberAtConnection, syncHelper); |
| 262 } | 268 } |
| 263 | 269 |
| 264 void WorkerThreadableWebSocketChannel::Peer::destroy() | 270 void WorkerThreadableWebSocketChannel::Peer::destroy() |
| 265 { | 271 { |
| 266 ASSERT(isMainThread()); | 272 ASSERT(isMainThread()); |
| 267 delete this; | 273 delete this; |
| 268 } | 274 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 374 } |
| 369 | 375 |
| 370 void WorkerThreadableWebSocketChannel::Peer::resume() | 376 void WorkerThreadableWebSocketChannel::Peer::resume() |
| 371 { | 377 { |
| 372 ASSERT(isMainThread()); | 378 ASSERT(isMainThread()); |
| 373 if (!m_mainWebSocketChannel) | 379 if (!m_mainWebSocketChannel) |
| 374 return; | 380 return; |
| 375 m_mainWebSocketChannel->resume(); | 381 m_mainWebSocketChannel->resume(); |
| 376 } | 382 } |
| 377 | 383 |
| 378 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th
readableWebSocketChannelClientWrapper> workerClientWrapper, const String& subpro
tocol, const String& extensions) | 384 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil
lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St
ring& subprotocol, const String& extensions) |
| 379 { | 385 { |
| 380 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 386 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 381 workerClientWrapper->setSubprotocol(subprotocol); | 387 workerClientWrapper->setSubprotocol(subprotocol); |
| 382 workerClientWrapper->setExtensions(extensions); | 388 workerClientWrapper->setExtensions(extensions); |
| 383 workerClientWrapper->didConnect(); | 389 workerClientWrapper->didConnect(); |
| 384 } | 390 } |
| 385 | 391 |
| 386 void WorkerThreadableWebSocketChannel::Peer::didConnect() | 392 void WorkerThreadableWebSocketChannel::Peer::didConnect() |
| 387 { | 393 { |
| 388 ASSERT(isMainThread()); | 394 ASSERT(isMainThread()); |
| 389 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_m
ainWebSocketChannel->extensions())); | 395 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol(
), m_mainWebSocketChannel->extensions())); |
| 390 } | 396 } |
| 391 | 397 |
| 392 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe
fPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String&
message) | 398 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe
fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c
onst String& message) |
| 393 { | 399 { |
| 394 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 400 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 395 workerClientWrapper->didReceiveMessage(message); | 401 workerClientWrapper->didReceiveMessage(message); |
| 396 } | 402 } |
| 397 | 403 |
| 398 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes
sage) | 404 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes
sage) |
| 399 { | 405 { |
| 400 ASSERT(isMainThread()); | 406 ASSERT(isMainThread()); |
| 401 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessage, m_workerClientWrapper, message)); | 407 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessage, m_workerClientWrapper.get(), message)); |
| 402 } | 408 } |
| 403 | 409 |
| 404 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas
sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr
<Vector<char> > binaryData) | 410 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas
sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper
, PassOwnPtr<Vector<char> > binaryData) |
| 405 { | 411 { |
| 406 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 412 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 407 workerClientWrapper->didReceiveBinaryData(binaryData); | 413 workerClientWrapper->didReceiveBinaryData(binaryData); |
| 408 } | 414 } |
| 409 | 415 |
| 410 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) | 416 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) |
| 411 { | 417 { |
| 412 ASSERT(isMainThread()); | 418 ASSERT(isMainThread()); |
| 413 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); | 419 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); |
| 414 } | 420 } |
| 415 | 421 |
| 416 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context,
PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigne
d long bufferedAmount) | 422 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap
per, unsigned long bufferedAmount) |
| 417 { | 423 { |
| 418 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 424 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 419 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); | 425 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); |
| 420 } | 426 } |
| 421 | 427 |
| 422 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo
ng bufferedAmount) | 428 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo
ng bufferedAmount) |
| 423 { | 429 { |
| 424 ASSERT(isMainThread()); | 430 ASSERT(isMainThread()); |
| 425 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); | 431 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); |
| 426 } | 432 } |
| 427 | 433 |
| 428 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) | 434 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper) |
| 429 { | 435 { |
| 430 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 436 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 431 workerClientWrapper->didStartClosingHandshake(); | 437 workerClientWrapper->didStartClosingHandshake(); |
| 432 } | 438 } |
| 433 | 439 |
| 434 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() | 440 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
| 435 { | 441 { |
| 436 ASSERT(isMainThread()); | 442 ASSERT(isMainThread()); |
| 437 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper)); | 443 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper.get())); |
| 438 } | 444 } |
| 439 | 445 |
| 440 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<Thre
adableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandle
dBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closin
gHandshakeCompletion, unsigned short code, const String& reason) | 446 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB
eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l
ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS
tatus closingHandshakeCompletion, unsigned short code, const String& reason) |
| 441 { | 447 { |
| 442 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 448 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 443 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); | 449 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); |
| 444 } | 450 } |
| 445 | 451 |
| 446 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) | 452 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) |
| 447 { | 453 { |
| 448 ASSERT(isMainThread()); | 454 ASSERT(isMainThread()); |
| 449 m_mainWebSocketChannel = nullptr; | 455 m_mainWebSocketChannel = nullptr; |
| 450 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCom
pletion, code, reason)); | 456 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh
akeCompletion, code, reason)); |
| 451 } | 457 } |
| 452 | 458 |
| 453 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) | 459 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp
er) |
| 454 { | 460 { |
| 455 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 461 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 456 workerClientWrapper->didReceiveMessageError(); | 462 workerClientWrapper->didReceiveMessageError(); |
| 457 } | 463 } |
| 458 | 464 |
| 459 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 465 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
| 460 { | 466 { |
| 461 ASSERT(isMainThread()); | 467 ASSERT(isMainThread()); |
| 462 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessageError, m_workerClientWrapper)); | 468 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessageError, m_workerClientWrapper.get())); |
| 463 } | 469 } |
| 464 | 470 |
| 465 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) | 471 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab
leWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerG
lobalScope) |
| 466 : m_workerClientWrapper(workerClientWrapper) | 472 : m_workerClientWrapper(workerClientWrapper) |
| 467 , m_workerGlobalScope(workerGlobalScope) | 473 , m_workerGlobalScope(workerGlobalScope) |
| 468 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) | 474 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) |
| 469 , m_syncHelper(0) | 475 , m_syncHelper(0) |
| 470 { | 476 { |
| 471 ASSERT(m_workerClientWrapper.get()); | 477 ASSERT(m_workerClientWrapper.get()); |
| 472 } | 478 } |
| 473 | 479 |
| 474 WorkerThreadableWebSocketChannel::Bridge::~Bridge() | 480 WorkerThreadableWebSocketChannel::Bridge::~Bridge() |
| 475 { | 481 { |
| 476 disconnect(); | 482 disconnect(); |
| 477 } | 483 } |
| 478 | 484 |
| 479 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
L, unsigned lineNumber) | 485 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
L, unsigned lineNumber) |
| 480 { | 486 { |
| 481 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound(
); | 487 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound(
); |
| 482 m_peer = WeakPtr<Peer>(reference); | 488 m_peer = WeakPtr<Peer>(reference); |
| 483 | 489 |
| 484 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke
tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv
ent())); | 490 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke
tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv
ent())); |
| 485 // This pointer is guaranteed to be valid until we call terminatePeer. | 491 // This pointer is guaranteed to be valid until we call terminatePeer. |
| 486 m_syncHelper = syncHelper.get(); | 492 m_syncHelper = syncHelper.get(); |
| 487 | 493 |
| 488 RefPtr<Bridge> protect(this); | 494 RefPtr<Bridge> protect(this); |
| 489 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference
.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourc
eURL, lineNumber, syncHelper.release()))) { | 495 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference
.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(),
sourceURL, lineNumber, syncHelper.release()))) { |
| 490 // The worker thread has been signalled to shutdown before method comple
tion. | 496 // The worker thread has been signalled to shutdown before method comple
tion. |
| 491 terminatePeer(); | 497 terminatePeer(); |
| 492 } | 498 } |
| 493 } | 499 } |
| 494 | 500 |
| 495 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) | 501 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) |
| 496 { | 502 { |
| 497 if (hasTerminatedPeer()) | 503 if (hasTerminatedPeer()) |
| 498 return false; | 504 return false; |
| 499 | 505 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); | 630 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); |
| 625 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. | 631 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. |
| 626 // We must not touch m_syncHelper any more. | 632 // We must not touch m_syncHelper any more. |
| 627 m_syncHelper = 0; | 633 m_syncHelper = 0; |
| 628 | 634 |
| 629 // We won't use this any more. | 635 // We won't use this any more. |
| 630 m_workerGlobalScope = nullptr; | 636 m_workerGlobalScope = nullptr; |
| 631 } | 637 } |
| 632 | 638 |
| 633 } // namespace WebCore | 639 } // namespace WebCore |
| OLD | NEW |