fix: use --restore-last-session instead of unsigned Preferences restore_on_startup
All checks were successful
技能自动化发布 / release (push) Successful in 5s

This commit is contained in:
2026-09-16 14:38:03 +08:00
parent 7709292f1c
commit 71b20e6e4a
5 changed files with 93 additions and 24 deletions

View File

@@ -1,4 +1,9 @@
"""Chrome/Edge 独立 Profile:启用「继续上次会话」,让 Session Cookie 可跨次打开保留。"""
"""Chrome/Edge 独立 Profile:启动前清理退出标记,便于会话文件可被恢复。
注意:``session.restore_on_startup`` 受 Secure Preferences HMAC 保护,
裸写 Preferences 会被 Chrome 校验否掉并回落到新标签页。真正强制恢复会话
应在启动参数使用 ``--restore-last-session``(见 browser_service)。
"""
from __future__ import annotations
@@ -8,8 +13,6 @@ from typing import Any, Dict
from util.logging_config import get_skill_logger
RESTORE_CONTINUE_WHERE_LEFT_OFF = 1
# Chromium ≤ roughly mid-era: session files lived under Default/
_LEGACY_SESSION_FILES = (
"Current Session",
@@ -55,13 +58,10 @@ def local_state_path(profile_dir: str) -> str:
def _patch_preferences_dict(data: Dict[str, Any]) -> Dict[str, Any]:
before = int((data.get("session") or {}).get("restore_on_startup") or 0)
"""只改不受 Secure Preferences MAC 保护的退出标记;不动 restore_on_startup。"""
restore_before = int((data.get("session") or {}).get("restore_on_startup") or 0)
exit_before = str((data.get("profile") or {}).get("exit_type") or "")
session = data.setdefault("session", {})
session["restore_on_startup"] = RESTORE_CONTINUE_WHERE_LEFT_OFF
session.pop("startup_urls", None)
profile = data.setdefault("profile", {})
if str(profile.get("exit_type") or "").lower() == "crashed":
profile["exit_type"] = "Normal"
@@ -71,7 +71,7 @@ def _patch_preferences_dict(data: Dict[str, Any]) -> Dict[str, Any]:
browser["has_seen_welcome_page"] = True
browser["check_default_browser"] = False
return {"restore_before": before, "exit_type_before": exit_before}
return {"restore_before": restore_before, "exit_type_before": exit_before}
def _patch_local_state(profile_dir: str, log) -> Dict[str, Any]:
@@ -102,7 +102,7 @@ def _patch_local_state(profile_dir: str, log) -> Dict[str, Any]:
def ensure_session_restore(profile_dir: str) -> Dict[str, Any]:
"""启动浏览器前写入 session.restore_on_startup=1;清 startup_urls;Local State 干净退出。"""
"""启动前清理 exit_type / exited_cleanly(不受 MAC 保护);不写 restore_on_startup。"""
log = get_skill_logger()
profile_abs = os.path.abspath(profile_dir)
prefs = preferences_path(profile_abs)
@@ -140,12 +140,11 @@ def ensure_session_restore(profile_dir: str) -> Dict[str, Any]:
exit_after = str((data.get("profile") or {}).get("exit_type") or "")
local = _patch_local_state(profile_abs, log)
log.info(
"chrome_session_restore_ensured profile_dir=%s prefs=%s existed=%s "
"restore_on_startup %s->%s exit_type %s->%s local_state=%s",
"chrome_session_restore_prepared profile_dir=%s prefs=%s existed=%s "
"restore_on_startup_unchanged=%s exit_type %s->%s local_state=%s",
profile_abs,
prefs,
existed,
before,
after,
exit_before or "-",
exit_after or "-",
@@ -160,4 +159,5 @@ def ensure_session_restore(profile_dir: str) -> Dict[str, Any]:
"exit_type_before": exit_before,
"exit_type_after": exit_after,
"local_state": local,
"prefs_restore_on_startup_touched": False,
}