From 808853e4690ee32448bba71bb0de042e3ba2d77a Mon Sep 17 00:00:00 2001 From: Holger Kohnen Date: Thu, 4 Jul 2019 00:44:03 +0200 Subject: [PATCH] fixes #14 - buffer all events and check buffer always --- src/ChromeDevtoolsProtocol/DevtoolsClient.php | 24 ++++++------------- src/ChromeDevtoolsProtocol/Session.php | 24 ++++++------------- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/src/ChromeDevtoolsProtocol/DevtoolsClient.php b/src/ChromeDevtoolsProtocol/DevtoolsClient.php index 4135fd4a..7441b4d8 100644 --- a/src/ChromeDevtoolsProtocol/DevtoolsClient.php +++ b/src/ChromeDevtoolsProtocol/DevtoolsClient.php @@ -109,27 +109,21 @@ public function awaitEvent(ContextInterface $ctx, string $method) $this->eventBuffers = []; for (; ;) { - $eventMessage = null; - $this->getWsClient()->setDeadline($ctx->getDeadline()); foreach ($this->getWsClient()->receive() ?: [] as $payload) { /** @var Payload $payload */ $message = json_decode($payload->getPayload()); - $nextEventMessage = $this->handleMessage($message, $eventMessage === null ? $method : null); - - if ($nextEventMessage !== null) { - $eventMessage = $nextEventMessage; - } + $this->handleMessage($message); } - if ($eventMessage !== null) { - return $eventMessage->params; + if (!empty($this->eventBuffers[$method])) { + return array_shift($this->eventBuffers[$method])->params; } } } - private function handleMessage($message, ?string $returnIfEventMethod = null) + private function handleMessage($message) { if (isset($message->error)) { throw new ErrorException($message->error->message, $message->error->code); @@ -141,14 +135,10 @@ private function handleMessage($message, ?string $returnIfEventMethod = null) } } - if ($returnIfEventMethod !== null && $message->method === $returnIfEventMethod) { - return $message; - } else { - if (!isset($this->eventBuffers[$message->method])) { - $this->eventBuffers[$message->method] = []; - } - array_push($this->eventBuffers[$message->method], $message); + if (!isset($this->eventBuffers[$message->method])) { + $this->eventBuffers[$message->method] = []; } + array_push($this->eventBuffers[$message->method], $message); } else if (isset($message->id)) { $this->commandResults[$message->id] = $message->result ?? new \stdClass(); diff --git a/src/ChromeDevtoolsProtocol/Session.php b/src/ChromeDevtoolsProtocol/Session.php index 0e385569..cbc2cee4 100644 --- a/src/ChromeDevtoolsProtocol/Session.php +++ b/src/ChromeDevtoolsProtocol/Session.php @@ -114,21 +114,15 @@ public function awaitEvent(ContextInterface $ctx, string $method) } for (; ;) { - $eventMessage = null; - $receivedMessage = $this->browser->target()->awaitReceivedMessageFromTarget($ctx); if ($receivedMessage->targetId === $this->targetId && $receivedMessage->sessionId === $this->sessionId) { - $nextEventMessage = $this->handleMessage(json_decode($receivedMessage->message), $method); - - if ($eventMessage === null && $nextEventMessage !== null) { - $eventMessage = $nextEventMessage; - } + $this->handleMessage(json_decode($receivedMessage->message)); } - if ($eventMessage !== null) { - return $eventMessage->params; + if (!empty($this->eventBuffers[$method])) { + return array_shift($this->eventBuffers[$method])->params; } } } @@ -136,7 +130,7 @@ public function awaitEvent(ContextInterface $ctx, string $method) /** * @internal */ - private function handleMessage($message, ?string $returnIfEventMethod = null) + private function handleMessage($message) { if (isset($message->error)) { throw new ErrorException($message->error->message, $message->error->code); @@ -148,14 +142,10 @@ private function handleMessage($message, ?string $returnIfEventMethod = null) } } - if ($returnIfEventMethod !== null && $message->method === $returnIfEventMethod) { - return $message; - } else { - if (!isset($this->eventBuffers[$message->method])) { - $this->eventBuffers[$message->method] = []; - } - array_push($this->eventBuffers[$message->method], $message); + if (!isset($this->eventBuffers[$message->method])) { + $this->eventBuffers[$message->method] = []; } + array_push($this->eventBuffers[$message->method], $message); } else if (isset($message->id)) { $this->commandResults[$message->id] = $message->result ?? new \stdClass();