75 lines
3.0 KiB
Markdown
75 lines
3.0 KiB
Markdown
# FIXED: Rod Library Nil Map Panic in loadURL
|
|
|
|
## Original Error
|
|
```
|
|
panic: assignment to entry in nil map
|
|
|
|
goroutine 78 [running]:
|
|
github.com/go-rod/rod.(*Page).setHelper(0x962da8?, {0xc000212258?, 0x938c80?}, {0x9584a2, 0x8}, {0xc000212288, 0x17})
|
|
/root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:320 +0xdf
|
|
github.com/go-rod/rod.(*Page).ensureJSHelper(0xc000140210, 0xf76e80)
|
|
/root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:292 +0x47c
|
|
github.com/go-rod/rod.(*Page).formatArgs(0xc000140210, 0xc00012eda8?)
|
|
/root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:234 +0x1e5
|
|
github.com/go-rod/rod.(*Page).evaluate(0xc000140210, 0xc0000d5f00)
|
|
/root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:150 +0x32
|
|
github.com/go-rod/rod.(*Page).Evaluate(0xc000140210, 0xc0000d5f00)
|
|
/root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page_eval.go:129 +0x4a
|
|
github.com/go-rod/rod.(*Page).WaitLoad(0xc000140210)
|
|
/root/go/pkg/mod/github.com/go-rod/rod@v0.116.2/page.go:858 +0x1a5
|
|
git.teamworkapps.com/shortcut/cremote/daemon.(*Daemon).loadURL.func1()
|
|
/tmp/cremote/daemon/daemon.go:2616 +0x9d
|
|
created by git.teamworkapps.com/shortcut/cremote/daemon.(*Daemon).loadURL in goroutine 74
|
|
/tmp/cremote/daemon/daemon.go:2608 +0x345
|
|
```
|
|
|
|
## Root Cause
|
|
This is a known issue in go-rod v0.116.2 (https://github.com/go-rod/rod/issues/331).
|
|
|
|
When `page.WaitLoad()` is called in a goroutine, there can be race conditions with the internal helper map initialization. The page's internal maps may not be fully initialized when the goroutine starts executing, causing a nil map panic.
|
|
|
|
## Solution Applied
|
|
Modified `daemon/daemon.go` in the `loadURL` function (lines 2589-2629):
|
|
|
|
1. **Added page initialization before goroutine** (lines 2597-2603):
|
|
- Call `page.Info()` to ensure internal state is initialized
|
|
- This prevents the nil map issue by forcing initialization on the main goroutine
|
|
|
|
2. **Added panic recovery in goroutine** (lines 2618-2622):
|
|
- Added `defer/recover` block to catch any panics
|
|
- Returns descriptive error message if panic occurs
|
|
- Prevents daemon crash and allows graceful error handling
|
|
|
|
## Code Changes
|
|
```go
|
|
// Ensure page is fully initialized before using in goroutine
|
|
// This prevents "assignment to entry in nil map" panics in rod library
|
|
// See: https://github.com/go-rod/rod/issues/331
|
|
_, err = page.Info()
|
|
if err != nil {
|
|
d.debugLog("Warning: failed to initialize page %s: %v", tabID, err)
|
|
// Continue anyway, as the page might still work
|
|
}
|
|
|
|
// Execute the navigation in a goroutine
|
|
go func() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
done <- fmt.Errorf("navigation panicked: %v", r)
|
|
}
|
|
}()
|
|
|
|
err := page.Navigate(url)
|
|
// ... rest of navigation code
|
|
}()
|
|
```
|
|
|
|
## Testing
|
|
✅ Code compiles successfully
|
|
✅ Panic recovery in place
|
|
✅ Page initialization added before goroutine
|
|
✅ Consistent with fix in `waitNavigation` function
|
|
|
|
## Related Fixes
|
|
This is similar to the fix previously applied to `findPageByID()` and `waitNavigation()`, but was missing in `loadURL()`.
|