95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
|
//go:build windows && !native_webview2loader
|
||
|
|
||
|
package webviewloader
|
||
|
|
||
|
import (
|
||
|
"path/filepath"
|
||
|
|
||
|
"golang.org/x/sys/windows/registry"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
kNumChannels = 4
|
||
|
kInstallKeyPath = "Software\\Microsoft\\EdgeUpdate\\ClientState\\"
|
||
|
kMinimumCompatibleVersion = "86.0.616.0"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
kChannelName = [kNumChannels]string{
|
||
|
"", "beta", "dev", "canary", // "internal"
|
||
|
}
|
||
|
|
||
|
kChannelUuid = [kNumChannels]string{
|
||
|
"{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}",
|
||
|
"{2CD8A007-E189-409D-A2C8-9AF4EF3C72AA}",
|
||
|
"{0D50BFEC-CD6A-4F9A-964C-C7416E3ACB10}",
|
||
|
"{65C35B14-6C1D-4122-AC46-7148CC9D6497}",
|
||
|
//"{BE59E8FD-089A-411B-A3B0-051D9E417818}",
|
||
|
}
|
||
|
|
||
|
minimumCompatibleVersion, _ = parseVersion(kMinimumCompatibleVersion)
|
||
|
)
|
||
|
|
||
|
func findInstalledClientDll(preferCanary bool) (clientPath string, version *version, err error) {
|
||
|
for i := 0; i < kNumChannels; i++ {
|
||
|
channel := i
|
||
|
if preferCanary {
|
||
|
channel = (kNumChannels - 1) - i
|
||
|
}
|
||
|
|
||
|
key := kInstallKeyPath + kChannelUuid[channel]
|
||
|
for _, checkSystem := range []bool{true, false} {
|
||
|
clientPath, version, err := findInstalledClientDllForChannel(key, checkSystem)
|
||
|
if err == errNoClientDLLFound {
|
||
|
continue
|
||
|
}
|
||
|
if err != nil {
|
||
|
return "", nil, err
|
||
|
}
|
||
|
|
||
|
version.channel = kChannelName[channel]
|
||
|
return clientPath, version, nil
|
||
|
}
|
||
|
}
|
||
|
return "", nil, errNoClientDLLFound
|
||
|
}
|
||
|
|
||
|
func findInstalledClientDllForChannel(subKey string, system bool) (clientPath string, clientVersion *version, err error) {
|
||
|
key := registry.LOCAL_MACHINE
|
||
|
if !system {
|
||
|
key = registry.CURRENT_USER
|
||
|
}
|
||
|
|
||
|
regKey, err := registry.OpenKey(key, subKey, registry.READ|registry.WOW64_32KEY)
|
||
|
if err != nil {
|
||
|
return "", nil, mapFindErr(err)
|
||
|
}
|
||
|
defer regKey.Close()
|
||
|
|
||
|
embeddedEdgeSubFolder, _, err := regKey.GetStringValue("EBWebView")
|
||
|
if err != nil {
|
||
|
return "", nil, mapFindErr(err)
|
||
|
}
|
||
|
|
||
|
if embeddedEdgeSubFolder == "" {
|
||
|
return "", nil, errNoClientDLLFound
|
||
|
}
|
||
|
|
||
|
versionString := filepath.Base(embeddedEdgeSubFolder)
|
||
|
version, err := parseVersion(versionString)
|
||
|
if err != nil {
|
||
|
return "", nil, errNoClientDLLFound
|
||
|
}
|
||
|
|
||
|
if version.compare(minimumCompatibleVersion) < 0 {
|
||
|
return "", nil, errNoClientDLLFound
|
||
|
}
|
||
|
|
||
|
dllPath, err := findEmbeddedClientDll(embeddedEdgeSubFolder)
|
||
|
if err != nil {
|
||
|
return "", nil, mapFindErr(err)
|
||
|
}
|
||
|
|
||
|
return dllPath, &version, nil
|
||
|
}
|