Skip to content

Commit bb8cd71

Browse files
committed
create bazel target for updating CDP versions
1 parent 9bfbec0 commit bb8cd71

File tree

3 files changed

+198
-129
lines changed

3 files changed

+198
-129
lines changed

scripts/BUILD.bazel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ py_binary(
1010
],
1111
)
1212

13+
py_binary(
14+
name = "update_cdp",
15+
srcs = ["update_cdp.py"],
16+
deps = [
17+
requirement("packaging"),
18+
requirement("urllib3"),
19+
],
20+
)
21+
1322
java_binary(
1423
name = "google-java-format",
1524
jvm_flags = [

scripts/update-devtools.sh

Lines changed: 0 additions & 129 deletions
This file was deleted.

scripts/update_cdp.py

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
#!/usr/bin/env python
2+
3+
import argparse
4+
import hashlib
5+
import json
6+
import os
7+
import re
8+
import shutil
9+
import subprocess
10+
import sys
11+
from pathlib import Path
12+
13+
import urllib3
14+
from packaging.version import parse
15+
16+
http = urllib3.PoolManager()
17+
root_dir = Path(os.path.realpath(__file__)).parent.parent
18+
19+
20+
def get_chrome_milestone():
21+
"""This is the same method from pinned_browser. Use --chrome_channel=Beta if
22+
using early stable release."""
23+
parser = argparse.ArgumentParser()
24+
parser.add_argument("--chrome_channel", default="Stable", help="Set the Chrome channel")
25+
args = parser.parse_args()
26+
channel = args.chrome_channel
27+
28+
r = http.request(
29+
"GET", f"https://chromiumdash.appspot.com/fetch_releases?channel={channel}&num=1&platform=Mac,Linux"
30+
)
31+
all_versions = json.loads(r.data)
32+
# use the same milestone for all Chrome releases, so pick the lowest
33+
milestone = min([version["milestone"] for version in all_versions if version["milestone"]])
34+
r = http.request(
35+
"GET", "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"
36+
)
37+
versions = json.loads(r.data)["versions"]
38+
39+
return sorted(
40+
filter(lambda v: v["version"].split(".")[0] == str(milestone), versions), key=lambda v: parse(v["version"])
41+
)[-1]
42+
43+
44+
def fetch_and_save(url, file_path):
45+
response = http.request("GET", url)
46+
with open(file_path, "wb") as file:
47+
file.write(response.data)
48+
49+
50+
def new_chrome(chrome_milestone):
51+
return chrome_milestone["version"].split(".")[0]
52+
53+
54+
def previous_chrome(chrome_milestone):
55+
return str(int(new_chrome(chrome_milestone)) - 1)
56+
57+
58+
def old_chrome(chrome_milestone):
59+
return str(int(new_chrome(chrome_milestone)) - 3)
60+
61+
62+
def add_pdls(chrome_milestone):
63+
source_dir = root_dir / f"common/devtools/chromium/v{previous_chrome(chrome_milestone)}"
64+
target_dir = root_dir / f"common/devtools/chromium/v{new_chrome(chrome_milestone)}"
65+
old_dir = root_dir / f"common/devtools/chromium/v{old_chrome(chrome_milestone)}"
66+
67+
if os.path.isdir(old_dir):
68+
shutil.rmtree(old_dir)
69+
70+
if not os.path.isdir(target_dir):
71+
os.makedirs(target_dir, exist_ok=True)
72+
if os.path.isdir(source_dir):
73+
shutil.copytree(source_dir, target_dir, dirs_exist_ok=True)
74+
75+
fetch_and_save(
76+
f"https://raw.githubusercontent.com/chromium/chromium/{chrome_milestone['version']}/third_party/blink/public/devtools_protocol/browser_protocol.pdl",
77+
f"{target_dir}/browser_protocol.pdl",
78+
)
79+
80+
deps_content = http.request(
81+
"GET", f"https://raw.githubusercontent.com/chromium/chromium/{chrome_milestone['version']}/DEPS"
82+
).data.decode("utf-8")
83+
v8_revision = [line for line in deps_content.split("\n") if "v8_revision" in line][0].split(": ")[1].strip("',")
84+
fetch_and_save(
85+
f"https://raw.githubusercontent.com/v8/v8/{v8_revision}/include/js_protocol.pdl",
86+
f"{target_dir}/js_protocol.pdl",
87+
)
88+
89+
# javadocs does not like script tags
90+
with open(f"{target_dir}/browser_protocol.pdl", "r+") as file:
91+
script_replace = file.read().replace("`<script>`", "`script`")
92+
file.seek(0)
93+
file.write(script_replace)
94+
file.truncate()
95+
96+
subprocess.run(["git", "add", str(target_dir / "*")], cwd=root_dir)
97+
98+
99+
def create_new_chrome_files(src_base, chrome_milestone):
100+
"""Java and .NET need to copy previous version directory into new version
101+
directory."""
102+
source_dir = root_dir / f"{src_base}/v{previous_chrome(chrome_milestone)}"
103+
target_dir = root_dir / f"{src_base}/v{new_chrome(chrome_milestone)}"
104+
old_dir = root_dir / f"{src_base}/v{old_chrome(chrome_milestone)}"
105+
106+
# New target must not be already present
107+
if not target_dir.is_dir():
108+
if old_dir.is_dir():
109+
shutil.rmtree(old_dir)
110+
111+
if source_dir.is_dir() and any(source_dir.iterdir()):
112+
os.makedirs(target_dir, exist_ok=True)
113+
for item in source_dir.iterdir():
114+
shutil.copy(item, target_dir)
115+
116+
for file in target_dir.iterdir():
117+
replace_in_file(file, previous_chrome(chrome_milestone), new_chrome(chrome_milestone))
118+
new_filename = file.name.replace(previous_chrome(chrome_milestone), new_chrome(chrome_milestone))
119+
file.rename(target_dir / new_filename)
120+
121+
subprocess.run(["git", "add", str(target_dir / "*")], cwd=root_dir)
122+
123+
124+
def replace_in_file(file_path, old_string, new_string, is_regex=False):
125+
with open(file_path, "r+") as file:
126+
if not is_regex:
127+
old_string = re.escape(old_string)
128+
data = re.sub(old_string, new_string, file.read())
129+
file.seek(0)
130+
file.write(data)
131+
file.truncate()
132+
133+
134+
def update_java(chrome_milestone):
135+
create_new_chrome_files("java/src/org/openqa/selenium/devtools", chrome_milestone)
136+
137+
files = [
138+
root_dir / "java/src/org/openqa/selenium/devtools/versions.bzl",
139+
root_dir / "Rakefile",
140+
]
141+
for file in files:
142+
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
143+
144+
145+
def update_dotnet(chrome_milestone):
146+
create_new_chrome_files("dotnet/src/webdriver/DevTools", chrome_milestone)
147+
148+
files = [
149+
root_dir / "dotnet/selenium-dotnet-version.bzl",
150+
root_dir / "dotnet/src/webdriver/WebDriver.csproj.prebuild.cmd",
151+
root_dir / "dotnet/src/webdriver/WebDriver.csproj.prebuild.sh",
152+
root_dir / "dotnet/src/webdriver/DevTools/DevToolsDomains.cs",
153+
]
154+
for file in files:
155+
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
156+
157+
files = [root_dir / "dotnet/test/common/CustomDriverConfigs/StableChannelChromeDriver.cs"]
158+
dir_path = root_dir / "dotnet/test/common/DevTools"
159+
files.extend(str(file) for file in dir_path.glob("*") if file.is_file())
160+
for file in files:
161+
replace_in_file(file, previous_chrome(chrome_milestone), new_chrome(chrome_milestone))
162+
163+
164+
def update_ruby(chrome_milestone):
165+
file = root_dir / "rb/lib/selenium/devtools/BUILD.bazel"
166+
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
167+
168+
file = root_dir / "rb/lib/selenium/devtools/version.rb"
169+
replace_in_file(file, rf"{previous_chrome(chrome_milestone)}\.[0-9]*", f"{new_chrome(chrome_milestone)}.0", True)
170+
171+
172+
def update_python(chrome_milestone):
173+
file = root_dir / "py/BUILD.bazel"
174+
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
175+
176+
177+
def update_js(chrome_milestone):
178+
file = root_dir / "javascript/node/selenium-webdriver/BUILD.bazel"
179+
replace_in_file(file, old_chrome(chrome_milestone), new_chrome(chrome_milestone))
180+
181+
182+
if __name__ == "__main__":
183+
chrome_milestone = get_chrome_milestone()
184+
add_pdls(chrome_milestone)
185+
update_java(chrome_milestone)
186+
update_dotnet(chrome_milestone)
187+
update_ruby(chrome_milestone)
188+
update_python(chrome_milestone)
189+
update_js(chrome_milestone)

0 commit comments

Comments
 (0)