diff --git a/cdp/cdp.go b/cdp/cdp.go index 3827ef0..dd2dbbd 100644 --- a/cdp/cdp.go +++ b/cdp/cdp.go @@ -7,6 +7,7 @@ import ( "strconv" "strings" "sync" + "time" "github.com/mailru/easyjson" "github.com/mailru/easyjson/jlexer" @@ -1501,11 +1502,34 @@ func (t LoaderID) String() string { } // Timestamp number of seconds since epoch. -type Timestamp float64 +type Timestamp time.Time -// Float64 returns the Timestamp as float64 value. -func (t Timestamp) Float64() float64 { - return float64(t) +// Time returns the Timestamp as time.Time value. +func (t Timestamp) Time() time.Time { + return time.Time(t) +} + +// MarshalEasyJSON satisfies easyjson.Marshaler. +func (t Timestamp) MarshalEasyJSON(out *jwriter.Writer) { + v := float64(time.Time(t).UnixNano() / int64(time.Second)) + + out.Buffer.EnsureSpace(20) + out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64) +} + +// MarshalJSON satisfies json.Marshaler. +func (t Timestamp) MarshalJSON() ([]byte, error) { + return easyjson.Marshal(t) +} + +// UnmarshalEasyJSON satisfies easyjson.Unmarshaler. +func (t *Timestamp) UnmarshalEasyJSON(in *jlexer.Lexer) { + *t = Timestamp(time.Unix(0, int64(in.Float64()*float64(time.Second)))) +} + +// UnmarshalJSON satisfies json.Unmarshaler. +func (t *Timestamp) UnmarshalJSON(buf []byte) error { + return easyjson.Unmarshal(buf, t) } // NodeID unique DOM node identifier. diff --git a/cdp/heapprofiler/easyjson.go b/cdp/heapprofiler/easyjson.go index 1a63ef4..cb1d674 100644 --- a/cdp/heapprofiler/easyjson.go +++ b/cdp/heapprofiler/easyjson.go @@ -4,6 +4,7 @@ package heapprofiler import ( json "encoding/json" + cdp "github.com/knq/chromedp/cdp" runtime "github.com/knq/chromedp/cdp/runtime" easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" @@ -1124,7 +1125,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpHeapprofiler14(in *jlexer.Lexe case "lastSeenObjectId": out.LastSeenObjectID = int64(in.Int64()) case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -1147,13 +1156,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpHeapprofiler14(out *jwriter.Wr out.RawString("\"lastSeenObjectId\":") out.Int64(int64(in.LastSeenObjectID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } diff --git a/cdp/heapprofiler/events.go b/cdp/heapprofiler/events.go index bb2f77d..234c483 100644 --- a/cdp/heapprofiler/events.go +++ b/cdp/heapprofiler/events.go @@ -27,8 +27,8 @@ type EventReportHeapSnapshotProgress struct { // then one or more heapStatsUpdate events will be sent before a new // lastSeenObjectId event. type EventLastSeenObjectID struct { - LastSeenObjectID int64 `json:"lastSeenObjectId,omitempty"` - Timestamp float64 `json:"timestamp,omitempty"` + LastSeenObjectID int64 `json:"lastSeenObjectId,omitempty"` + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` } // EventHeapStatsUpdate if heap objects tracking has been started then diff --git a/cdp/input/easyjson.go b/cdp/input/easyjson.go index 5f66214..4afb3bd 100644 --- a/cdp/input/easyjson.go +++ b/cdp/input/easyjson.go @@ -4,6 +4,7 @@ package input import ( json "encoding/json" + cdp "github.com/knq/chromedp/cdp" easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter" @@ -632,7 +633,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpInput5(in *jlexer.Lexer, out * case "y": out.Y = int64(in.Int64()) case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "button": (out.Button).UnmarshalEasyJSON(in) case "deltaX": @@ -680,7 +689,11 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpInput5(out *jwriter.Writer, in } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } if !first { out.RawByte(',') } @@ -800,7 +813,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpInput6(in *jlexer.Lexer, out * case "modifiers": (out.Modifiers).UnmarshalEasyJSON(in) case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -850,13 +871,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpInput6(out *jwriter.Writer, in out.RawString("\"modifiers\":") (in.Modifiers).MarshalEasyJSON(out) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } @@ -912,7 +937,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpInput7(in *jlexer.Lexer, out * case "modifiers": (out.Modifiers).UnmarshalEasyJSON(in) case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "button": (out.Button).UnmarshalEasyJSON(in) case "clickCount": @@ -957,13 +990,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpInput7(out *jwriter.Writer, in out.RawString("\"modifiers\":") (in.Modifiers).MarshalEasyJSON(out) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Button != "" { if !first { @@ -1031,7 +1068,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpInput8(in *jlexer.Lexer, out * case "modifiers": (out.Modifiers).UnmarshalEasyJSON(in) case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "text": out.Text = string(in.String()) case "unmodifiedText": @@ -1080,13 +1125,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpInput8(out *jwriter.Writer, in out.RawString("\"modifiers\":") (in.Modifiers).MarshalEasyJSON(out) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Text != "" { if !first { diff --git a/cdp/input/input.go b/cdp/input/input.go index a606384..77b5f85 100644 --- a/cdp/input/input.go +++ b/cdp/input/input.go @@ -36,19 +36,19 @@ func (p *SetIgnoreInputEventsParams) Do(ctxt context.Context, h cdp.Handler) (er // DispatchKeyEventParams dispatches a key event to the page. type DispatchKeyEventParams struct { - Type KeyType `json:"type"` // Type of the key event. - Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). - Timestamp float64 `json:"timestamp,omitempty"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970 (default: current time). - Text string `json:"text,omitempty"` // Text as generated by processing a virtual key code with a keyboard layout. Not needed for for keyUp and rawKeyDown events (default: "") - UnmodifiedText string `json:"unmodifiedText,omitempty"` // Text that would have been generated by the keyboard if no modifiers were pressed (except for shift). Useful for shortcut (accelerator) key handling (default: ""). - KeyIdentifier string `json:"keyIdentifier,omitempty"` // Unique key identifier (e.g., 'U+0041') (default: ""). - Code string `json:"code,omitempty"` // Unique DOM defined string value for each physical key (e.g., 'KeyA') (default: ""). - Key string `json:"key,omitempty"` // Unique DOM defined string value describing the meaning of the key in the context of active modifiers, keyboard layout, etc (e.g., 'AltGr') (default: ""). - WindowsVirtualKeyCode int64 `json:"windowsVirtualKeyCode,omitempty"` // Windows virtual key code (default: 0). - NativeVirtualKeyCode int64 `json:"nativeVirtualKeyCode,omitempty"` // Native virtual key code (default: 0). - AutoRepeat bool `json:"autoRepeat,omitempty"` // Whether the event was generated from auto repeat (default: false). - IsKeypad bool `json:"isKeypad,omitempty"` // Whether the event was generated from the keypad (default: false). - IsSystemKey bool `json:"isSystemKey,omitempty"` // Whether the event was a system key event (default: false). + Type KeyType `json:"type"` // Type of the key event. + Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970 (default: current time). + Text string `json:"text,omitempty"` // Text as generated by processing a virtual key code with a keyboard layout. Not needed for for keyUp and rawKeyDown events (default: "") + UnmodifiedText string `json:"unmodifiedText,omitempty"` // Text that would have been generated by the keyboard if no modifiers were pressed (except for shift). Useful for shortcut (accelerator) key handling (default: ""). + KeyIdentifier string `json:"keyIdentifier,omitempty"` // Unique key identifier (e.g., 'U+0041') (default: ""). + Code string `json:"code,omitempty"` // Unique DOM defined string value for each physical key (e.g., 'KeyA') (default: ""). + Key string `json:"key,omitempty"` // Unique DOM defined string value describing the meaning of the key in the context of active modifiers, keyboard layout, etc (e.g., 'AltGr') (default: ""). + WindowsVirtualKeyCode int64 `json:"windowsVirtualKeyCode,omitempty"` // Windows virtual key code (default: 0). + NativeVirtualKeyCode int64 `json:"nativeVirtualKeyCode,omitempty"` // Native virtual key code (default: 0). + AutoRepeat bool `json:"autoRepeat,omitempty"` // Whether the event was generated from auto repeat (default: false). + IsKeypad bool `json:"isKeypad,omitempty"` // Whether the event was generated from the keypad (default: false). + IsSystemKey bool `json:"isSystemKey,omitempty"` // Whether the event was a system key event (default: false). } // DispatchKeyEvent dispatches a key event to the page. @@ -70,7 +70,7 @@ func (p DispatchKeyEventParams) WithModifiers(modifiers Modifier) *DispatchKeyEv // WithTimestamp time at which the event occurred. Measured in UTC time in // seconds since January 1, 1970 (default: current time). -func (p DispatchKeyEventParams) WithTimestamp(timestamp float64) *DispatchKeyEventParams { +func (p DispatchKeyEventParams) WithTimestamp(timestamp *cdp.Timestamp) *DispatchKeyEventParams { p.Timestamp = timestamp return &p } @@ -152,13 +152,13 @@ func (p *DispatchKeyEventParams) Do(ctxt context.Context, h cdp.Handler) (err er // DispatchMouseEventParams dispatches a mouse event to the page. type DispatchMouseEventParams struct { - Type MouseType `json:"type"` // Type of the mouse event. - X int64 `json:"x"` // X coordinate of the event relative to the main frame's viewport. - Y int64 `json:"y"` // Y coordinate of the event relative to the main frame's viewport. 0 refers to the top of the viewport and Y increases as it proceeds towards the bottom of the viewport. - Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). - Timestamp float64 `json:"timestamp,omitempty"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970 (default: current time). - Button ButtonType `json:"button,omitempty"` // Mouse button (default: "none"). - ClickCount int64 `json:"clickCount,omitempty"` // Number of times the mouse button was clicked (default: 0). + Type MouseType `json:"type"` // Type of the mouse event. + X int64 `json:"x"` // X coordinate of the event relative to the main frame's viewport. + Y int64 `json:"y"` // Y coordinate of the event relative to the main frame's viewport. 0 refers to the top of the viewport and Y increases as it proceeds towards the bottom of the viewport. + Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970 (default: current time). + Button ButtonType `json:"button,omitempty"` // Mouse button (default: "none"). + ClickCount int64 `json:"clickCount,omitempty"` // Number of times the mouse button was clicked (default: 0). } // DispatchMouseEvent dispatches a mouse event to the page. @@ -184,7 +184,7 @@ func (p DispatchMouseEventParams) WithModifiers(modifiers Modifier) *DispatchMou // WithTimestamp time at which the event occurred. Measured in UTC time in // seconds since January 1, 1970 (default: current time). -func (p DispatchMouseEventParams) WithTimestamp(timestamp float64) *DispatchMouseEventParams { +func (p DispatchMouseEventParams) WithTimestamp(timestamp *cdp.Timestamp) *DispatchMouseEventParams { p.Timestamp = timestamp return &p } @@ -209,10 +209,10 @@ func (p *DispatchMouseEventParams) Do(ctxt context.Context, h cdp.Handler) (err // DispatchTouchEventParams dispatches a touch event to the page. type DispatchTouchEventParams struct { - Type TouchType `json:"type"` // Type of the touch event. - TouchPoints []*TouchPoint `json:"touchPoints"` // Touch points. - Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). - Timestamp float64 `json:"timestamp,omitempty"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970 (default: current time). + Type TouchType `json:"type"` // Type of the touch event. + TouchPoints []*TouchPoint `json:"touchPoints"` // Touch points. + Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970 (default: current time). } // DispatchTouchEvent dispatches a touch event to the page. @@ -236,7 +236,7 @@ func (p DispatchTouchEventParams) WithModifiers(modifiers Modifier) *DispatchTou // WithTimestamp time at which the event occurred. Measured in UTC time in // seconds since January 1, 1970 (default: current time). -func (p DispatchTouchEventParams) WithTimestamp(timestamp float64) *DispatchTouchEventParams { +func (p DispatchTouchEventParams) WithTimestamp(timestamp *cdp.Timestamp) *DispatchTouchEventParams { p.Timestamp = timestamp return &p } @@ -250,15 +250,15 @@ func (p *DispatchTouchEventParams) Do(ctxt context.Context, h cdp.Handler) (err // EmulateTouchFromMouseEventParams emulates touch event from the mouse event // parameters. type EmulateTouchFromMouseEventParams struct { - Type MouseType `json:"type"` // Type of the mouse event. - X int64 `json:"x"` // X coordinate of the mouse pointer in DIP. - Y int64 `json:"y"` // Y coordinate of the mouse pointer in DIP. - Timestamp float64 `json:"timestamp"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970. - Button ButtonType `json:"button"` // Mouse button. - DeltaX float64 `json:"deltaX,omitempty"` // X delta in DIP for mouse wheel event (default: 0). - DeltaY float64 `json:"deltaY,omitempty"` // Y delta in DIP for mouse wheel event (default: 0). - Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). - ClickCount int64 `json:"clickCount,omitempty"` // Number of times the mouse button was clicked (default: 0). + Type MouseType `json:"type"` // Type of the mouse event. + X int64 `json:"x"` // X coordinate of the mouse pointer in DIP. + Y int64 `json:"y"` // Y coordinate of the mouse pointer in DIP. + Timestamp *cdp.Timestamp `json:"timestamp"` // Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970. + Button ButtonType `json:"button"` // Mouse button. + DeltaX float64 `json:"deltaX,omitempty"` // X delta in DIP for mouse wheel event (default: 0). + DeltaY float64 `json:"deltaY,omitempty"` // Y delta in DIP for mouse wheel event (default: 0). + Modifiers Modifier `json:"modifiers,omitempty"` // Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8 (default: 0). + ClickCount int64 `json:"clickCount,omitempty"` // Number of times the mouse button was clicked (default: 0). } // EmulateTouchFromMouseEvent emulates touch event from the mouse event @@ -270,7 +270,7 @@ type EmulateTouchFromMouseEventParams struct { // y - Y coordinate of the mouse pointer in DIP. // timestamp - Time at which the event occurred. Measured in UTC time in seconds since January 1, 1970. // button - Mouse button. -func EmulateTouchFromMouseEvent(typeVal MouseType, x int64, y int64, timestamp float64, button ButtonType) *EmulateTouchFromMouseEventParams { +func EmulateTouchFromMouseEvent(typeVal MouseType, x int64, y int64, timestamp *cdp.Timestamp, button ButtonType) *EmulateTouchFromMouseEventParams { return &EmulateTouchFromMouseEventParams{ Type: typeVal, X: x, diff --git a/cdp/log/easyjson.go b/cdp/log/easyjson.go index c1e7447..05a9b1e 100644 --- a/cdp/log/easyjson.go +++ b/cdp/log/easyjson.go @@ -375,7 +375,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpLog4(in *jlexer.Lexer, out *En case "text": out.Text = string(in.String()) case "timestamp": - out.Timestamp = runtime.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(runtime.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "url": out.URL = string(in.String()) case "lineNumber": @@ -432,13 +440,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpLog4(out *jwriter.Writer, in E out.RawString("\"text\":") out.String(string(in.Text)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.URL != "" { if !first { diff --git a/cdp/log/types.go b/cdp/log/types.go index ce43f7d..e8c3fab 100644 --- a/cdp/log/types.go +++ b/cdp/log/types.go @@ -17,7 +17,7 @@ type Entry struct { Source Source `json:"source,omitempty"` // Log entry source. Level Level `json:"level,omitempty"` // Log entry severity. Text string `json:"text,omitempty"` // Logged text. - Timestamp runtime.Timestamp `json:"timestamp,omitempty"` // Timestamp when this entry was added. + Timestamp *runtime.Timestamp `json:"timestamp,omitempty"` // Timestamp when this entry was added. URL string `json:"url,omitempty"` // URL of the resource if known. LineNumber int64 `json:"lineNumber,omitempty"` // Line number in the resource. StackTrace *runtime.StackTrace `json:"stackTrace,omitempty"` // JavaScript stack trace. diff --git a/cdp/network/easyjson.go b/cdp/network/easyjson.go index 48d708a..8f090f1 100644 --- a/cdp/network/easyjson.go +++ b/cdp/network/easyjson.go @@ -460,7 +460,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork3(in *jlexer.Lexer, out case "logId": out.LogID = string(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "hashAlgorithm": out.HashAlgorithm = string(in.String()) case "signatureAlgorithm": @@ -513,13 +521,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork3(out *jwriter.Writer, out.RawString("\"logId\":") out.String(string(in.LogID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.HashAlgorithm != "" { if !first { @@ -930,7 +942,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork8(in *jlexer.Lexer, out case "sameSite": (out.SameSite).UnmarshalEasyJSON(in) case "expirationDate": - out.ExpirationDate = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.ExpirationDate = nil + } else { + if out.ExpirationDate == nil { + out.ExpirationDate = new(cdp.Timestamp) + } + (*out.ExpirationDate).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -1003,13 +1023,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork8(out *jwriter.Writer, out.RawString("\"sameSite\":") (in.SameSite).MarshalEasyJSON(out) } - if in.ExpirationDate != 0 { + if in.ExpirationDate != nil { if !first { out.RawByte(',') } first = false out.RawString("\"expirationDate\":") - out.Float64(float64(in.ExpirationDate)) + if in.ExpirationDate == nil { + out.RawString("null") + } else { + (*in.ExpirationDate).MarshalEasyJSON(out) + } } out.RawByte('}') } @@ -1329,9 +1353,25 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork12(in *jlexer.Lexer, ou case "issuer": out.Issuer = string(in.String()) case "validFrom": - out.ValidFrom = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.ValidFrom = nil + } else { + if out.ValidFrom == nil { + out.ValidFrom = new(cdp.Timestamp) + } + (*out.ValidFrom).UnmarshalEasyJSON(in) + } case "validTo": - out.ValidTo = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.ValidTo = nil + } else { + if out.ValidTo == nil { + out.ValidTo = new(cdp.Timestamp) + } + (*out.ValidTo).UnmarshalEasyJSON(in) + } case "signedCertificateTimestampList": if in.IsNull() { in.Skip() @@ -1460,21 +1500,29 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork12(out *jwriter.Writer, out.RawString("\"issuer\":") out.String(string(in.Issuer)) } - if in.ValidFrom != 0 { + if in.ValidFrom != nil { if !first { out.RawByte(',') } first = false out.RawString("\"validFrom\":") - out.Float64(float64(in.ValidFrom)) + if in.ValidFrom == nil { + out.RawString("null") + } else { + (*in.ValidFrom).MarshalEasyJSON(out) + } } - if in.ValidTo != 0 { + if in.ValidTo != nil { if !first { out.RawByte(',') } first = false out.RawString("\"validTo\":") - out.Float64(float64(in.ValidTo)) + if in.ValidTo == nil { + out.RawString("null") + } else { + (*in.ValidTo).MarshalEasyJSON(out) + } } if len(in.SignedCertificateTimestampList) != 0 { if !first { @@ -3191,9 +3239,25 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork26(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "wallTime": - out.WallTime = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.WallTime = nil + } else { + if out.WallTime == nil { + out.WallTime = new(cdp.Timestamp) + } + (*out.WallTime).UnmarshalEasyJSON(in) + } case "request": if in.IsNull() { in.Skip() @@ -3226,21 +3290,29 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork26(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } - if in.WallTime != 0 { + if in.WallTime != nil { if !first { out.RawByte(',') } first = false out.RawString("\"wallTime\":") - out.Float64(float64(in.WallTime)) + if in.WallTime == nil { + out.RawString("null") + } else { + (*in.WallTime).MarshalEasyJSON(out) + } } if in.Request != nil { if !first { @@ -3302,7 +3374,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork27(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "response": if in.IsNull() { in.Skip() @@ -3335,13 +3415,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork27(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Response != nil { if !first { @@ -3403,7 +3487,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork28(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "response": if in.IsNull() { in.Skip() @@ -3436,13 +3528,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork28(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Response != nil { if !first { @@ -3504,7 +3600,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork29(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "response": if in.IsNull() { in.Skip() @@ -3537,13 +3641,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork29(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Response != nil { if !first { @@ -3605,7 +3713,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork30(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "errorMessage": out.ErrorMessage = string(in.String()) default: @@ -3630,13 +3746,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork30(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.ErrorMessage != "" { if !first { @@ -3795,7 +3915,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork32(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -3818,13 +3946,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork32(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } @@ -3878,7 +4010,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork33(in *jlexer.Lexer, ou case "loaderId": out.LoaderID = cdp.LoaderID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "type": (out.Type).UnmarshalEasyJSON(in) case "response": @@ -3929,13 +4069,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork33(out *jwriter.Writer, out.RawString("\"loaderId\":") out.String(string(in.LoaderID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Type != "" { if !first { @@ -4007,7 +4151,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork34(in *jlexer.Lexer, ou case "newPriority": (out.NewPriority).UnmarshalEasyJSON(in) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -4038,13 +4190,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork34(out *jwriter.Writer, out.RawString("\"newPriority\":") (in.NewPriority).MarshalEasyJSON(out) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } @@ -4110,9 +4266,25 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork35(in *jlexer.Lexer, ou (*out.Request).UnmarshalEasyJSON(in) } case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "wallTime": - out.WallTime = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.WallTime = nil + } else { + if out.WallTime == nil { + out.WallTime = new(cdp.Timestamp) + } + (*out.WallTime).UnmarshalEasyJSON(in) + } case "initiator": if in.IsNull() { in.Skip() @@ -4193,21 +4365,29 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork35(out *jwriter.Writer, (*in.Request).MarshalEasyJSON(out) } } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } - if in.WallTime != 0 { + if in.WallTime != nil { if !first { out.RawByte(',') } first = false out.RawString("\"wallTime\":") - out.Float64(float64(in.WallTime)) + if in.WallTime == nil { + out.RawString("null") + } else { + (*in.WallTime).MarshalEasyJSON(out) + } } if in.Initiator != nil { if !first { @@ -4556,7 +4736,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork38(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "encodedDataLength": out.EncodedDataLength = float64(in.Float64()) default: @@ -4581,13 +4769,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork38(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.EncodedDataLength != 0 { if !first { @@ -4645,7 +4837,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork39(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "type": (out.Type).UnmarshalEasyJSON(in) case "errorText": @@ -4676,13 +4876,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork39(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.Type != "" { if !first { @@ -4764,7 +4968,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork40(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "eventName": out.EventName = string(in.String()) case "eventId": @@ -4793,13 +5005,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork40(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.EventName != "" { if !first { @@ -4873,7 +5089,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpNetwork41(in *jlexer.Lexer, ou case "requestId": out.RequestID = RequestID(in.String()) case "timestamp": - out.Timestamp = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(cdp.Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "dataLength": out.DataLength = int64(in.Int64()) case "encodedDataLength": @@ -4900,13 +5124,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpNetwork41(out *jwriter.Writer, out.RawString("\"requestId\":") out.String(string(in.RequestID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.DataLength != 0 { if !first { diff --git a/cdp/network/events.go b/cdp/network/events.go index bf97748..e9c5e8b 100644 --- a/cdp/network/events.go +++ b/cdp/network/events.go @@ -12,7 +12,7 @@ import ( type EventResourceChangedPriority struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. NewPriority ResourcePriority `json:"newPriority,omitempty"` // New priority - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. } // EventRequestWillBeSent fired when page is about to send HTTP request. @@ -22,8 +22,8 @@ type EventRequestWillBeSent struct { LoaderID cdp.LoaderID `json:"loaderId,omitempty"` // Loader identifier. DocumentURL string `json:"documentURL,omitempty"` // URL of the document this request is loaded for. Request *Request `json:"request,omitempty"` // Request data. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. - WallTime cdp.Timestamp `json:"wallTime,omitempty"` // UTC Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + WallTime *cdp.Timestamp `json:"wallTime,omitempty"` // UTC Timestamp. Initiator *Initiator `json:"initiator,omitempty"` // Request initiator. RedirectResponse *Response `json:"redirectResponse,omitempty"` // Redirect response data. Type page.ResourceType `json:"type,omitempty"` // Type of this resource. @@ -39,30 +39,30 @@ type EventResponseReceived struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. FrameID cdp.FrameID `json:"frameId,omitempty"` // Frame identifier. LoaderID cdp.LoaderID `json:"loaderId,omitempty"` // Loader identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. Type page.ResourceType `json:"type,omitempty"` // Resource type. Response *Response `json:"response,omitempty"` // Response data. } // EventDataReceived fired when data chunk was received over the network. type EventDataReceived struct { - RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. - DataLength int64 `json:"dataLength,omitempty"` // Data chunk length. - EncodedDataLength int64 `json:"encodedDataLength,omitempty"` // Actual bytes received (might be less than dataLength for compressed encodings). + RequestID RequestID `json:"requestId,omitempty"` // Request identifier. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + DataLength int64 `json:"dataLength,omitempty"` // Data chunk length. + EncodedDataLength int64 `json:"encodedDataLength,omitempty"` // Actual bytes received (might be less than dataLength for compressed encodings). } // EventLoadingFinished fired when HTTP request has finished loading. type EventLoadingFinished struct { - RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. - EncodedDataLength float64 `json:"encodedDataLength,omitempty"` // Total number of bytes received for this request. + RequestID RequestID `json:"requestId,omitempty"` // Request identifier. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + EncodedDataLength float64 `json:"encodedDataLength,omitempty"` // Total number of bytes received for this request. } // EventLoadingFailed fired when HTTP request has failed to load. type EventLoadingFailed struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. Type page.ResourceType `json:"type,omitempty"` // Resource type. ErrorText string `json:"errorText,omitempty"` // User friendly error message. Canceled bool `json:"canceled,omitempty"` // True if loading was canceled. @@ -73,8 +73,8 @@ type EventLoadingFailed struct { // initiate handshake. type EventWebSocketWillSendHandshakeRequest struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. - WallTime cdp.Timestamp `json:"wallTime,omitempty"` // UTC Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + WallTime *cdp.Timestamp `json:"wallTime,omitempty"` // UTC Timestamp. Request *WebSocketRequest `json:"request,omitempty"` // WebSocket request data. } @@ -82,7 +82,7 @@ type EventWebSocketWillSendHandshakeRequest struct { // response becomes available. type EventWebSocketHandshakeResponseReceived struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. Response *WebSocketResponse `json:"response,omitempty"` // WebSocket response data. } @@ -95,39 +95,39 @@ type EventWebSocketCreated struct { // EventWebSocketClosed fired when WebSocket is closed. type EventWebSocketClosed struct { - RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + RequestID RequestID `json:"requestId,omitempty"` // Request identifier. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. } // EventWebSocketFrameReceived fired when WebSocket frame is received. type EventWebSocketFrameReceived struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. Response *WebSocketFrame `json:"response,omitempty"` // WebSocket response data. } // EventWebSocketFrameError fired when WebSocket frame error occurs. type EventWebSocketFrameError struct { - RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. - ErrorMessage string `json:"errorMessage,omitempty"` // WebSocket frame error message. + RequestID RequestID `json:"requestId,omitempty"` // Request identifier. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + ErrorMessage string `json:"errorMessage,omitempty"` // WebSocket frame error message. } // EventWebSocketFrameSent fired when WebSocket frame is sent. type EventWebSocketFrameSent struct { RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. Response *WebSocketFrame `json:"response,omitempty"` // WebSocket response data. } // EventEventSourceMessageReceived fired when EventSource message is // received. type EventEventSourceMessageReceived struct { - RequestID RequestID `json:"requestId,omitempty"` // Request identifier. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. - EventName string `json:"eventName,omitempty"` // Message type. - EventID string `json:"eventId,omitempty"` // Message identifier. - Data string `json:"data,omitempty"` // Message content. + RequestID RequestID `json:"requestId,omitempty"` // Request identifier. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Timestamp. + EventName string `json:"eventName,omitempty"` // Message type. + EventID string `json:"eventId,omitempty"` // Message identifier. + Data string `json:"data,omitempty"` // Message content. } // EventRequestIntercepted details of an intercepted HTTP request, which must diff --git a/cdp/network/network.go b/cdp/network/network.go index 8b35df8..737c5eb 100644 --- a/cdp/network/network.go +++ b/cdp/network/network.go @@ -407,7 +407,7 @@ type SetCookieParams struct { Secure bool `json:"secure,omitempty"` // Defaults ot false. HTTPOnly bool `json:"httpOnly,omitempty"` // Defaults to false. SameSite CookieSameSite `json:"sameSite,omitempty"` // Defaults to browser default behavior. - ExpirationDate cdp.Timestamp `json:"expirationDate,omitempty"` // If omitted, the cookie becomes a session cookie. + ExpirationDate *cdp.Timestamp `json:"expirationDate,omitempty"` // If omitted, the cookie becomes a session cookie. } // SetCookie sets a cookie with the given cookie data; may overwrite @@ -456,7 +456,7 @@ func (p SetCookieParams) WithSameSite(sameSite CookieSameSite) *SetCookieParams } // WithExpirationDate if omitted, the cookie becomes a session cookie. -func (p SetCookieParams) WithExpirationDate(expirationDate cdp.Timestamp) *SetCookieParams { +func (p SetCookieParams) WithExpirationDate(expirationDate *cdp.Timestamp) *SetCookieParams { p.ExpirationDate = expirationDate return &p } diff --git a/cdp/network/types.go b/cdp/network/types.go index 35a42a7..b0ff755 100644 --- a/cdp/network/types.go +++ b/cdp/network/types.go @@ -297,14 +297,14 @@ type Request struct { // SignedCertificateTimestamp details of a signed certificate timestamp // (SCT). type SignedCertificateTimestamp struct { - Status string `json:"status,omitempty"` // Validation status. - Origin string `json:"origin,omitempty"` // Origin. - LogDescription string `json:"logDescription,omitempty"` // Log name / description. - LogID string `json:"logId,omitempty"` // Log ID. - Timestamp cdp.Timestamp `json:"timestamp,omitempty"` // Issuance date. - HashAlgorithm string `json:"hashAlgorithm,omitempty"` // Hash algorithm. - SignatureAlgorithm string `json:"signatureAlgorithm,omitempty"` // Signature algorithm. - SignatureData string `json:"signatureData,omitempty"` // Signature data. + Status string `json:"status,omitempty"` // Validation status. + Origin string `json:"origin,omitempty"` // Origin. + LogDescription string `json:"logDescription,omitempty"` // Log name / description. + LogID string `json:"logId,omitempty"` // Log ID. + Timestamp *cdp.Timestamp `json:"timestamp,omitempty"` // Issuance date. + HashAlgorithm string `json:"hashAlgorithm,omitempty"` // Hash algorithm. + SignatureAlgorithm string `json:"signatureAlgorithm,omitempty"` // Signature algorithm. + SignatureData string `json:"signatureData,omitempty"` // Signature data. } // SecurityDetails security details about a request. @@ -318,8 +318,8 @@ type SecurityDetails struct { SubjectName string `json:"subjectName,omitempty"` // Certificate subject name. SanList []string `json:"sanList,omitempty"` // Subject Alternative Name (SAN) DNS names and IP addresses. Issuer string `json:"issuer,omitempty"` // Name of the issuing CA. - ValidFrom cdp.Timestamp `json:"validFrom,omitempty"` // Certificate valid from date. - ValidTo cdp.Timestamp `json:"validTo,omitempty"` // Certificate valid to (expiration) date + ValidFrom *cdp.Timestamp `json:"validFrom,omitempty"` // Certificate valid from date. + ValidTo *cdp.Timestamp `json:"validTo,omitempty"` // Certificate valid to (expiration) date SignedCertificateTimestampList []*SignedCertificateTimestamp `json:"signedCertificateTimestampList,omitempty"` // List of signed certificate timestamps (SCTs). } diff --git a/cdp/page/easyjson.go b/cdp/page/easyjson.go index c877a85..5a21396 100644 --- a/cdp/page/easyjson.go +++ b/cdp/page/easyjson.go @@ -834,7 +834,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpPage9(in *jlexer.Lexer, out *S case "scrollOffsetY": out.ScrollOffsetY = float64(in.Float64()) case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(Bootstamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -897,13 +905,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpPage9(out *jwriter.Writer, in out.RawString("\"scrollOffsetY\":") out.Float64(float64(in.ScrollOffsetY)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } @@ -3091,7 +3103,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpPage34(in *jlexer.Lexer, out * case "mimeType": out.MimeType = string(in.String()) case "lastModified": - out.LastModified = cdp.Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.LastModified = nil + } else { + if out.LastModified == nil { + out.LastModified = new(cdp.Timestamp) + } + (*out.LastModified).UnmarshalEasyJSON(in) + } case "contentSize": out.ContentSize = float64(in.Float64()) case "failed": @@ -3136,13 +3156,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpPage34(out *jwriter.Writer, in out.RawString("\"mimeType\":") out.String(string(in.MimeType)) } - if in.LastModified != 0 { + if in.LastModified != nil { if !first { out.RawByte(',') } first = false out.RawString("\"lastModified\":") - out.Float64(float64(in.LastModified)) + if in.LastModified == nil { + out.RawString("null") + } else { + (*in.LastModified).MarshalEasyJSON(out) + } } if in.ContentSize != 0 { if !first { @@ -3483,7 +3507,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpPage38(in *jlexer.Lexer, out * } switch key { case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(Bootstamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -3498,13 +3530,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpPage38(out *jwriter.Writer, in out.RawByte('{') first := true _ = first - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } @@ -4414,7 +4450,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpPage51(in *jlexer.Lexer, out * } switch key { case "timestamp": - out.Timestamp = float64(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(Bootstamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } default: in.SkipRecursive() } @@ -4429,13 +4473,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpPage51(out *jwriter.Writer, in out.RawByte('{') first := true _ = first - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } out.RawByte('}') } diff --git a/cdp/page/events.go b/cdp/page/events.go index 7e5740e..4779359 100644 --- a/cdp/page/events.go +++ b/cdp/page/events.go @@ -9,12 +9,12 @@ import ( // EventDomContentEventFired [no description]. type EventDomContentEventFired struct { - Timestamp float64 `json:"timestamp,omitempty"` + Timestamp *Bootstamp `json:"timestamp,omitempty"` } // EventLoadEventFired [no description]. type EventLoadEventFired struct { - Timestamp float64 `json:"timestamp,omitempty"` + Timestamp *Bootstamp `json:"timestamp,omitempty"` } // EventFrameAttached fired when frame has been attached to its parent. diff --git a/cdp/page/types.go b/cdp/page/types.go index de57256..edb5ee4 100644 --- a/cdp/page/types.go +++ b/cdp/page/types.go @@ -4,8 +4,11 @@ package page import ( "errors" + "strconv" + "time" cdp "github.com/knq/chromedp/cdp" + "github.com/knq/sysutil" "github.com/mailru/easyjson" "github.com/mailru/easyjson/jlexer" "github.com/mailru/easyjson/jwriter" @@ -88,13 +91,13 @@ func (t *ResourceType) UnmarshalJSON(buf []byte) error { // FrameResource information about the Resource on the page. type FrameResource struct { - URL string `json:"url,omitempty"` // Resource URL. - Type ResourceType `json:"type,omitempty"` // Type of this resource. - MimeType string `json:"mimeType,omitempty"` // Resource mimeType as determined by the browser. - LastModified cdp.Timestamp `json:"lastModified,omitempty"` // last-modified timestamp as reported by server. - ContentSize float64 `json:"contentSize,omitempty"` // Resource content size. - Failed bool `json:"failed,omitempty"` // True if the resource failed to load. - Canceled bool `json:"canceled,omitempty"` // True if the resource was canceled during loading. + URL string `json:"url,omitempty"` // Resource URL. + Type ResourceType `json:"type,omitempty"` // Type of this resource. + MimeType string `json:"mimeType,omitempty"` // Resource mimeType as determined by the browser. + LastModified *cdp.Timestamp `json:"lastModified,omitempty"` // last-modified timestamp as reported by server. + ContentSize float64 `json:"contentSize,omitempty"` // Resource content size. + Failed bool `json:"failed,omitempty"` // True if the resource failed to load. + Canceled bool `json:"canceled,omitempty"` // True if the resource was canceled during loading. } // FrameResourceTree information about the Frame hierarchy along with their @@ -196,13 +199,13 @@ type NavigationEntry struct { // ScreencastFrameMetadata screencast frame metadata. type ScreencastFrameMetadata struct { - OffsetTop float64 `json:"offsetTop,omitempty"` // Top offset in DIP. - PageScaleFactor float64 `json:"pageScaleFactor,omitempty"` // Page scale factor. - DeviceWidth float64 `json:"deviceWidth,omitempty"` // Device screen width in DIP. - DeviceHeight float64 `json:"deviceHeight,omitempty"` // Device screen height in DIP. - ScrollOffsetX float64 `json:"scrollOffsetX,omitempty"` // Position of horizontal scroll in CSS pixels. - ScrollOffsetY float64 `json:"scrollOffsetY,omitempty"` // Position of vertical scroll in CSS pixels. - Timestamp float64 `json:"timestamp,omitempty"` // Frame swap timestamp. + OffsetTop float64 `json:"offsetTop,omitempty"` // Top offset in DIP. + PageScaleFactor float64 `json:"pageScaleFactor,omitempty"` // Page scale factor. + DeviceWidth float64 `json:"deviceWidth,omitempty"` // Device screen width in DIP. + DeviceHeight float64 `json:"deviceHeight,omitempty"` // Device screen height in DIP. + ScrollOffsetX float64 `json:"scrollOffsetX,omitempty"` // Position of horizontal scroll in CSS pixels. + ScrollOffsetY float64 `json:"scrollOffsetY,omitempty"` // Position of vertical scroll in CSS pixels. + Timestamp *Bootstamp `json:"timestamp,omitempty"` // Frame swap timestamp. } // DialogType javascript dialog type. @@ -327,6 +330,37 @@ type VisualViewport struct { Scale float64 `json:"scale,omitempty"` // Scale relative to the ideal viewport (size at width=device-width). } +// Bootstamp bootstamp type. +type Bootstamp time.Time + +// Time returns the Bootstamp as time.Time value. +func (t Bootstamp) Time() time.Time { + return time.Time(t) +} + +// MarshalEasyJSON satisfies easyjson.Marshaler. +func (t Bootstamp) MarshalEasyJSON(out *jwriter.Writer) { + v := float64(time.Time(t).Sub(sysutil.BootTime())) / float64(time.Second) + + out.Buffer.EnsureSpace(20) + out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64) +} + +// MarshalJSON satisfies json.Marshaler. +func (t Bootstamp) MarshalJSON() ([]byte, error) { + return easyjson.Marshal(t) +} + +// UnmarshalEasyJSON satisfies easyjson.Unmarshaler. +func (t *Bootstamp) UnmarshalEasyJSON(in *jlexer.Lexer) { + *t = Bootstamp(sysutil.BootTime().Add(time.Duration(in.Float64() * float64(time.Second)))) +} + +// UnmarshalJSON satisfies json.Unmarshaler. +func (t *Bootstamp) UnmarshalJSON(buf []byte) error { + return easyjson.Unmarshal(buf, t) +} + // CaptureScreenshotFormat image compression format (defaults to png). type CaptureScreenshotFormat string diff --git a/cdp/runtime/easyjson.go b/cdp/runtime/easyjson.go index 375e30a..fa94a67 100644 --- a/cdp/runtime/easyjson.go +++ b/cdp/runtime/easyjson.go @@ -2361,7 +2361,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpRuntime20(in *jlexer.Lexer, ou } switch key { case "timestamp": - out.Timestamp = Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "exceptionDetails": if in.IsNull() { in.Skip() @@ -2386,13 +2394,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpRuntime20(out *jwriter.Writer, out.RawByte('{') first := true _ = first - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.ExceptionDetails != nil { if !first { @@ -2566,7 +2578,15 @@ func easyjsonC5a4559bDecodeGithubComKnqChromedpCdpRuntime22(in *jlexer.Lexer, ou case "executionContextId": out.ExecutionContextID = ExecutionContextID(in.Int64()) case "timestamp": - out.Timestamp = Timestamp(in.Float64()) + if in.IsNull() { + in.Skip() + out.Timestamp = nil + } else { + if out.Timestamp == nil { + out.Timestamp = new(Timestamp) + } + (*out.Timestamp).UnmarshalEasyJSON(in) + } case "stackTrace": if in.IsNull() { in.Skip() @@ -2632,13 +2652,17 @@ func easyjsonC5a4559bEncodeGithubComKnqChromedpCdpRuntime22(out *jwriter.Writer, out.RawString("\"executionContextId\":") out.Int64(int64(in.ExecutionContextID)) } - if in.Timestamp != 0 { + if in.Timestamp != nil { if !first { out.RawByte(',') } first = false out.RawString("\"timestamp\":") - out.Float64(float64(in.Timestamp)) + if in.Timestamp == nil { + out.RawString("null") + } else { + (*in.Timestamp).MarshalEasyJSON(out) + } } if in.StackTrace != nil { if !first { diff --git a/cdp/runtime/events.go b/cdp/runtime/events.go index a736070..2dfafa0 100644 --- a/cdp/runtime/events.go +++ b/cdp/runtime/events.go @@ -23,7 +23,7 @@ type EventExecutionContextsCleared struct{} // EventExceptionThrown issued when exception was thrown and unhandled. type EventExceptionThrown struct { - Timestamp Timestamp `json:"timestamp,omitempty"` // Timestamp of the exception. + Timestamp *Timestamp `json:"timestamp,omitempty"` // Timestamp of the exception. ExceptionDetails *ExceptionDetails `json:"exceptionDetails,omitempty"` } @@ -38,7 +38,7 @@ type EventConsoleAPICalled struct { Type APIType `json:"type,omitempty"` // Type of the call. Args []*RemoteObject `json:"args,omitempty"` // Call arguments. ExecutionContextID ExecutionContextID `json:"executionContextId,omitempty"` // Identifier of the context where the call was made. - Timestamp Timestamp `json:"timestamp,omitempty"` // Call timestamp. + Timestamp *Timestamp `json:"timestamp,omitempty"` // Call timestamp. StackTrace *StackTrace `json:"stackTrace,omitempty"` // Stack trace captured when the call was made. Context string `json:"context,omitempty"` // Console context descriptor for calls on non-default console context (not console.*): 'anonymous#unique-logger-id' for call on unnamed context, 'name#unique-logger-id' for call on named context. } diff --git a/cdp/runtime/types.go b/cdp/runtime/types.go index 3eaa61b..cb7eb4c 100644 --- a/cdp/runtime/types.go +++ b/cdp/runtime/types.go @@ -3,6 +3,8 @@ package runtime import ( "errors" "fmt" + "strconv" + "time" "github.com/mailru/easyjson" "github.com/mailru/easyjson/jlexer" @@ -190,11 +192,34 @@ func (e *ExceptionDetails) Error() string { } // Timestamp number of milliseconds since epoch. -type Timestamp float64 +type Timestamp time.Time -// Float64 returns the Timestamp as float64 value. -func (t Timestamp) Float64() float64 { - return float64(t) +// Time returns the Timestamp as time.Time value. +func (t Timestamp) Time() time.Time { + return time.Time(t) +} + +// MarshalEasyJSON satisfies easyjson.Marshaler. +func (t Timestamp) MarshalEasyJSON(out *jwriter.Writer) { + v := float64(time.Time(t).UnixNano() / int64(time.Millisecond)) + + out.Buffer.EnsureSpace(20) + out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64) +} + +// MarshalJSON satisfies json.Marshaler. +func (t Timestamp) MarshalJSON() ([]byte, error) { + return easyjson.Marshal(t) +} + +// UnmarshalEasyJSON satisfies easyjson.Unmarshaler. +func (t *Timestamp) UnmarshalEasyJSON(in *jlexer.Lexer) { + *t = Timestamp(time.Unix(0, int64(in.Float64()*float64(time.Millisecond)))) +} + +// UnmarshalJSON satisfies json.Unmarshaler. +func (t *Timestamp) UnmarshalJSON(buf []byte) error { + return easyjson.Unmarshal(buf, t) } // CallFrame stack entry for runtime errors and assertions. diff --git a/cmd/chromedp-gen/fixup/fixup.go b/cmd/chromedp-gen/fixup/fixup.go index 00d201b..2f53420 100644 --- a/cmd/chromedp-gen/fixup/fixup.go +++ b/cmd/chromedp-gen/fixup/fixup.go @@ -12,14 +12,19 @@ // - add 'Inspector.Message' type as a object with id (integer), method (MethodType), params (interface{}), error (MessageError). // - add 'Inspector.DetachReason' type and change event 'Inspector.detached''s parameter reason's type. // - add 'Inspector.ErrorType' type. +// - change type of Network.Timestamp and Runtime.Timestamp to internal Timestamp type. +// - add 'Page.Bootstamp' type and convert all command/event parameters named +// 'timestamp' in the Page domain to the Bootstamp type. // - change any object property or command/event parameter named 'timestamp' -// that doesn't have a $ref defined to 'Runtime.Timestamp'. +// that doesn't have a $ref defined to 'Network.Timestamp'. // - convert object properties and event/command parameters that are enums into independent types. // - change '*.modifiers' parameters to type Input.Modifier. // - add 'DOM.NodeType' type and convert "nodeType" parameters to it. // - change Page.Frame.id/parentID to FrameID type. // - add additional properties to 'Page.Frame' and 'DOM.Node' for use by higher level packages. -// - add special unmarshaler to NodeId, BackendNodeId, FrameId to handle values from older (v1.1) protocol versions. -- NOTE: this might need to be applied to more types, such as network.LoaderId +// - add special unmarshaler to NodeId, BackendNodeId, FrameId to handle +// values from older (v1.1) protocol versions. -- NOTE: this might need to be +// applied to more types, such as network.LoaderId // - rename 'Input.GestureSourceType' -> 'Input.GestureType'. // - rename CSS.CSS* types. // - add Error() method to 'Runtime.ExceptionDetails' type so that it can be used as error. @@ -33,7 +38,6 @@ package fixup import ( "fmt" - "log" "strings" "github.com/knq/chromedp/cmd/chromedp-gen/internal" @@ -197,6 +201,14 @@ func FixDomains(domains []*internal.Domain) { }, } + // bootstamp type + bootstampType := &internal.Type{ + ID: "Bootstamp", + Type: internal.TypeTimestamp, + TimestampType: internal.TimestampTypeBootstamp, + Description: "Bootstamp type.", + } + // process domains for _, d := range domains { switch d.Domain { @@ -279,8 +291,14 @@ func FixDomains(domains []*internal.Domain) { } case internal.DomainPage: + // add Page types + d.Types = append(d.Types, bootstampType) + for _, t := range d.Types { switch t.ID { + case "Bootstamp": + t.Extra += templates.ExtraTimestampTemplate(t, d) + case "FrameId": t.Extra += templates.ExtraFixStringUnmarshaler(internal.ForceCamel(t.ID), "", "") @@ -330,10 +348,11 @@ func FixDomains(domains []*internal.Domain) { case internal.DomainNetwork: for _, t := range d.Types { // change Timestamp to TypeTimestamp and add extra unmarshaling template - /*if t.ID == "Timestamp" { + if t.ID == "Timestamp" { t.Type = internal.TypeTimestamp + t.TimestampType = internal.TimestampTypeSecond t.Extra = templates.ExtraTimestampTemplate(t, d) - }*/ + } // change Headers to be a map[string]interface{} if t.ID == "Headers" { @@ -346,9 +365,10 @@ func FixDomains(domains []*internal.Domain) { var types []*internal.Type for _, t := range d.Types { switch t.ID { - /*case "Timestamp": - t.Type = internal.TypeTimestamp - t.Extra += templates.ExtraBootstampTemplate(t, d)*/ + case "Timestamp": + t.Type = internal.TypeTimestamp + t.TimestampType = internal.TimestampTypeMillisecond + t.Extra += templates.ExtraTimestampTemplate(t, d) case "ExceptionDetails": t.Extra += templates.ExtraExceptionDetailsTemplate() @@ -439,15 +459,21 @@ func convertObjectProperties(params []*internal.Type, d *internal.Domain, name s case p.Enum != nil: r = append(r, fixupEnumParameter(name, p, d)) - case p.Name == "timestamp": - log.Printf(">>> %s.%s.%s", d.Domain, name, p.Name) - r = append(r, p) - /*r = append(r, &internal.Type{ - Name: p.Name, - Ref: "Runtime.Timestamp", - Description: p.Description, - Optional: p.Optional, - })*/ + case p.Name == "timestamp" && p.Ref == "" && d.Domain == internal.DomainPage: + r = append(r, &internal.Type{ + Name: p.Name, + Ref: "Page.Bootstamp", + Description: p.Description, + Optional: p.Optional, + }) + + case p.Name == "timestamp" && p.Ref == "": + r = append(r, &internal.Type{ + Name: p.Name, + Ref: "Network.Timestamp", + Description: p.Description, + Optional: p.Optional, + }) case p.Name == "modifiers": r = append(r, &internal.Type{ diff --git a/cmd/chromedp-gen/internal/enum.go b/cmd/chromedp-gen/internal/enum.go index 3b88d24..ed046df 100644 --- a/cmd/chromedp-gen/internal/enum.go +++ b/cmd/chromedp-gen/internal/enum.go @@ -148,3 +148,12 @@ func (te TypeEnum) GoEmptyValue() string { return `nil` } + +// TimestampType are the various timestamp subtypes. +type TimestampType int + +const ( + TimestampTypeMillisecond TimestampType = 1 + iota + TimestampTypeSecond + TimestampTypeBootstamp +) diff --git a/cmd/chromedp-gen/internal/types.go b/cmd/chromedp-gen/internal/types.go index 5d81ec4..7872d8c 100644 --- a/cmd/chromedp-gen/internal/types.go +++ b/cmd/chromedp-gen/internal/types.go @@ -145,6 +145,9 @@ type Type struct { // Redirect is the redirect value for the command or event. Redirect DomainType `json:"redirect,omitempty"` + // TimestampType is the timestamp subtype. + TimestampType TimestampType `json:"-"` + // NoExpose toggles whether or not to expose the type. NoExpose bool `json:"-"` diff --git a/cmd/chromedp-gen/templates/extra.qtpl b/cmd/chromedp-gen/templates/extra.qtpl index f3ba0a0..0f60154 100644 --- a/cmd/chromedp-gen/templates/extra.qtpl +++ b/cmd/chromedp-gen/templates/extra.qtpl @@ -6,14 +6,18 @@ // defines its JSON unmarshaling. {% func ExtraTimestampTemplate(t *internal.Type, d *internal.Domain) %}{%code typ := t.IDorName() - bootstamp := false + bootstamp := t.TimestampType == internal.TimestampTypeBootstamp + timeRes := "time.Millisecond" + if t.TimestampType != internal.TimestampTypeMillisecond { + timeRes = "time.Second" + } %} // MarshalEasyJSON satisfies easyjson.Marshaler. func (t {%s= typ %}) MarshalEasyJSON(out *jwriter.Writer) { -{% if bootstamp %} - out.Float64(float64(time.Time(t).Sub(sysutil.BootTime()))/float64(time.Second)){% else %} - out.Float64(float64(time.Time(t))/float64(time.Second)) -{% endif %} + v := {% if bootstamp %}float64(time.Time(t).Sub(sysutil.BootTime()))/float64(time.Second){% else %}float64(time.Time(t).UnixNano()/int64({%s= timeRes %})){% endif %} + + out.Buffer.EnsureSpace(20) + out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64) } // MarshalJSON satisfies json.Marshaler. @@ -22,11 +26,9 @@ func (t {%s= typ %}) MarshalJSON() ([]byte, error) { } // UnmarshalEasyJSON satisfies easyjson.Unmarshaler. -func (t *{%s= typ %}) UnmarshalEasyJSON(in *jlexer.Lexer) { -{% if bootstamp %} +func (t *{%s= typ %}) UnmarshalEasyJSON(in *jlexer.Lexer) {{% if bootstamp %} *t = {%s= typ %}(sysutil.BootTime().Add(time.Duration(in.Float64()*float64(time.Second)))){% else %} - *t = {%s= typ %}(time.Duration(in.Float64()*float64(time.Second))) -{% endif %} + *t = {%s= typ %}(time.Unix(0, int64(in.Float64()*float64({%s= timeRes %})))){% endif %} } // UnmarshalJSON satisfies json.Unmarshaler. diff --git a/cmd/chromedp-gen/templates/extra.qtpl.go b/cmd/chromedp-gen/templates/extra.qtpl.go index 6510bc3..f955a43 100644 --- a/cmd/chromedp-gen/templates/extra.qtpl.go +++ b/cmd/chromedp-gen/templates/extra.qtpl.go @@ -29,118 +29,128 @@ var ( func StreamExtraTimestampTemplate(qw422016 *qt422016.Writer, t *internal.Type, d *internal.Domain) { //line templates/extra.qtpl:8 typ := t.IDorName() - bootstamp := false + bootstamp := t.TimestampType == internal.TimestampTypeBootstamp + timeRes := "time.Millisecond" + if t.TimestampType != internal.TimestampTypeMillisecond { + timeRes = "time.Second" + } - //line templates/extra.qtpl:10 + //line templates/extra.qtpl:14 qw422016.N().S(` // MarshalEasyJSON satisfies easyjson.Marshaler. func (t `) - //line templates/extra.qtpl:12 - qw422016.N().S(typ) - //line templates/extra.qtpl:12 - qw422016.N().S(`) MarshalEasyJSON(out *jwriter.Writer) { -`) - //line templates/extra.qtpl:13 - if bootstamp { - //line templates/extra.qtpl:13 - qw422016.N().S(` - out.Float64(float64(time.Time(t).Sub(sysutil.BootTime()))/float64(time.Second))`) - //line templates/extra.qtpl:14 - } else { - //line templates/extra.qtpl:14 - qw422016.N().S(` - out.Float64(float64(time.Time(t))/float64(time.Second)) -`) - //line templates/extra.qtpl:16 - } //line templates/extra.qtpl:16 + qw422016.N().S(typ) + //line templates/extra.qtpl:16 + qw422016.N().S(`) MarshalEasyJSON(out *jwriter.Writer) { + v := `) + //line templates/extra.qtpl:17 + if bootstamp { + //line templates/extra.qtpl:17 + qw422016.N().S(`float64(time.Time(t).Sub(sysutil.BootTime()))/float64(time.Second)`) + //line templates/extra.qtpl:17 + } else { + //line templates/extra.qtpl:17 + qw422016.N().S(`float64(time.Time(t).UnixNano()/int64(`) + //line templates/extra.qtpl:17 + qw422016.N().S(timeRes) + //line templates/extra.qtpl:17 + qw422016.N().S(`))`) + //line templates/extra.qtpl:17 + } + //line templates/extra.qtpl:17 qw422016.N().S(` + + out.Buffer.EnsureSpace(20) + out.Buffer.Buf = strconv.AppendFloat(out.Buffer.Buf, v, 'f', -1, 64) } // MarshalJSON satisfies json.Marshaler. func (t `) - //line templates/extra.qtpl:20 + //line templates/extra.qtpl:24 qw422016.N().S(typ) - //line templates/extra.qtpl:20 + //line templates/extra.qtpl:24 qw422016.N().S(`) MarshalJSON() ([]byte, error) { return easyjson.Marshal(t) } // UnmarshalEasyJSON satisfies easyjson.Unmarshaler. func (t *`) - //line templates/extra.qtpl:25 - qw422016.N().S(typ) - //line templates/extra.qtpl:25 - qw422016.N().S(`) UnmarshalEasyJSON(in *jlexer.Lexer) { -`) - //line templates/extra.qtpl:26 - if bootstamp { - //line templates/extra.qtpl:26 - qw422016.N().S(` - *t = `) - //line templates/extra.qtpl:27 - qw422016.N().S(typ) - //line templates/extra.qtpl:27 - qw422016.N().S(`(sysutil.BootTime().Add(time.Duration(in.Float64()*float64(time.Second))))`) - //line templates/extra.qtpl:27 - } else { - //line templates/extra.qtpl:27 - qw422016.N().S(` - *t = `) - //line templates/extra.qtpl:28 - qw422016.N().S(typ) - //line templates/extra.qtpl:28 - qw422016.N().S(`(time.Duration(in.Float64()*float64(time.Second))) -`) - //line templates/extra.qtpl:29 - } //line templates/extra.qtpl:29 + qw422016.N().S(typ) + //line templates/extra.qtpl:29 + qw422016.N().S(`) UnmarshalEasyJSON(in *jlexer.Lexer) {`) + //line templates/extra.qtpl:29 + if bootstamp { + //line templates/extra.qtpl:29 + qw422016.N().S(` + *t = `) + //line templates/extra.qtpl:30 + qw422016.N().S(typ) + //line templates/extra.qtpl:30 + qw422016.N().S(`(sysutil.BootTime().Add(time.Duration(in.Float64()*float64(time.Second))))`) + //line templates/extra.qtpl:30 + } else { + //line templates/extra.qtpl:30 + qw422016.N().S(` + *t = `) + //line templates/extra.qtpl:31 + qw422016.N().S(typ) + //line templates/extra.qtpl:31 + qw422016.N().S(`(time.Unix(0, int64(in.Float64()*float64(`) + //line templates/extra.qtpl:31 + qw422016.N().S(timeRes) + //line templates/extra.qtpl:31 + qw422016.N().S(`))))`) + //line templates/extra.qtpl:31 + } + //line templates/extra.qtpl:31 qw422016.N().S(` } // UnmarshalJSON satisfies json.Unmarshaler. func (t *`) - //line templates/extra.qtpl:33 + //line templates/extra.qtpl:35 qw422016.N().S(typ) - //line templates/extra.qtpl:33 + //line templates/extra.qtpl:35 qw422016.N().S(`) UnmarshalJSON(buf []byte) error { return easyjson.Unmarshal(buf, t) } `) -//line templates/extra.qtpl:36 +//line templates/extra.qtpl:38 } -//line templates/extra.qtpl:36 +//line templates/extra.qtpl:38 func WriteExtraTimestampTemplate(qq422016 qtio422016.Writer, t *internal.Type, d *internal.Domain) { - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 StreamExtraTimestampTemplate(qw422016, t, d) - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:36 +//line templates/extra.qtpl:38 } -//line templates/extra.qtpl:36 +//line templates/extra.qtpl:38 func ExtraTimestampTemplate(t *internal.Type, d *internal.Domain) string { - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 WriteExtraTimestampTemplate(qb422016, t, d) - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:36 + //line templates/extra.qtpl:38 return qs422016 -//line templates/extra.qtpl:36 +//line templates/extra.qtpl:38 } // ExtraFrameTemplate is a special template for the Page.Frame type, adding FrameState. -//line templates/extra.qtpl:39 +//line templates/extra.qtpl:41 func StreamExtraFrameTemplate(qw422016 *qt422016.Writer) { - //line templates/extra.qtpl:39 + //line templates/extra.qtpl:41 qw422016.N().S(` // FrameState is the state of a Frame. type FrameState uint16 @@ -179,40 +189,40 @@ func (fs FrameState) String() string { // EmptyFrameID is the "non-existent" frame id. const EmptyFrameID = FrameID("") `) -//line templates/extra.qtpl:76 +//line templates/extra.qtpl:78 } -//line templates/extra.qtpl:76 +//line templates/extra.qtpl:78 func WriteExtraFrameTemplate(qq422016 qtio422016.Writer) { - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 StreamExtraFrameTemplate(qw422016) - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:76 +//line templates/extra.qtpl:78 } -//line templates/extra.qtpl:76 +//line templates/extra.qtpl:78 func ExtraFrameTemplate() string { - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 WriteExtraFrameTemplate(qb422016) - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:76 + //line templates/extra.qtpl:78 return qs422016 -//line templates/extra.qtpl:76 +//line templates/extra.qtpl:78 } // ExtraNodeTemplate is a special template for the DOM.Node type, adding NodeState. -//line templates/extra.qtpl:79 +//line templates/extra.qtpl:81 func StreamExtraNodeTemplate(qw422016 *qt422016.Writer) { - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S(` // AttributeValue returns the named attribute for the node. func (n *Node) AttributeValue(name string) string { @@ -246,21 +256,21 @@ func (n *Node) xpath(stopAtDocument, stopAtID bool) string { case stopAtID && id != "": p = "/" pos = `) - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S("`") - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S(`[@id='`) - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S("`") - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S(`+id+`) - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S("`") - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S(`']`) - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S("`") - //line templates/extra.qtpl:79 + //line templates/extra.qtpl:81 qw422016.N().S(` case n.Parent != nil: @@ -344,136 +354,136 @@ func (ns NodeState) String() string { // EmptyNodeID is the "non-existent" node id. const EmptyNodeID = NodeID(0) `) -//line templates/extra.qtpl:193 +//line templates/extra.qtpl:195 } -//line templates/extra.qtpl:193 +//line templates/extra.qtpl:195 func WriteExtraNodeTemplate(qq422016 qtio422016.Writer) { - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 StreamExtraNodeTemplate(qw422016) - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:193 +//line templates/extra.qtpl:195 } -//line templates/extra.qtpl:193 +//line templates/extra.qtpl:195 func ExtraNodeTemplate() string { - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 WriteExtraNodeTemplate(qb422016) - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:193 + //line templates/extra.qtpl:195 return qs422016 -//line templates/extra.qtpl:193 +//line templates/extra.qtpl:195 } // ExtraFixStringUnmarshaler is a template that forces values to be parsed properly. -//line templates/extra.qtpl:196 +//line templates/extra.qtpl:198 func StreamExtraFixStringUnmarshaler(qw422016 *qt422016.Writer, typ, parseFunc, extra string) { - //line templates/extra.qtpl:196 + //line templates/extra.qtpl:198 qw422016.N().S(` // UnmarshalEasyJSON satisfies easyjson.Unmarshaler. func (t *`) - //line templates/extra.qtpl:198 + //line templates/extra.qtpl:200 qw422016.N().S(typ) - //line templates/extra.qtpl:198 + //line templates/extra.qtpl:200 qw422016.N().S(`) UnmarshalEasyJSON(in *jlexer.Lexer) { buf := in.Raw() if l := len(buf); l > 2 && buf[0] == '"' && buf[l-1] == '"' { buf = buf[1:l-1] } `) - //line templates/extra.qtpl:203 + //line templates/extra.qtpl:205 if parseFunc != "" { - //line templates/extra.qtpl:203 + //line templates/extra.qtpl:205 qw422016.N().S(` v, err := strconv.`) - //line templates/extra.qtpl:204 + //line templates/extra.qtpl:206 qw422016.N().S(parseFunc) - //line templates/extra.qtpl:204 + //line templates/extra.qtpl:206 qw422016.N().S(`(string(buf)`) - //line templates/extra.qtpl:204 + //line templates/extra.qtpl:206 qw422016.N().S(extra) - //line templates/extra.qtpl:204 + //line templates/extra.qtpl:206 qw422016.N().S(`) if err != nil { in.AddError(err) } `) - //line templates/extra.qtpl:208 + //line templates/extra.qtpl:210 } - //line templates/extra.qtpl:208 + //line templates/extra.qtpl:210 qw422016.N().S(` *t = `) - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 qw422016.N().S(typ) - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 qw422016.N().S(`(`) - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 if parseFunc != "" { - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 qw422016.N().S(`v`) - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 } else { - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 qw422016.N().S(`buf`) - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 } - //line templates/extra.qtpl:209 + //line templates/extra.qtpl:211 qw422016.N().S(`) } // UnmarshalJSON satisfies json.Unmarshaler. func (t *`) - //line templates/extra.qtpl:213 + //line templates/extra.qtpl:215 qw422016.N().S(typ) - //line templates/extra.qtpl:213 + //line templates/extra.qtpl:215 qw422016.N().S(`) UnmarshalJSON(buf []byte) error { return easyjson.Unmarshal(buf, t) } `) -//line templates/extra.qtpl:216 +//line templates/extra.qtpl:218 } -//line templates/extra.qtpl:216 +//line templates/extra.qtpl:218 func WriteExtraFixStringUnmarshaler(qq422016 qtio422016.Writer, typ, parseFunc, extra string) { - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 StreamExtraFixStringUnmarshaler(qw422016, typ, parseFunc, extra) - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:216 +//line templates/extra.qtpl:218 } -//line templates/extra.qtpl:216 +//line templates/extra.qtpl:218 func ExtraFixStringUnmarshaler(typ, parseFunc, extra string) string { - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 WriteExtraFixStringUnmarshaler(qb422016, typ, parseFunc, extra) - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:216 + //line templates/extra.qtpl:218 return qs422016 -//line templates/extra.qtpl:216 +//line templates/extra.qtpl:218 } // ExtraExceptionDetailsTemplate is a special template for the Runtime.ExceptionDetails type that // defines the standard error interface. -//line templates/extra.qtpl:220 +//line templates/extra.qtpl:222 func StreamExtraExceptionDetailsTemplate(qw422016 *qt422016.Writer) { - //line templates/extra.qtpl:220 + //line templates/extra.qtpl:222 qw422016.N().S(` // Error satisfies the error interface. func (e *ExceptionDetails) Error() string { @@ -482,41 +492,41 @@ func (e *ExceptionDetails) Error() string { return fmt.Sprintf("encountered exception '%s' (%d:%d)", e.Text, e.LineNumber, e.ColumnNumber) } `) -//line templates/extra.qtpl:227 +//line templates/extra.qtpl:229 } -//line templates/extra.qtpl:227 +//line templates/extra.qtpl:229 func WriteExtraExceptionDetailsTemplate(qq422016 qtio422016.Writer) { - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 StreamExtraExceptionDetailsTemplate(qw422016) - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:227 +//line templates/extra.qtpl:229 } -//line templates/extra.qtpl:227 +//line templates/extra.qtpl:229 func ExtraExceptionDetailsTemplate() string { - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 WriteExtraExceptionDetailsTemplate(qb422016) - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:227 + //line templates/extra.qtpl:229 return qs422016 -//line templates/extra.qtpl:227 +//line templates/extra.qtpl:229 } // ExtraCDPTypes is the template for additional internal type // declarations. -//line templates/extra.qtpl:231 +//line templates/extra.qtpl:233 func StreamExtraCDPTypes(qw422016 *qt422016.Writer) { - //line templates/extra.qtpl:231 + //line templates/extra.qtpl:233 qw422016.N().S(` // Error satisfies the error interface. @@ -550,40 +560,40 @@ type Handler interface { Release(<-chan interface{}) } `) -//line templates/extra.qtpl:263 +//line templates/extra.qtpl:265 } -//line templates/extra.qtpl:263 +//line templates/extra.qtpl:265 func WriteExtraCDPTypes(qq422016 qtio422016.Writer) { - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 StreamExtraCDPTypes(qw422016) - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:263 +//line templates/extra.qtpl:265 } -//line templates/extra.qtpl:263 +//line templates/extra.qtpl:265 func ExtraCDPTypes() string { - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 WriteExtraCDPTypes(qb422016) - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:263 + //line templates/extra.qtpl:265 return qs422016 -//line templates/extra.qtpl:263 +//line templates/extra.qtpl:265 } // ExtraUtilTemplate generates the decode func for the Message type. -//line templates/extra.qtpl:266 +//line templates/extra.qtpl:268 func StreamExtraUtilTemplate(qw422016 *qt422016.Writer, domains []*internal.Domain) { - //line templates/extra.qtpl:266 + //line templates/extra.qtpl:268 qw422016.N().S(` type empty struct{} var emptyVal = &empty{} @@ -592,66 +602,66 @@ var emptyVal = &empty{} func UnmarshalMessage(msg *cdp.Message) (interface{}, error) { var v easyjson.Unmarshaler switch msg.Method {`) - //line templates/extra.qtpl:273 + //line templates/extra.qtpl:275 for _, d := range domains { - //line templates/extra.qtpl:273 + //line templates/extra.qtpl:275 for _, c := range d.Commands { - //line templates/extra.qtpl:273 + //line templates/extra.qtpl:275 qw422016.N().S(` case cdp.`) - //line templates/extra.qtpl:274 + //line templates/extra.qtpl:276 qw422016.N().S(c.CommandMethodType(d)) - //line templates/extra.qtpl:274 + //line templates/extra.qtpl:276 qw422016.N().S(`:`) - //line templates/extra.qtpl:274 + //line templates/extra.qtpl:276 if len(c.Returns) == 0 { - //line templates/extra.qtpl:274 + //line templates/extra.qtpl:276 qw422016.N().S(` return emptyVal, nil`) - //line templates/extra.qtpl:275 + //line templates/extra.qtpl:277 } else { - //line templates/extra.qtpl:275 + //line templates/extra.qtpl:277 qw422016.N().S(` v = new(`) - //line templates/extra.qtpl:276 + //line templates/extra.qtpl:278 qw422016.N().S(d.PackageRefName()) - //line templates/extra.qtpl:276 + //line templates/extra.qtpl:278 qw422016.N().S(`.`) - //line templates/extra.qtpl:276 + //line templates/extra.qtpl:278 qw422016.N().S(c.CommandReturnsType()) - //line templates/extra.qtpl:276 + //line templates/extra.qtpl:278 qw422016.N().S(`)`) - //line templates/extra.qtpl:276 + //line templates/extra.qtpl:278 } - //line templates/extra.qtpl:276 + //line templates/extra.qtpl:278 qw422016.N().S(` `) - //line templates/extra.qtpl:277 + //line templates/extra.qtpl:279 } - //line templates/extra.qtpl:277 + //line templates/extra.qtpl:279 for _, e := range d.Events { - //line templates/extra.qtpl:277 + //line templates/extra.qtpl:279 qw422016.N().S(` case cdp.`) - //line templates/extra.qtpl:278 + //line templates/extra.qtpl:280 qw422016.N().S(e.EventMethodType(d)) - //line templates/extra.qtpl:278 + //line templates/extra.qtpl:280 qw422016.N().S(`: v = new(`) - //line templates/extra.qtpl:279 + //line templates/extra.qtpl:281 qw422016.N().S(d.PackageRefName()) - //line templates/extra.qtpl:279 + //line templates/extra.qtpl:281 qw422016.N().S(`.`) - //line templates/extra.qtpl:279 + //line templates/extra.qtpl:281 qw422016.N().S(e.EventType()) - //line templates/extra.qtpl:279 + //line templates/extra.qtpl:281 qw422016.N().S(`) `) - //line templates/extra.qtpl:280 + //line templates/extra.qtpl:282 } - //line templates/extra.qtpl:280 + //line templates/extra.qtpl:282 } - //line templates/extra.qtpl:280 + //line templates/extra.qtpl:282 qw422016.N().S(`} var buf easyjson.RawMessage @@ -674,69 +684,69 @@ func UnmarshalMessage(msg *cdp.Message) (interface{}, error) { return v, nil } `) -//line templates/extra.qtpl:301 -} - -//line templates/extra.qtpl:301 -func WriteExtraUtilTemplate(qq422016 qtio422016.Writer, domains []*internal.Domain) { - //line templates/extra.qtpl:301 - qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:301 - StreamExtraUtilTemplate(qw422016, domains) - //line templates/extra.qtpl:301 - qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:301 -} - -//line templates/extra.qtpl:301 -func ExtraUtilTemplate(domains []*internal.Domain) string { - //line templates/extra.qtpl:301 - qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:301 - WriteExtraUtilTemplate(qb422016, domains) - //line templates/extra.qtpl:301 - qs422016 := string(qb422016.B) - //line templates/extra.qtpl:301 - qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:301 - return qs422016 -//line templates/extra.qtpl:301 +//line templates/extra.qtpl:303 } //line templates/extra.qtpl:303 -func StreamExtraMethodTypeDomainDecoder(qw422016 *qt422016.Writer) { +func WriteExtraUtilTemplate(qq422016 qtio422016.Writer, domains []*internal.Domain) { //line templates/extra.qtpl:303 + qw422016 := qt422016.AcquireWriter(qq422016) + //line templates/extra.qtpl:303 + StreamExtraUtilTemplate(qw422016, domains) + //line templates/extra.qtpl:303 + qt422016.ReleaseWriter(qw422016) +//line templates/extra.qtpl:303 +} + +//line templates/extra.qtpl:303 +func ExtraUtilTemplate(domains []*internal.Domain) string { + //line templates/extra.qtpl:303 + qb422016 := qt422016.AcquireByteBuffer() + //line templates/extra.qtpl:303 + WriteExtraUtilTemplate(qb422016, domains) + //line templates/extra.qtpl:303 + qs422016 := string(qb422016.B) + //line templates/extra.qtpl:303 + qt422016.ReleaseByteBuffer(qb422016) + //line templates/extra.qtpl:303 + return qs422016 +//line templates/extra.qtpl:303 +} + +//line templates/extra.qtpl:305 +func StreamExtraMethodTypeDomainDecoder(qw422016 *qt422016.Writer) { + //line templates/extra.qtpl:305 qw422016.N().S(` // Domain returns the Chrome Debugging Protocol domain of the event or command. func (t MethodType) Domain() string { return string(t[:strings.IndexByte(string(t), '.')]) } `) -//line templates/extra.qtpl:308 +//line templates/extra.qtpl:310 } -//line templates/extra.qtpl:308 +//line templates/extra.qtpl:310 func WriteExtraMethodTypeDomainDecoder(qq422016 qtio422016.Writer) { - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 qw422016 := qt422016.AcquireWriter(qq422016) - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 StreamExtraMethodTypeDomainDecoder(qw422016) - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 qt422016.ReleaseWriter(qw422016) -//line templates/extra.qtpl:308 +//line templates/extra.qtpl:310 } -//line templates/extra.qtpl:308 +//line templates/extra.qtpl:310 func ExtraMethodTypeDomainDecoder() string { - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 qb422016 := qt422016.AcquireByteBuffer() - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 WriteExtraMethodTypeDomainDecoder(qb422016) - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 qs422016 := string(qb422016.B) - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 qt422016.ReleaseByteBuffer(qb422016) - //line templates/extra.qtpl:308 + //line templates/extra.qtpl:310 return qs422016 -//line templates/extra.qtpl:308 +//line templates/extra.qtpl:310 } diff --git a/examples/cookie/.gitignore b/examples/cookie/.gitignore index 871bb87..2cb56f0 100644 --- a/examples/cookie/.gitignore +++ b/examples/cookie/.gitignore @@ -1 +1,2 @@ cookie +cookie.exe diff --git a/examples/cookie/main.go b/examples/cookie/main.go index 9db7d84..2572558 100644 --- a/examples/cookie/main.go +++ b/examples/cookie/main.go @@ -8,6 +8,7 @@ import ( "fmt" "log" "net/http" + "time" cdp "github.com/knq/chromedp" cdptypes "github.com/knq/chromedp/cdp" @@ -26,7 +27,7 @@ func main() { // setup http server mux := http.NewServeMux() mux.HandleFunc("/", func(res http.ResponseWriter, req *http.Request) { - buf, err := json.Marshal(req.Cookies()) + buf, err := json.MarshalIndent(req.Cookies(), "", " ") if err != nil { http.Error(res, err.Error(), http.StatusInternalServerError) return @@ -70,7 +71,12 @@ func main() { func setcookies(host string, res *string) cdp.Tasks { return cdp.Tasks{ cdp.ActionFunc(func(ctxt context.Context, h cdptypes.Handler) error { - success, err := network.SetCookie(host, "cookiename", "cookievalue").Do(ctxt, h) + expr := cdptypes.Timestamp(time.Now().Add(180 * 24 * time.Hour)) + success, err := network.SetCookie(host, "cookiename", "cookievalue"). + WithExpirationDate(&expr). + WithDomain("localhost"). + WithHTTPOnly(true). + Do(ctxt, h) if err != nil { return err } @@ -81,6 +87,18 @@ func setcookies(host string, res *string) cdp.Tasks { }), cdp.Navigate(host), cdp.Text(`#result`, res, cdp.ByID, cdp.NodeVisible), + cdp.ActionFunc(func(ctxt context.Context, h cdptypes.Handler) error { + cookies, err := network.GetAllCookies().Do(ctxt, h) + if err != nil { + return err + } + + for i, cookie := range cookies { + log.Printf("cookie %d: %+v", i, cookie) + } + + return nil + }), } } diff --git a/examples/upload/.gitignore b/examples/upload/.gitignore index fb68e0c..a0f3426 100644 --- a/examples/upload/.gitignore +++ b/examples/upload/.gitignore @@ -1 +1,2 @@ upload +upload.exe