Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp

Issue 1366893002: Make window.scroll properties relative to the layout viewport. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: "worked on review comments" Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 // date viewport. 931 // date viewport.
932 if (host->settings().viewportEnabled() && frame->isMainFrame()) 932 if (host->settings().viewportEnabled() && frame->isMainFrame())
933 frame->document()->updateLayoutIgnorePendingStylesheets(); 933 frame->document()->updateLayoutIgnorePendingStylesheets();
934 934
935 // FIXME: This is potentially too much work. We really only need to know the dimensions of the parent frame's layoutObject. 935 // FIXME: This is potentially too much work. We really only need to know the dimensions of the parent frame's layoutObject.
936 if (Frame* parent = frame->tree().parent()) { 936 if (Frame* parent = frame->tree().parent()) {
937 if (parent && parent->isLocalFrame()) 937 if (parent && parent->isLocalFrame())
938 toLocalFrame(parent)->document()->updateLayoutIgnorePendingStyleshee ts(); 938 toLocalFrame(parent)->document()->updateLayoutIgnorePendingStyleshee ts();
939 } 939 }
940 940
941 return frame->isMainFrame() 941 return frame->isMainFrame() && !host->settings().inertVisualViewport()
942 ? host->visualViewport().visibleRect().size() 942 ? host->visualViewport().visibleRect().size()
943 : view->visibleContentRect(IncludeScrollbars).size(); 943 : view->visibleContentRect(IncludeScrollbars).size();
944 } 944 }
945 945
946 int LocalDOMWindow::innerHeight() const 946 int LocalDOMWindow::innerHeight() const
947 { 947 {
948 if (!frame()) 948 if (!frame())
949 return 0; 949 return 0;
950 950
951 FloatSize viewportSize = getViewportSize(frame()); 951 FloatSize viewportSize = getViewportSize(frame());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 FrameView* view = frame()->view(); 997 FrameView* view = frame()->view();
998 if (!view) 998 if (!view)
999 return 0; 999 return 0;
1000 1000
1001 FrameHost* host = frame()->host(); 1001 FrameHost* host = frame()->host();
1002 if (!host) 1002 if (!host)
1003 return 0; 1003 return 0;
1004 1004
1005 frame()->document()->updateLayoutIgnorePendingStylesheets(); 1005 frame()->document()->updateLayoutIgnorePendingStylesheets();
1006 1006
1007 double viewportX = view->scrollableArea()->scrollPositionDouble().x(); 1007 ScrollableArea* viewport = host->settings().inertVisualViewport() ? view->la youtViewportScrollableArea() : view->scrollableArea();
1008 double viewportX = viewport->scrollPositionDouble().x();
1008 return adjustScrollForAbsoluteZoom(viewportX, frame()->pageZoomFactor()); 1009 return adjustScrollForAbsoluteZoom(viewportX, frame()->pageZoomFactor());
1009 } 1010 }
1010 1011
1011 double LocalDOMWindow::scrollY() const 1012 double LocalDOMWindow::scrollY() const
1012 { 1013 {
1013 if (!frame()) 1014 if (!frame())
1014 return 0; 1015 return 0;
1015 1016
1016 FrameView* view = frame()->view(); 1017 FrameView* view = frame()->view();
1017 if (!view) 1018 if (!view)
1018 return 0; 1019 return 0;
1019 1020
1020 FrameHost* host = frame()->host(); 1021 FrameHost* host = frame()->host();
1021 if (!host) 1022 if (!host)
1022 return 0; 1023 return 0;
1023 1024
1024 frame()->document()->updateLayoutIgnorePendingStylesheets(); 1025 frame()->document()->updateLayoutIgnorePendingStylesheets();
1025 1026
1026 double viewportY = view->scrollableArea()->scrollPositionDouble().y(); 1027 ScrollableArea* viewport = host->settings().inertVisualViewport() ? view->la youtViewportScrollableArea() : view->scrollableArea();
1028 double viewportY = viewport->scrollPositionDouble().y();
1027 return adjustScrollForAbsoluteZoom(viewportY, frame()->pageZoomFactor()); 1029 return adjustScrollForAbsoluteZoom(viewportY, frame()->pageZoomFactor());
1028 } 1030 }
1029 1031
1030 const AtomicString& LocalDOMWindow::name() const 1032 const AtomicString& LocalDOMWindow::name() const
1031 { 1033 {
1032 if (!isCurrentlyDisplayedInFrame()) 1034 if (!isCurrentlyDisplayedInFrame())
1033 return nullAtom; 1035 return nullAtom;
1034 1036
1035 return frame()->tree().name(); 1037 return frame()->tree().name();
1036 } 1038 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 { 1126 {
1125 if (!isCurrentlyDisplayedInFrame()) 1127 if (!isCurrentlyDisplayedInFrame())
1126 return; 1128 return;
1127 1129
1128 document()->updateLayoutIgnorePendingStylesheets(); 1130 document()->updateLayoutIgnorePendingStylesheets();
1129 1131
1130 FrameView* view = frame()->view(); 1132 FrameView* view = frame()->view();
1131 if (!view) 1133 if (!view)
1132 return; 1134 return;
1133 1135
1136 FrameHost* host = frame()->host();
1137 if (!host)
1138 return;
1139
1134 x = ScrollableArea::normalizeNonFiniteScroll(x); 1140 x = ScrollableArea::normalizeNonFiniteScroll(x);
1135 y = ScrollableArea::normalizeNonFiniteScroll(y); 1141 y = ScrollableArea::normalizeNonFiniteScroll(y);
1136 1142
1137 DoublePoint currentOffset = view->scrollableArea()->scrollPositionDouble(); 1143 DoublePoint currentOffset = view->scrollableArea()->scrollPositionDouble();
1138 DoubleSize scaledDelta(x * frame()->pageZoomFactor(), y * frame()->pageZoomF actor()); 1144 DoubleSize scaledDelta(x * frame()->pageZoomFactor(), y * frame()->pageZoomF actor());
1139 1145
1140 view->scrollableArea()->setScrollPosition(currentOffset + scaledDelta, Progr ammaticScroll, scrollBehavior); 1146 ScrollableArea* viewport = host->settings().inertVisualViewport() ? view->la youtViewportScrollableArea() : view->scrollableArea();
1147 viewport->setScrollPosition(currentOffset + scaledDelta, ProgrammaticScroll, scrollBehavior);
1141 } 1148 }
1142 1149
1143 void LocalDOMWindow::scrollBy(const ScrollToOptions& scrollToOptions) const 1150 void LocalDOMWindow::scrollBy(const ScrollToOptions& scrollToOptions) const
1144 { 1151 {
1145 double x = 0.0; 1152 double x = 0.0;
1146 double y = 0.0; 1153 double y = 0.0;
1147 if (scrollToOptions.hasLeft()) 1154 if (scrollToOptions.hasLeft())
1148 x = scrollToOptions.left(); 1155 x = scrollToOptions.left();
1149 if (scrollToOptions.hasTop()) 1156 if (scrollToOptions.hasTop())
1150 y = scrollToOptions.top(); 1157 y = scrollToOptions.top();
1151 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; 1158 ScrollBehavior scrollBehavior = ScrollBehaviorAuto;
1152 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB ehavior); 1159 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB ehavior);
1153 scrollBy(x, y, scrollBehavior); 1160 scrollBy(x, y, scrollBehavior);
1154 } 1161 }
1155 1162
1156 void LocalDOMWindow::scrollTo(double x, double y) const 1163 void LocalDOMWindow::scrollTo(double x, double y) const
1157 { 1164 {
1158 if (!isCurrentlyDisplayedInFrame()) 1165 if (!isCurrentlyDisplayedInFrame())
1159 return; 1166 return;
1160 1167
1161 FrameView* view = frame()->view(); 1168 FrameView* view = frame()->view();
1162 if (!view) 1169 if (!view)
1163 return; 1170 return;
1164 1171
1172 FrameHost* host = frame()->host();
1173 if (!host)
1174 return;
1175
1165 x = ScrollableArea::normalizeNonFiniteScroll(x); 1176 x = ScrollableArea::normalizeNonFiniteScroll(x);
1166 y = ScrollableArea::normalizeNonFiniteScroll(y); 1177 y = ScrollableArea::normalizeNonFiniteScroll(y);
1167 1178
1168 // It is only necessary to have an up-to-date layout if the position may be clamped, 1179 // It is only necessary to have an up-to-date layout if the position may be clamped,
1169 // which is never the case for (0, 0). 1180 // which is never the case for (0, 0).
1170 if (x || y) 1181 if (x || y)
1171 document()->updateLayoutIgnorePendingStylesheets(); 1182 document()->updateLayoutIgnorePendingStylesheets();
1172 1183
1173 DoublePoint layoutPos(x * frame()->pageZoomFactor(), y * frame()->pageZoomFa ctor()); 1184 DoublePoint layoutPos(x * frame()->pageZoomFactor(), y * frame()->pageZoomFa ctor());
1174 view->scrollableArea()->setScrollPosition(layoutPos, ProgrammaticScroll, Scr ollBehaviorAuto); 1185 ScrollableArea* viewport = host->settings().inertVisualViewport() ? view->la youtViewportScrollableArea() : view->scrollableArea();
1186 viewport->setScrollPosition(layoutPos, ProgrammaticScroll, ScrollBehaviorAut o);
1175 } 1187 }
1176 1188
1177 void LocalDOMWindow::scrollTo(const ScrollToOptions& scrollToOptions) const 1189 void LocalDOMWindow::scrollTo(const ScrollToOptions& scrollToOptions) const
1178 { 1190 {
1179 if (!isCurrentlyDisplayedInFrame()) 1191 if (!isCurrentlyDisplayedInFrame())
1180 return; 1192 return;
1181 1193
1182 FrameView* view = frame()->view(); 1194 FrameView* view = frame()->view();
1183 if (!view) 1195 if (!view)
1184 return; 1196 return;
1185 1197
1198 FrameHost* host = frame()->host();
1199 if (!host)
1200 return;
1201
1186 // It is only necessary to have an up-to-date layout if the position may be clamped, 1202 // It is only necessary to have an up-to-date layout if the position may be clamped,
1187 // which is never the case for (0, 0). 1203 // which is never the case for (0, 0).
1188 if (!scrollToOptions.hasLeft() 1204 if (!scrollToOptions.hasLeft()
1189 || !scrollToOptions.hasTop() 1205 || !scrollToOptions.hasTop()
1190 || scrollToOptions.left() 1206 || scrollToOptions.left()
1191 || scrollToOptions.top()) { 1207 || scrollToOptions.top()) {
1192 document()->updateLayoutIgnorePendingStylesheets(); 1208 document()->updateLayoutIgnorePendingStylesheets();
1193 } 1209 }
1194 1210
1195 double scaledX = 0.0; 1211 double scaledX = 0.0;
1196 double scaledY = 0.0; 1212 double scaledY = 0.0;
1197 1213
1198 DoublePoint currentOffset = view->scrollableArea()->scrollPositionDouble(); 1214 DoublePoint currentOffset = view->scrollableArea()->scrollPositionDouble();
1199 scaledX = currentOffset.x(); 1215 scaledX = currentOffset.x();
1200 scaledY = currentOffset.y(); 1216 scaledY = currentOffset.y();
1201 1217
1202 if (scrollToOptions.hasLeft()) 1218 if (scrollToOptions.hasLeft())
1203 scaledX = ScrollableArea::normalizeNonFiniteScroll(scrollToOptions.left( )) * frame()->pageZoomFactor(); 1219 scaledX = ScrollableArea::normalizeNonFiniteScroll(scrollToOptions.left( )) * frame()->pageZoomFactor();
1204 1220
1205 if (scrollToOptions.hasTop()) 1221 if (scrollToOptions.hasTop())
1206 scaledY = ScrollableArea::normalizeNonFiniteScroll(scrollToOptions.top() ) * frame()->pageZoomFactor(); 1222 scaledY = ScrollableArea::normalizeNonFiniteScroll(scrollToOptions.top() ) * frame()->pageZoomFactor();
1207 1223
1208 ScrollBehavior scrollBehavior = ScrollBehaviorAuto; 1224 ScrollBehavior scrollBehavior = ScrollBehaviorAuto;
1209 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB ehavior); 1225 ScrollableArea::scrollBehaviorFromString(scrollToOptions.behavior(), scrollB ehavior);
1210 view->scrollableArea()->setScrollPosition(DoublePoint(scaledX, scaledY), Pro grammaticScroll, scrollBehavior); 1226 ScrollableArea* viewport = host->settings().inertVisualViewport() ? view->la youtViewportScrollableArea() : view->scrollableArea();
1227 viewport->setScrollPosition(DoublePoint(scaledX, scaledY), ProgrammaticScrol l, scrollBehavior);
1211 } 1228 }
1212 1229
1213 void LocalDOMWindow::moveBy(int x, int y) const 1230 void LocalDOMWindow::moveBy(int x, int y) const
1214 { 1231 {
1215 if (!frame() || !frame()->isMainFrame()) 1232 if (!frame() || !frame()->isMainFrame())
1216 return; 1233 return;
1217 1234
1218 FrameHost* host = frame()->host(); 1235 FrameHost* host = frame()->host();
1219 if (!host) 1236 if (!host)
1220 return; 1237 return;
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
1509 DOMWindow::trace(visitor); 1526 DOMWindow::trace(visitor);
1510 DOMWindowLifecycleNotifier::trace(visitor); 1527 DOMWindowLifecycleNotifier::trace(visitor);
1511 } 1528 }
1512 1529
1513 LocalFrame* LocalDOMWindow::frame() const 1530 LocalFrame* LocalDOMWindow::frame() const
1514 { 1531 {
1515 return m_frameObserver->frame(); 1532 return m_frameObserver->frame();
1516 } 1533 }
1517 1534
1518 } // namespace blink 1535 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698