[Bug]: UI shifts when displayed in an Iframe in Wekbit on iOS #16945
-
Checklist
Describe the problem you are havingWhen the Frigate UI is displayed in an Iframe, tapping any of the videos in the review page that are 30 min or older will result in the UI shifting (animating) up. Doing anything that causes the iframe's containing element to redraw will result in the Frigate UI reverting to the correct place. I think this is an issue with either Safari or with how smooth scrolling is implemented in the npm package scroll-into-view-if-needed. This is reproducible in Frigate Proxy, using the Hass Ingress integration, or even by just creating a simple html page with nothing but a full-screen iframe pointing at a Frigate instance, and opening it on an iPhone. I can reproduce this only on an iPhone in a webview, Safari, or Chrome (which all use webkit). I cannot reproduce this on a desktop browser. This is the same issue mentioned in the Home Assistant issues here: blakeblackshear/frigate-hass-addons#198 and in the Frigate HASS Addons issues here: blakeblackshear/frigate-hass-addons#198. If I change the scrolling behavior from "smooth" to "auto" everywhere the scroll-into-view-if-needed package is used, then I no longer see this issue (but you do lose the scrolling animation when the timeline loads an older clip, and probably a few other animations). I forked the repo and tried it here: https://github.com/jploo/frigate/tree/smooth-scroll-setting. I don't know if this is the correct approach, and I am not at all familiar with this codebase so this probably isn't merge-ready, but maybe somebody can make something of it or guide me in the right direction. I am guessing bloating the config with a setting for this is not the move. ![]() (image is from the linked issues, it's exactly what I see on my phone) Steps to reproduce
Version0.15.0-cea210d In which browser(s) are you experiencing the issue with?Safari 18.3 on iOS 18.3 Frigate config filemqtt:
enabled: true
host: 192.168.2.98
detectors:
coral:
type: edgetpu
device: usb
model:
path: plus://410c1fe31620dd541b82e5cd2b8fd6dd
objects:
# Optional: list of objects to track from labelmap.txt
track:
- person
- face
- car
- license_plate
- dog
- amazon
- usps
- ups
- fedex
- package
- waste_bin
filters:
dog:
min_score: .7
threshold: .9
face:
min_score: .7
package:
min_score: .65
threshold: .9
license_plate:
min_score: .6
amazon:
min_score: .75
ups:
min_score: .75
fedex:
min_score: .75
person:
min_score: .65
threshold: .85
car:
min_score: .65
threshold: .85
# can be overridden at the camera level
review:
alerts:
labels:
- car
- dog
- person
- package
snapshots:
enabled: true
semantic_search:
enabled: true
genai:
enabled: true
provider: gemini
api_key: [redacted]
model: gemini-1.5-pro
tls:
enabled: false
birdseye:
enabled: true
mode: objects
record:
enabled: true
retain:
days: 3
mode: all
alerts:
retain:
days: 30
mode: motion
detections:
retain:
days: 30
mode: motion
go2rtc:
streams:
entry_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.110:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:entry_camera#audio=opus"
entry_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.110:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:entry_camera_sub#audio=opus"
driveway_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.113:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:driveway_camera#audio=opus"
driveway_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.113:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:driveway_camera_sub#audio=opus"
porch_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.2.107:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:porch_camera#audio=opus"
porch_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.2.107:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:porch_camera_sub#audio=opus"
deck_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.114:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:deck_camera#audio=opus"
deck_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.114:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:deck_camera_sub#audio=opus"
garage_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.101:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:garage_camera#audio=opus"
garage_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.101:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:garage_camera_sub#audio=opus"
garage_rear_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.104:554/media/video1
#- "ffmpeg:garage_rear_camera#audio=opus"
garage_rear_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.104:554/media/video2
#- "ffmpeg:garage_rear_camera_sub#audio=opus"
patio_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.105:554/media/video1
#- "ffmpeg:patio_camera#audio=opus"
patio_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.105:554/media/video2
#- "ffmpeg:patio_camera_sub#audio=opus"
backyard_left_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.111:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:backyard_left_camera#audio=opus"
backyard_left_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.111:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:backyard_left_camera_sub#audio=opus"
backyard_right_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.112:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
#- "ffmpeg:backyard_right_camera#audio=opus"
backyard_right_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.112:554/cam/realmonitor?channel=1&subtype=1&unicast=true&proto=Onvif
#- "ffmpeg:backyard_right_camera_sub#audio=opus"
frontyard_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.107:554/video1
#- "ffmpeg:frontyard_camera#audio=opus"
frontyard_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.107:554/video2
#- "ffmpeg:frontyard_camera_sub#audio=opus"
foyer_camera:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.102:554/live.sdp
#- "ffmpeg:foyer_camera#audio=opus"
foyer_camera_sub:
- rtsp://admin:{FRIGATE_RTSP_PASSWORD}@192.168.5.102:554/live2.sdp
#- "ffmpeg:foyer_camera_sub#audio=opus"
cameras:
entry_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h265
inputs:
- path: rtsp://127.0.0.1:8554/entry_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/entry_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
annotation_offset: -1000
motion: {}
zones:
front_door:
coordinates: 0.865,0,0.717,0.528,0.411,0.411,0.219,0.872,0.368,1,1,1,1,0
inertia: 3
loitering_time: 0
objects:
- dog
- person
- package
driveway:
coordinates: 0.598,0.4,0.637,0,0.271,0,0.109,0.055,0,0.216,0.314,0.268,0.347,0.321
inertia: 3
loitering_time: 0
review:
detections:
required_zones:
- front_door
- driveway
alerts:
required_zones: front_door
genai:
enabled: true
required_zones:
- front_door
snapshots:
required_zones:
- driveway
- front_door
objects: {}
driveway_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/driveway_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/driveway_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
annotation_offset: -1600
motion:
mask: 0.66,0,0.661,0.081,1,0.082,1,0
zones:
front_door:
coordinates: 0.048,0.548,0.14,0.504,0.113,0.225,0.019,0.257
inertia: 3
loitering_time: 0
objects:
- dog
- person
frontyard:
coordinates: 0.217,0.172,0.353,0.158,0.484,0.162,0.579,0.191,0.659,0.223,0.404,0.318
inertia: 3
loitering_time: 0
objects:
- person
- dog
driveway:
coordinates:
0.082,0.564,0.135,1,0.899,1,0.902,0.619,0.859,0.455,0.764,0.385,0.642,0.296,0.419,0.416
inertia: 3
loitering_time: 0
street:
coordinates:
0.215,0.055,0.216,0.093,0.327,0.101,0.431,0.114,0.503,0.128,0.578,0.151,0.676,0.185,0.792,0.249,0.908,0.312,1,0.351,1,0.298,0.906,0.234,0.806,0.176,0.687,0.128,0.621,0.105,0.596,0.095,0.628,0.086,0.632,0.065,0.512,0.076,0.462,0.067,0.349,0.057
loitering_time: 0
review:
detections:
required_zones:
- front_door
- driveway
alerts:
required_zones: driveway
genai:
enabled: true
required_zones:
- driveway
snapshots:
required_zones:
- driveway
- front_door
- frontyard
objects:
filters:
person:
mask: 0.328,0.097,0.374,0.1,0.371,0.131,0.326,0.131
porch_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/porch_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/porch_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
annotation_offset: -1770
motion:
mask: 0.569,0,0.569,0.078,0.84,0.206,1,0.145,1,0
zones:
porch:
coordinates: 1,1,0,1,0,0.085,0.557,0.089,1,0.28
inertia: 3
loitering_time: 0
objects:
- person
- dog
objects:
mask: 0.637,0.649,0.871,0.798,0.935,0.617,0.717,0.436
review:
alerts:
required_zones: porch
labels: []
detections:
required_zones: porch
genai:
enabled: false
snapshots:
required_zones:
- porch
deck_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/deck_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/deck_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
zones:
deck:
coordinates: 0.31,0.039,0.207,0.225,0.371,1,0.663,1,0.758,0.876,0.704,0.071
inertia: 3
loitering_time: 0
objects:
- dog
- person
motion:
mask: 0.661,0.088,1,0.093,1,0,0.66,0
review:
alerts:
required_zones: deck
genai:
enabled: false
garage_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/garage_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/garage_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
width: 856
height: 480
annotation_offset: -2550
zones:
garage_left:
coordinates: 1,0.596,1,1,0.75,1,0.532,0.537,0.83,0.446
inertia: 3
loitering_time: 0
garage_right:
coordinates: 0.181,0.603,0.156,1,0.75,1,0.533,0.538
inertia: 3
loitering_time: 0
garage:
coordinates: 0.172,0.299,0.243,0.291,0.247,0.411,0.663,0.352,0.663,0.245,1,0.529,1,1,0,1
loitering_time: 0
inertia: 3
review:
alerts:
required_zones:
- garage_left
- garage_right
- garage
detections:
required_zones: garage
motion:
threshold: 40
contour_area: 20
improve_contrast: true
genai:
enabled: false
garage_rear_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/garage_rear_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/garage_rear_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
width: 984
height: 576
motion:
mask:
- 0.727,0.584,0.798,0.261,0.822,0,1,0,1,0.433,0.978,0.614
- 0.125,0,0.017,0.095,0.028,0.226,0.252,0.118,0.552,0.063,0.817,0.068,0.822,0
zones:
backyard:
coordinates: 0,0.24,0.005,1,1,1,1,0.088,0.424,0.097
inertia: 3
loitering_time: 0
objects:
- dog
- person
review:
alerts:
required_zones: backyard
detections:
required_zones: backyard
genai:
enabled: false
patio_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/patio_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/patio_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
annotation_offset: -2000
motion:
mask: 0.101,0.136,0.607,0.114,1,0.159,1,0,0.167,0
zones:
backyard:
coordinates: 0.064,0.233,0.095,0.159,0.597,0.127,1,0.169,1,0.373,0.514,0.348,0.161,0.425
inertia: 3
loitering_time: 0
objects:
- dog
- person
patio:
coordinates: 0,1,0,0.542,0.507,0.357,1,0.37,1,1
inertia: 3
loitering_time: 0
objects:
- dog
- person
review:
detections:
required_zones:
- backyard
- patio
alerts:
required_zones: patio
objects:
filters:
dog: {}
person: {}
mask: 0.1,0.135,0.615,0.102,1,0.134,1,0,0.167,0
snapshots:
required_zones:
- patio
- backyard
genai:
enabled: false
backyard_left_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h265
inputs:
- path: rtsp://127.0.0.1:8554/backyard_left_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/backyard_left_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
motion:
mask: 0,0.237,0.541,0.202,1,0.257,1,0,0,0
threshold: 15
contour_area: 20
improve_contrast: true
zones:
backyard:
coordinates: 0,0.261,0.525,0.226,1,0.28,1,1,0,1
inertia: 3
loitering_time: 0
objects:
- dog
- person
review:
alerts:
required_zones: backyard
detections:
required_zones: backyard
snapshots:
required_zones:
- backyard
genai:
enabled: false
objects:
mask: 0,0.237,0.538,0.202,1,0.257,1,0,0,0
backyard_right_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h265
inputs:
- path: rtsp://127.0.0.1:8554/backyard_right_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/backyard_right_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
motion:
mask: 0,0.323,0.563,0.284,0.876,0.323,1,0.354,1,0,0,0
threshold: 20
contour_area: 10
improve_contrast: true
zones:
backyard:
coordinates: 0,0.401,0.103,0.342,0.552,0.311,1,0.389,1,1,0,1
inertia: 3
loitering_time: 0
objects:
- person
- dog
review:
alerts:
required_zones: backyard
detections:
required_zones: backyard
objects:
mask: 0,0.321,0.562,0.282,1,0.349,1,0,0,0
snapshots:
required_zones:
- backyard
genai:
enabled: false
frontyard_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/frontyard_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/frontyard_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
width: 984
height: 576
zones:
frontyard:
coordinates: 0.001,0.692,0.358,0.484,0.974,0.693,0.993,1,0.043,1,0.005,0.832
inertia: 3
loitering_time: 0
objects:
- dog
- person
street:
coordinates:
0,0.591,0.276,0.463,0.342,0.442,0.527,0.501,0.751,0.563,0.992,0.633,0.989,0.473,0.632,0.39,0.601,0.361,0.618,0.338,0.813,0.27,0.793,0.265,0.461,0.334,0.411,0.346,0.19,0.312,0.03,0.286,0.03,0.319,0.157,0.39,0.158,0.432,0,0.516
loitering_time: 0
inertia: 3
motion:
mask: 0.475,0.188,1,0.267,1,0,0,0,0,0.257
review:
alerts:
required_zones: frontyard
detections:
required_zones: frontyard
snapshots:
required_zones:
- frontyard
genai:
enabled: false
objects:
mask: 0,0.258,0.474,0.189,1,0.266,1,0,0,0
foyer_camera:
enabled: true
ffmpeg:
hwaccel_args: preset-intel-qsv-h264
inputs:
- path: rtsp://127.0.0.1:8554/foyer_camera_sub
input_args: preset-rtsp-restream
roles:
- detect
- path: rtsp://127.0.0.1:8554/foyer_camera
input_args: preset-rtsp-restream
roles:
- record
detect:
enabled: true
annotation_offset: -2300
review:
alerts:
labels: []
required_zones: foyer
detections:
required_zones: foyer
genai:
enabled: false
motion:
threshold: 55
contour_area: 20
improve_contrast: true
zones:
foyer:
coordinates: 0.304,0.39,0.661,0.236,0.847,0.678,0.82,0.804,0.911,0.83,0.879,1,0.333,1
loitering_time: 0
objects:
- person
- package
- dog
version: 0.15-1
camera_groups:
Backyard:
order: 1
icon: LuTrees
cameras:
- deck_camera
- garage_rear_camera
- patio_camera
- backyard_left_camera
- backyard_right_camera
Birdseye:
order: 2
icon: LuGrid
cameras: birdseye docker-compose file or Docker CLI commandversion: "3.9"
services:
frigate:
container_name: frigate
privileged: true # this may not be necessary for all setups
restart: unless-stopped
stop_grace_period: 30s # allow enough time to shut down the various services
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "1024mb" # update for your cameras based on calculation above
devices:
- /dev/bus/usb:/dev/bus/usb # Passes the USB Coral, needs to be modified for other versions
- /dev/dri/renderD128:/dev/dri/renderD128 # For intel hwaccel, needs to be updated for your hardware
volumes:
- /etc/localtime:/etc/localtime:ro
- /container/frigate/config:/config
- /container/frigate/storage:/media/frigate
- type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "8971:8971"
- "5000:5000" # Internal unauthenticated access. Expose carefully.
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
environment:
FRIGATE_RTSP_PASSWORD: [REDACTED]
PLUS_API_KEY: [REDACTED] Relevant Frigate log outputnot relevant Relevant go2rtc log outputnot relevant Operating systemDebian Install methodDocker Compose Network connectionWired Camera make and modelAmcrest IP8M-T2599EW, and others Screenshots of the Frigate UI's System metrics pagesnot relevant Any other information that may be helpfulNo response |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 6 replies
-
Thanks, this is a duplicate of #13199 As you indicated, it's something buggy with iOS Webkit, and doesn't manifest anywhere else or on any other platform than in an iframe on iOS. Most users have just had the issue when using the HA proxy. We'll have to see but it's probably possible to detect this and set the scrolling to |
Beta Was this translation helpful? Give feedback.
So I'm actually unable to reproduce this in the
dev
branch, though I can reproduce it every time withmaster
(0.15). I completely revamped the timeline code in dev a few weeks ago (#16429). I know you made your fork and changes todev
, but can you confirm the issue still occurs for you indev
?