OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Simon Hausmann (hausmann@kde.org) | 4 * (C) 2000 Simon Hausmann (hausmann@kde.org) |
5 * (C) 2001 Dirk Mueller (mueller@kde.org) | 5 * (C) 2001 Dirk Mueller (mueller@kde.org) |
6 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed. | 6 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 13 matching lines...) Expand all Loading... | |
24 #include "config.h" | 24 #include "config.h" |
25 #include "core/html/HTMLBodyElement.h" | 25 #include "core/html/HTMLBodyElement.h" |
26 | 26 |
27 #include "bindings/core/v8/ScriptEventListener.h" | 27 #include "bindings/core/v8/ScriptEventListener.h" |
28 #include "core/CSSValueKeywords.h" | 28 #include "core/CSSValueKeywords.h" |
29 #include "core/HTMLNames.h" | 29 #include "core/HTMLNames.h" |
30 #include "core/css/CSSImageValue.h" | 30 #include "core/css/CSSImageValue.h" |
31 #include "core/css/StylePropertySet.h" | 31 #include "core/css/StylePropertySet.h" |
32 #include "core/css/parser/CSSParser.h" | 32 #include "core/css/parser/CSSParser.h" |
33 #include "core/dom/Attribute.h" | 33 #include "core/dom/Attribute.h" |
34 #include "core/frame/FrameView.h" | |
35 #include "core/frame/LocalFrame.h" | |
36 #include "core/frame/ScrollToOptions.h" | |
37 #include "core/frame/UseCounter.h" | 34 #include "core/frame/UseCounter.h" |
38 #include "core/html/HTMLFrameElementBase.h" | 35 #include "core/html/HTMLFrameElementBase.h" |
39 #include "core/html/parser/HTMLParserIdioms.h" | 36 #include "core/html/parser/HTMLParserIdioms.h" |
40 #include "core/layout/LayoutBox.h" | |
41 | 37 |
42 namespace blink { | 38 namespace blink { |
43 | 39 |
44 using namespace HTMLNames; | 40 using namespace HTMLNames; |
45 | 41 |
46 inline HTMLBodyElement::HTMLBodyElement(Document& document) | 42 inline HTMLBodyElement::HTMLBodyElement(Document& document) |
47 : HTMLElement(bodyTag, document) | 43 : HTMLElement(bodyTag, document) |
48 { | 44 { |
49 } | 45 } |
50 | 46 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
189 return backgroundAttr; | 185 return backgroundAttr; |
190 } | 186 } |
191 | 187 |
192 bool HTMLBodyElement::supportsFocus() const | 188 bool HTMLBodyElement::supportsFocus() const |
193 { | 189 { |
194 // This override is needed because the inherited method bails if the parent is editable. | 190 // This override is needed because the inherited method bails if the parent is editable. |
195 // The <body> should be focusable even if <html> is editable. | 191 // The <body> should be focusable even if <html> is editable. |
196 return hasEditableStyle() || HTMLElement::supportsFocus(); | 192 return hasEditableStyle() || HTMLElement::supportsFocus(); |
197 } | 193 } |
198 | 194 |
199 static int adjustForZoom(int value, Document* document) | |
200 { | |
201 LocalFrame* frame = document->frame(); | |
202 float zoomFactor = frame->pageZoomFactor(); | |
203 if (zoomFactor == 1) | |
204 return value; | |
205 // Needed because of truncation (rather than rounding) when scaling up. | |
206 if (zoomFactor > 1) | |
207 value++; | |
208 return static_cast<int>(value / zoomFactor); | |
209 } | |
210 | |
211 // Blink, Gecko and Presto's quirks mode implementations of overflow set to the | |
212 // body element differ from IE's: the formers can create a scrollable area for t he | |
213 // body element that is not the same as the root elements's one. On IE's quirks mode | |
214 // though, as body is the root element, body's and the root element's scrollable areas, | |
215 // if any, are the same. | |
216 // In order words, a <body> will only have an overflow clip (that differs from | |
217 // documentElement's) if both html and body nodes have its overflow set to eith er hidden, | |
218 // auto or scroll. | |
219 // That said, Blink's {set}scroll{Top,Left} behaviors match Gecko's: even if the re is a non-overflown | |
220 // scrollable area, scrolling should not get propagated to the viewport in neith er strict | |
221 // or quirks modes. | |
222 double HTMLBodyElement::scrollLeft() | |
223 { | |
224 Document& document = this->document(); | |
225 document.updateLayoutIgnorePendingStylesheets(); | |
226 | |
227 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
228 LayoutBox* render = layoutBox(); | |
229 if (!render) | |
230 return 0; | |
231 if (render->hasOverflowClip()) | |
232 return adjustScrollForAbsoluteZoom(render->scrollLeft(), *render); | |
233 if (!document.inQuirksMode()) | |
234 return 0; | |
235 } | |
236 | |
237 if (LocalDOMWindow* window = document.domWindow()) | |
238 return window->scrollX(); | |
239 return 0; | |
240 } | |
241 | |
242 void HTMLBodyElement::setScrollLeft(double scrollLeft) | |
243 { | |
244 Document& document = this->document(); | |
245 document.updateLayoutIgnorePendingStylesheets(); | |
246 | |
247 if (std::isnan(scrollLeft)) | |
248 return; | |
249 | |
250 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
251 LayoutBox* render = layoutBox(); | |
252 if (!render) | |
253 return; | |
254 if (render->hasOverflowClip()) { | |
255 // FIXME: Investigate how are other browsers casting to int (roundin g, ceiling, ...). | |
tdresser
2015/04/13 13:45:30
Is our behavior here correct at this point?
Rick Byers
2015/04/13 20:08:31
I removed the special casing of body in this regar
| |
256 render->setScrollLeft(static_cast<int>(scrollLeft * render->style()- >effectiveZoom())); | |
257 return; | |
258 } | |
259 if (!document.inQuirksMode()) | |
260 return; | |
261 } | |
262 | |
263 if (LocalDOMWindow* window = document.domWindow()) | |
264 window->scrollTo(scrollLeft, window->scrollY()); | |
265 } | |
266 | |
267 double HTMLBodyElement::scrollTop() | |
268 { | |
269 Document& document = this->document(); | |
270 document.updateLayoutIgnorePendingStylesheets(); | |
271 | |
272 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
273 LayoutBox* render = layoutBox(); | |
274 if (!render) | |
275 return 0; | |
276 if (render->hasOverflowClip()) | |
277 return adjustLayoutUnitForAbsoluteZoom(render->scrollTop(), *render) ; | |
278 if (!document.inQuirksMode()) | |
279 return 0; | |
280 } | |
281 | |
282 if (LocalDOMWindow* window = document.domWindow()) | |
283 return window->scrollY(); | |
284 return 0; | |
285 } | |
286 | |
287 void HTMLBodyElement::setScrollTop(double scrollTop) | |
288 { | |
289 Document& document = this->document(); | |
290 document.updateLayoutIgnorePendingStylesheets(); | |
291 | |
292 if (std::isnan(scrollTop)) | |
293 return; | |
294 | |
295 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
296 LayoutBox* render = layoutBox(); | |
297 if (!render) | |
298 return; | |
299 if (render->hasOverflowClip()) { | |
300 // FIXME: Investigate how are other browsers casting to int (roundin g, ceiling, ...). | |
301 render->setScrollTop(static_cast<int>(scrollTop * render->style()->e ffectiveZoom())); | |
302 return; | |
303 } | |
304 if (!document.inQuirksMode()) | |
305 return; | |
306 } | |
307 | |
308 if (LocalDOMWindow* window = document.domWindow()) | |
309 window->scrollTo(window->scrollX(), scrollTop); | |
310 } | |
311 | |
312 int HTMLBodyElement::scrollHeight() | |
313 { | |
314 // Update the document's layout. | |
315 Document& document = this->document(); | |
316 document.updateLayoutIgnorePendingStylesheets(); | |
317 FrameView* view = document.view(); | |
318 return view ? adjustForZoom(view->contentsHeight(), &document) : 0; | |
319 } | |
320 | |
321 int HTMLBodyElement::scrollWidth() | |
322 { | |
323 // Update the document's layout. | |
324 Document& document = this->document(); | |
325 document.updateLayoutIgnorePendingStylesheets(); | |
326 FrameView* view = document.view(); | |
327 return view ? adjustForZoom(view->contentsWidth(), &document) : 0; | |
328 } | |
329 | |
330 void HTMLBodyElement::scrollBy(const ScrollToOptions& scrollToOptions) | |
331 { | |
332 Document& document = this->document(); | |
333 | |
334 // FIXME: This should be removed once scroll updates are processed only afte r | |
335 // the compositing update. See http://crbug.com/420741. | |
336 document.updateLayoutIgnorePendingStylesheets(); | |
337 | |
338 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
339 LayoutBox* render = layoutBox(); | |
340 if (!render) | |
341 return; | |
342 if (render->hasOverflowClip()) { | |
343 scrollLayoutBoxBy(scrollToOptions); | |
344 return; | |
345 } | |
346 if (!document.inQuirksMode()) | |
347 return; | |
348 } | |
349 | |
350 scrollFrameBy(scrollToOptions); | |
351 } | |
352 | |
353 void HTMLBodyElement::scrollTo(const ScrollToOptions& scrollToOptions) | |
354 { | |
355 Document& document = this->document(); | |
356 | |
357 // FIXME: This should be removed once scroll updates are processed only afte r | |
358 // the compositing update. See http://crbug.com/420741. | |
359 document.updateLayoutIgnorePendingStylesheets(); | |
360 | |
361 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | |
362 LayoutBox* render = layoutBox(); | |
363 if (!render) | |
364 return; | |
365 if (render->hasOverflowClip()) { | |
366 scrollLayoutBoxTo(scrollToOptions); | |
367 return; | |
368 } | |
369 if (!document.inQuirksMode()) | |
370 return; | |
371 } | |
372 | |
373 scrollFrameTo(scrollToOptions); | |
374 } | |
375 | |
376 } // namespace blink | 195 } // namespace blink |
OLD | NEW |