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 18 matching lines...) Expand all Loading... |
29 #include "bindings/v8/ScriptEventListener.h" | 29 #include "bindings/v8/ScriptEventListener.h" |
30 #include "core/css/CSSImageValue.h" | 30 #include "core/css/CSSImageValue.h" |
31 #include "core/css/parser/BisonCSSParser.h" | 31 #include "core/css/parser/BisonCSSParser.h" |
32 #include "core/css/StylePropertySet.h" | 32 #include "core/css/StylePropertySet.h" |
33 #include "core/dom/Attribute.h" | 33 #include "core/dom/Attribute.h" |
34 #include "core/events/ThreadLocalEventNames.h" | 34 #include "core/events/ThreadLocalEventNames.h" |
35 #include "core/html/HTMLFrameElementBase.h" | 35 #include "core/html/HTMLFrameElementBase.h" |
36 #include "core/html/parser/HTMLParserIdioms.h" | 36 #include "core/html/parser/HTMLParserIdioms.h" |
37 #include "core/frame/Frame.h" | 37 #include "core/frame/Frame.h" |
38 #include "core/frame/FrameView.h" | 38 #include "core/frame/FrameView.h" |
| 39 #include "core/rendering/RenderBox.h" |
39 | 40 |
40 namespace WebCore { | 41 namespace WebCore { |
41 | 42 |
42 using namespace HTMLNames; | 43 using namespace HTMLNames; |
43 | 44 |
44 HTMLBodyElement::HTMLBodyElement(Document& document) | 45 HTMLBodyElement::HTMLBodyElement(Document& document) |
45 : HTMLElement(bodyTag, document) | 46 : HTMLElement(bodyTag, document) |
46 { | 47 { |
47 ScriptWrappable::init(this); | 48 ScriptWrappable::init(this); |
48 } | 49 } |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 Frame* frame = document->frame(); | 191 Frame* frame = document->frame(); |
191 float zoomFactor = frame->pageZoomFactor(); | 192 float zoomFactor = frame->pageZoomFactor(); |
192 if (zoomFactor == 1) | 193 if (zoomFactor == 1) |
193 return value; | 194 return value; |
194 // Needed because of truncation (rather than rounding) when scaling up. | 195 // Needed because of truncation (rather than rounding) when scaling up. |
195 if (zoomFactor > 1) | 196 if (zoomFactor > 1) |
196 value++; | 197 value++; |
197 return static_cast<int>(value / zoomFactor); | 198 return static_cast<int>(value / zoomFactor); |
198 } | 199 } |
199 | 200 |
200 // FIXME: There are cases where body.scrollLeft is allowed to return | 201 // Blink, Gecko and Presto's quirks mode implementations of overflow set to the |
201 // non-zero values in both quirks and strict mode. It happens when | 202 // body element differ from IE's: the formers can create a scrollable area for t
he |
202 // <body> has an overflow that is not the Frame overflow. | 203 // body element that is not the same as the root elements's one. On IE's quirks
mode |
203 // http://dev.w3.org/csswg/cssom-view/#dom-element-scrollleft | 204 // though, as body is the root element, body's and the root element's scrollable
areas, |
204 // http://code.google.com/p/chromium/issues/detail?id=312435 | 205 // if any, are the same. |
| 206 // In order words, a <body> will only have an overflow clip (that differs from |
| 207 // documentElement's) if both html and body nodes have its overflow set to eith
er hidden, |
| 208 // auto or scroll. |
| 209 // That said, Blink's {set}scroll{Top,Left} behaviors match Gecko's: even if the
re is a non-overflown |
| 210 // scrollable area, scrolling should not get propagated to the viewport in neith
er strict |
| 211 // or quirks modes. |
205 int HTMLBodyElement::scrollLeft() | 212 int HTMLBodyElement::scrollLeft() |
206 { | 213 { |
207 Document& document = this->document(); | 214 Document& document = this->document(); |
208 document.updateLayoutIgnorePendingStylesheets(); | 215 document.updateLayoutIgnorePendingStylesheets(); |
209 | 216 |
210 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 217 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 218 RenderBox* render = renderBox(); |
| 219 if (!render) |
| 220 return 0; |
| 221 if (render->hasOverflowClip()) |
| 222 return adjustForAbsoluteZoom(render->scrollLeft(), render); |
211 if (!document.inQuirksMode()) | 223 if (!document.inQuirksMode()) |
212 return 0; | 224 return 0; |
213 } | 225 } |
214 | 226 |
215 FrameView* view = document.view(); | 227 FrameView* view = document.view(); |
216 return view ? adjustForZoom(view->scrollX(), &document) : 0; | 228 return view ? adjustForZoom(view->scrollX(), &document) : 0; |
217 } | 229 } |
218 | 230 |
219 void HTMLBodyElement::setScrollLeft(int scrollLeft) | 231 void HTMLBodyElement::setScrollLeft(int scrollLeft) |
220 { | 232 { |
221 Document& document = this->document(); | 233 Document& document = this->document(); |
222 document.updateLayoutIgnorePendingStylesheets(); | 234 document.updateLayoutIgnorePendingStylesheets(); |
223 | 235 |
224 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 236 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 237 RenderBox* render = renderBox(); |
| 238 if (!render) |
| 239 return; |
| 240 if (render->hasOverflowClip()) { |
| 241 // FIXME: Investigate how are other browsers casting to int (roundin
g, ceiling, ...). |
| 242 render->setScrollLeft(static_cast<int>(scrollLeft * render->style()-
>effectiveZoom())); |
| 243 return; |
| 244 } |
225 if (!document.inQuirksMode()) | 245 if (!document.inQuirksMode()) |
226 return; | 246 return; |
227 } | 247 } |
228 | 248 |
229 Frame* frame = document.frame(); | 249 Frame* frame = document.frame(); |
230 if (!frame) | 250 if (!frame) |
231 return; | 251 return; |
232 FrameView* view = frame->view(); | 252 FrameView* view = frame->view(); |
233 if (!view) | 253 if (!view) |
234 return; | 254 return; |
235 view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZo
omFactor()), view->scrollY())); | 255 view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZo
omFactor()), view->scrollY())); |
236 } | 256 } |
237 | 257 |
238 int HTMLBodyElement::scrollTop() | 258 int HTMLBodyElement::scrollTop() |
239 { | 259 { |
240 Document& document = this->document(); | 260 Document& document = this->document(); |
241 document.updateLayoutIgnorePendingStylesheets(); | 261 document.updateLayoutIgnorePendingStylesheets(); |
242 | 262 |
243 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 263 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 264 RenderBox* render = renderBox(); |
| 265 if (!render) |
| 266 return 0; |
| 267 if (render->hasOverflowClip()) |
| 268 return adjustForAbsoluteZoom(render->scrollTop(), render); |
244 if (!document.inQuirksMode()) | 269 if (!document.inQuirksMode()) |
245 return 0; | 270 return 0; |
246 } | 271 } |
247 | 272 |
248 FrameView* view = document.view(); | 273 FrameView* view = document.view(); |
249 return view ? adjustForZoom(view->scrollY(), &document) : 0; | 274 return view ? adjustForZoom(view->scrollY(), &document) : 0; |
250 } | 275 } |
251 | 276 |
252 void HTMLBodyElement::setScrollTop(int scrollTop) | 277 void HTMLBodyElement::setScrollTop(int scrollTop) |
253 { | 278 { |
254 Document& document = this->document(); | 279 Document& document = this->document(); |
255 document.updateLayoutIgnorePendingStylesheets(); | 280 document.updateLayoutIgnorePendingStylesheets(); |
256 | 281 |
257 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { | 282 if (RuntimeEnabledFeatures::scrollTopLeftInteropEnabled()) { |
| 283 RenderBox* render = renderBox(); |
| 284 if (!render) |
| 285 return; |
| 286 if (render->hasOverflowClip()) { |
| 287 // FIXME: Investigate how are other browsers casting to int (roundin
g, ceiling, ...). |
| 288 render->setScrollTop(static_cast<int>(scrollTop * render->style()->e
ffectiveZoom())); |
| 289 return; |
| 290 } |
258 if (!document.inQuirksMode()) | 291 if (!document.inQuirksMode()) |
259 return; | 292 return; |
260 } | 293 } |
261 | 294 |
262 Frame* frame = document.frame(); | 295 Frame* frame = document.frame(); |
263 if (!frame) | 296 if (!frame) |
264 return; | 297 return; |
265 FrameView* view = frame->view(); | 298 FrameView* view = frame->view(); |
266 if (!view) | 299 if (!view) |
267 return; | 300 return; |
(...skipping 12 matching lines...) Expand all Loading... |
280 int HTMLBodyElement::scrollWidth() | 313 int HTMLBodyElement::scrollWidth() |
281 { | 314 { |
282 // Update the document's layout. | 315 // Update the document's layout. |
283 Document& document = this->document(); | 316 Document& document = this->document(); |
284 document.updateLayoutIgnorePendingStylesheets(); | 317 document.updateLayoutIgnorePendingStylesheets(); |
285 FrameView* view = document.view(); | 318 FrameView* view = document.view(); |
286 return view ? adjustForZoom(view->contentsWidth(), &document) : 0; | 319 return view ? adjustForZoom(view->contentsWidth(), &document) : 0; |
287 } | 320 } |
288 | 321 |
289 } // namespace WebCore | 322 } // namespace WebCore |
OLD | NEW |