Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions bdi
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ use DBrekelmans\BrowserDriverInstaller\Browser;
use DBrekelmans\BrowserDriverInstaller\Browser\Chromium;
use DBrekelmans\BrowserDriverInstaller\Browser\Firefox;
use DBrekelmans\BrowserDriverInstaller\Browser\GoogleChrome;
use DBrekelmans\BrowserDriverInstaller\Browser\MsEdge;
use DBrekelmans\BrowserDriverInstaller\Command\DetectCommand;
use DBrekelmans\BrowserDriverInstaller\CommandLine\ShellCommandLineEnvironment;
use DBrekelmans\BrowserDriverInstaller\Driver;
use DBrekelmans\BrowserDriverInstaller\Driver\ChromeDriver;
use DBrekelmans\BrowserDriverInstaller\Driver\GeckoDriver;
use DBrekelmans\BrowserDriverInstaller\Driver\MsEdgeDriver;
use Symfony\Component\Console\Application;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpClient\NativeHttpClient;
Expand All @@ -37,23 +39,23 @@ $browserPathResolverFactory = new Browser\PathResolverFactory();
$browserPathResolverFactory->register(new GoogleChrome\PathResolver());
$browserPathResolverFactory->register(new Chromium\PathResolver());
$browserPathResolverFactory->register(new Firefox\PathResolver());
$browserPathResolverFactory->register(new MsEdge\PathResolver());

$browserVersionResolverFactory = new Browser\VersionResolverFactory();
$browserVersionResolverFactory->register(new GoogleChrome\VersionResolver($shellCommandLineEnv));
$browserVersionResolverFactory->register(new Chromium\VersionResolver($shellCommandLineEnv));
$browserVersionResolverFactory->register(new Firefox\VersionResolver($shellCommandLineEnv));
$browserVersionResolverFactory->register(new MsEdge\VersionResolver($shellCommandLineEnv));

$driverVersionResolverFactory = new Driver\VersionResolverFactory();
$chromeDriverVersionResolver = new ChromeDriver\VersionResolver($httpClient);
$geckoDriverVersionResolver = new GeckoDriver\VersionResolver($httpClient);
$driverVersionResolverFactory->register($chromeDriverVersionResolver);
$driverVersionResolverFactory->register($geckoDriverVersionResolver);

$chromeDriverDownloadUrlResolver = new ChromeDriver\DownloadUrlResolver($httpClient);
$driverVersionResolverFactory->register($chromeDriverVersionResolver = new ChromeDriver\VersionResolver($httpClient));
$driverVersionResolverFactory->register($geckoDriverVersionResolver = new GeckoDriver\VersionResolver($httpClient));
$driverVersionResolverFactory->register($msedgeDriverVersionResolver = new MsEdgeDriver\VersionResolver($httpClient));

$driverDownloaderFactory = new Driver\DownloaderFactory();
$driverDownloaderFactory->register(new ChromeDriver\Downloader($filesystem, $httpClient, $multiExtractor, $chromeDriverDownloadUrlResolver));
$driverDownloaderFactory->register(new ChromeDriver\Downloader($filesystem, $httpClient, $multiExtractor, $chromeDriverDownloadUrlResolver = new ChromeDriver\DownloadUrlResolver($httpClient)));
$driverDownloaderFactory->register(new GeckoDriver\Downloader($filesystem, $httpClient, $multiExtractor));
$driverDownloaderFactory->register(new MsEdgeDriver\Downloader($filesystem, $httpClient, $multiExtractor, $msedgeDriverDownloadUrlResolver = new MsEdgeDriver\DownloadUrlResolver()));

$browserFactory = new Browser\BrowserFactory($browserPathResolverFactory, $browserVersionResolverFactory);
$driverFactory = new Driver\DriverFactory($driverVersionResolverFactory);
Expand All @@ -64,6 +66,7 @@ $application->add(new Chromium\Command($filesystem, $browserFactory, $driverFact
$application->add(new Firefox\Command($filesystem, $browserFactory, $driverFactory, $driverDownloaderFactory));
$application->add(new ChromeDriver\Command($chromeDriverVersionResolver, $driverDownloaderFactory));
$application->add(new GeckoDriver\Command($geckoDriverVersionResolver, $driverDownloaderFactory));
$application->add(new MsEdge\Command($filesystem, $browserFactory, $driverFactory, $driverDownloaderFactory));

$application->setDefaultCommand(DetectCommand::NAME);

Expand Down
1 change: 1 addition & 0 deletions src/Browser/BrowserName.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ enum BrowserName: string
case GOOGLE_CHROME = 'google-chrome';
case CHROMIUM = 'chromium';
case FIREFOX = 'firefox';
case MSEDGE = 'msedge';
}
16 changes: 16 additions & 0 deletions src/Browser/MsEdge/Command.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace DBrekelmans\BrowserDriverInstaller\Browser\MsEdge;

use DBrekelmans\BrowserDriverInstaller\Browser\BrowserName;
use DBrekelmans\BrowserDriverInstaller\Command\BrowserCommand;

final class Command extends BrowserCommand
{
protected static function browserName(): BrowserName
{
return BrowserName::MSEDGE;
}
}
27 changes: 27 additions & 0 deletions src/Browser/MsEdge/PathResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

declare(strict_types=1);

namespace DBrekelmans\BrowserDriverInstaller\Browser\MsEdge;

use DBrekelmans\BrowserDriverInstaller\Browser\BrowserName;
use DBrekelmans\BrowserDriverInstaller\Browser\PathResolver as PathResolverInterface;
use DBrekelmans\BrowserDriverInstaller\OperatingSystem\OperatingSystem;
use RuntimeException;

class PathResolver implements PathResolverInterface
{
public function from(OperatingSystem $operatingSystem): string
{
return match ($operatingSystem) {
OperatingSystem::LINUX => throw new RuntimeException('Not implemented yet.'),
OperatingSystem::MACOS => '/Applications/Microsoft\ Edge.app',
OperatingSystem::WINDOWS => 'C:\Program Files (x86)\Microsoft\Edge\Application',
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

different path possible.

};
}

public function supports(BrowserName $browserName): bool
{
return $browserName === BrowserName::MSEDGE;
}
}
87 changes: 87 additions & 0 deletions src/Browser/MsEdge/VersionResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

declare(strict_types=1);

namespace DBrekelmans\BrowserDriverInstaller\Browser\MsEdge;

use DBrekelmans\BrowserDriverInstaller\Browser\BrowserName;
use DBrekelmans\BrowserDriverInstaller\Browser\VersionResolver as VersionResolverInterface;
use DBrekelmans\BrowserDriverInstaller\CommandLine\CommandLineEnvironment;
use DBrekelmans\BrowserDriverInstaller\OperatingSystem\OperatingSystem;
use DBrekelmans\BrowserDriverInstaller\Version;
use InvalidArgumentException;
use RuntimeException;

use function sprintf;

final class VersionResolver implements VersionResolverInterface
{
public function __construct(private readonly CommandLineEnvironment $commandLineEnvironment)
{
}

public function from(OperatingSystem $operatingSystem, string $path): Version
{
return match ($operatingSystem) {
OperatingSystem::LINUX => throw new RuntimeException('Not implemented yet.'),
OperatingSystem::MACOS => $this->getVersionFromCommandLine(sprintf('%s/Contents/MacOS/Microsoft\ Edge --version', $path)),
OperatingSystem::WINDOWS => $this->getVersionFromWindows(),
};
}

public function supports(BrowserName $browserName): bool
{
return $browserName === BrowserName::MSEDGE;
}

private function getVersionFromWindows(): Version
{
$previousException = null;
foreach (self::getWindowsCommandsForVersion() as $possibleCommand) {
try {
return $this->getVersionFromCommandLine($possibleCommand);
} catch (InvalidArgumentException $exception) {
$previousException = $exception;
}
}

throw new InvalidArgumentException('Version could not be determined.', 0, $previousException);
}

/**
* Provide potential commands to determine Edge Version on Windows
*
* @return string[]
*/
private static function getWindowsCommandsForVersion(): array
{
$versions = [
'Edge',
'Edge Beta',
'Edge Dev',
'Edge SxS',
];

$commands = [];
foreach ($versions as $version) {
$commands[] = sprintf('reg query HKCU\Software\Microsoft\%s\BLBeacon /v version', $version);
}

return $commands;
}

private function getVersionFromCommandLine(string $command): Version
{
try {
$commandOutput = $this->commandLineEnvironment->getCommandLineSuccessfulOutput($command);

return Version::fromString($commandOutput);
} catch (RuntimeException $exception) {
throw new RuntimeException(
'Version could not be determined.',
0,
$exception,
);
}
}
}
1 change: 1 addition & 0 deletions src/Driver/DriverFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ private function getDriverNameForBrowser(Browser $browser): DriverName
return match ($browser->name) {
BrowserName::GOOGLE_CHROME, BrowserName::CHROMIUM => DriverName::CHROME,
BrowserName::FIREFOX => DriverName::GECKO,
BrowserName::MSEDGE => DriverName::MSEDGE,
};
}
}
1 change: 1 addition & 0 deletions src/Driver/DriverName.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ enum DriverName: string
{
case CHROME = 'chromedriver';
case GECKO = 'geckodriver';
case MSEDGE = 'msedgedriver';
}
16 changes: 16 additions & 0 deletions src/Driver/MsEdgeDriver/Command.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace DBrekelmans\BrowserDriverInstaller\Driver\MsEdgeDriver;

use DBrekelmans\BrowserDriverInstaller\Command\DriverCommand;
use DBrekelmans\BrowserDriverInstaller\Driver\DriverName;

final class Command extends DriverCommand
{
protected static function driverName(): DriverName
{
return DriverName::MSEDGE;
}
}
36 changes: 36 additions & 0 deletions src/Driver/MsEdgeDriver/DownloadUrlResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

declare(strict_types=1);

namespace DBrekelmans\BrowserDriverInstaller\Driver\MsEdgeDriver;

use DBrekelmans\BrowserDriverInstaller\Driver\DownloadUrlResolver as DownloadUrlResolverInterface;
use DBrekelmans\BrowserDriverInstaller\Driver\Driver;
use DBrekelmans\BrowserDriverInstaller\OperatingSystem\OperatingSystem;

use function sprintf;

final class DownloadUrlResolver implements DownloadUrlResolverInterface
{
private const DOWNLOAD_ENDPOINT = 'https://msedgedriver.azureedge.net';

public function byDriver(Driver $driver): string
{
return sprintf(
'%s/%s/%s.zip',
self::DOWNLOAD_ENDPOINT,
$driver->version->toBuildString(),
$this->getBinaryName($driver),
);
}

private function getBinaryName(Driver $driver): string
{
// https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix=131.0.2903.112/
return match ($driver->operatingSystem) {
OperatingSystem::LINUX => 'edgedriver_linux64',
OperatingSystem::MACOS => 'edgedriver_mac64',
OperatingSystem::WINDOWS => 'edgedriver_win64', // TODO: 32bit?
};
}
}
Loading