Start work on implementing scrollIntoView for Safari

This commit is contained in:
Kovid Goyal 2017-05-27 23:30:45 +05:30
parent 3a270f77c5
commit 6f384dd00a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 33 additions and 3 deletions

View File

@ -448,7 +448,7 @@ def scroll_to(cfi, callback, doc): # {{{
span = ndoc.createElement('span')
span.setAttribute('style', 'border-width: 0; padding: 0; margin: 0')
r.surroundContents(span)
span.scrollIntoView()
scroll_viewport.scroll_into_view(span)
fn = def():
# Remove the span and get the new position now that scrolling
# has (hopefully) completed
@ -482,7 +482,7 @@ def scroll_to(cfi, callback, doc): # {{{
callback(x, y)
else:
node = point_.node
node.scrollIntoView()
scroll_viewport.scroll_into_view(node)
fn = def():
r = node.getBoundingClientRect()

View File

@ -50,12 +50,20 @@ def flow_viewport_y():
def flow_viewport_scroll_to(x, y):
window.scrollTo(x, y)
def flow_viewport_scroll_into_view(elem):
elem.scrollIntoView()
def flow_reset_globals():
pass
def paged_viewport_y():
return 0
scroll_viewport.x = flow_viewport_x
scroll_viewport.y = flow_viewport_y
scroll_viewport.scroll_to = flow_viewport_scroll_to
scroll_viewport.scroll_into_view = flow_viewport_scroll_into_view
scroll_viewport.reset_globals = flow_reset_globals
if is_ios:
window_width = def ():
@ -80,6 +88,20 @@ if is_ios:
if isNaN(ans):
return 0
return ans
paged_viewport_scroll_into_view = def(elem):
left = elem.offsetLeft
if left is None:
return # element has display: none
elem.scrollIntoView()
window.scrollTo(0, 0)
p = elem.offsetParent
while p:
left += p.offsetLeft
p = p.offsetParent
# left -= window_width() // 2
paged_viewport_scroll_to(max(0, left), 0)
paged_reset_globals = def():
document.documentElement.style.transform = 'none'
else:
window_width = def():
@ -88,6 +110,8 @@ else:
return window.innerHeight
paged_viewport_scroll_to = flow_viewport_scroll_to
paged_viewport_x = flow_viewport_x
paged_viewport_scroll_into_view = flow_viewport_scroll_into_view
paged_reset_globals = flow_reset_globals
scroll_viewport.width = window_width
scroll_viewport.height = window_height
@ -103,10 +127,14 @@ def set_layout_mode(val):
scroll_viewport.x = flow_viewport_x
scroll_viewport.y = flow_viewport_y
scroll_viewport.scroll_to = flow_viewport_scroll_to
scroll_viewport.scroll_into_view = flow_viewport_scroll_into_view
scroll_viewport.reset_globals = flow_reset_globals
else:
scroll_viewport.x = paged_viewport_x
scroll_viewport.y = paged_viewport_y
scroll_viewport.scroll_to = paged_viewport_scroll_to
scroll_viewport.scroll_into_view = paged_viewport_scroll_into_view
scroll_viewport.reset_globals = paged_reset_globals
def current_spine_item():
return current_spine_item.value

View File

@ -54,6 +54,7 @@ is_full_screen_layout = False
def reset_paged_mode_globals():
nonlocal _in_paged_mode, col_width, col_and_gap, screen_height, gap, screen_width, is_full_screen_layout, cols_per_screen
scroll_viewport.reset_globals()
col_width = screen_width = screen_height = cols_per_screen = gap = col_and_gap = 0
is_full_screen_layout = _in_paged_mode = False
@ -339,7 +340,8 @@ def jump_to_anchor(name):
scroll_to_elem(elem)
def scroll_to_elem(elem):
elem.scrollIntoView()
scroll_viewport.scroll_into_view(elem)
if in_paged_mode:
# Ensure we are scrolled to the column containing elem