-
Notifications
You must be signed in to change notification settings - Fork 278
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[1.9] Fix rare crash in getHtml #516
Conversation
for a split second, documentElement might be missing, causing getHtml() to crash. I had a program that was doing page stuff and calling getHtml() like every 10 milliseconds (100 times per second), and got an unexpected crash. Was able to create a small reproducible sample: ```php <?php declare(strict_types=1); require_once('vendor/autoload.php'); $chromeBinary = "/snap/bin/chromium"; $browser_factory = new \HeadlessChromium\BrowserFactory($chromeBinary); $browser_factory->setOptions([ "headless" => true, "noSandbox" => true, 'windowSize' => [1000, 1000] ]); $browser = $browser_factory->createBrowser(); $page = $browser->createPage(); for ($i = 0; $i < 100; ++$i) { $page->navigate("http://example.com"); $html = $page->getHtml(); $page->navigate("http://example.org"); $html = $page->getHtml(); } ``` consistently crash with: ``` PHP Fatal error: Uncaught HeadlessChromium\Exception\JavascriptException: Error during javascript evaluation: TypeError: Cannot read properties of null (reading 'outerHTML') at <anonymous>:1:26 in /home/hans/projects/ibkr/vendor/chrome-php/chrome/src/PageUtils/PageEvaluation.php:89 Stack trace: #0 /home/hans/projects/ibkr/vendor/chrome-php/chrome/src/PageUtils/PageEvaluation.php(108): HeadlessChromium\PageUtils\PageEvaluation->waitForResponse() chrome-php#1 /home/hans/projects/ibkr/vendor/chrome-php/chrome/src/Page.php(894): HeadlessChromium\PageUtils\PageEvaluation->getReturnValue() chrome-php#2 /home/hans/projects/ibkr/test_crash.php(16): HeadlessChromium\Page->getHtml() chrome-php#3 {main} thrown in /home/hans/projects/ibkr/vendor/chrome-php/chrome/src/PageUtils/PageEvaluation.php on line 89 ```
Nice catch, but infinite loops makes me uneasy. If We should also add The comments inside the method are unnecessary since the code itself explains what is being done and the PR linked to that commit explains why. |
Actually I think we don't even need to throw |
thanks!
it only tries 2 times, which is all it needs :) (there's no infinite loop in the PR)
i've only observed it being null for less than 1 millisecond, and it's not
if this PR gets merged, i don't think it will throw JavascriptException, it's not supposed to anyway, that last throw $e; is supposed to be unreachable (but i want to keep it anyway just in case I'm wrong about it being unreachable) |
My mistake, I was reviewing it quickly on my phone and thought the method was calling itself in the catch, but it was just trying to evaluate twice. The |
requested at chrome-php#516 (comment)
ok, so want me to add |
Yeap, just in case. |
possibly throws JavascriptException
it's a chore, but it should probably be cherry-picked to every maintained branch, most notably the 1.10 branch
but I'm not a git expert. |
We only maintain the current version. Everyone using v1.8 can update to 1.9 without breaking anything. |
That's not how we manage branches. 1.9 and 1.10 are not totally separate codebases. We merge upwards, periodically. |
I'm looking into rolling back this change, and replacing it with a proper fix: #664. |
for a split second, documentElement might be missing, causing getHtml() to crash. I had a program that was doing page stuff and calling getHtml() like every 10 milliseconds (100 times per second), and got an unexpected crash. Was able to create a small reproducible sample:
consistently crash with: