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

Side by Side Diff: Source/core/page/SpatialNavigation.cpp

Issue 16982005: Allow objects without scrollbars to be scrollable (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: CR Fixes Created 7 years, 6 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) 2009 Nokia Corporation and/or its subsidiary(-ies) 2 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3 * Copyright (C) 2009 Antonio Gomes <tonikitoo@webkit.org> 3 * Copyright (C) 2009 Antonio Gomes <tonikitoo@webkit.org>
4 * 4 *
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 298
299 ASSERT(!frameView->needsLayout()); 299 ASSERT(!frameView->needsLayout());
300 300
301 LayoutRect containerViewportRect = frameView->visibleContentRect(); 301 LayoutRect containerViewportRect = frameView->visibleContentRect();
302 // We want to select a node if it is currently off screen, but will be 302 // We want to select a node if it is currently off screen, but will be
303 // exposed after we scroll. Adjust the viewport to post-scrolling position. 303 // exposed after we scroll. Adjust the viewport to post-scrolling position.
304 // If the container has overflow:hidden, we cannot scroll, so we do not pass direction 304 // If the container has overflow:hidden, we cannot scroll, so we do not pass direction
305 // and we do not adjust for scrolling. 305 // and we do not adjust for scrolling.
306 switch (direction) { 306 switch (direction) {
307 case FocusDirectionLeft: 307 case FocusDirectionLeft:
308 containerViewportRect.setX(containerViewportRect.x() - Scrollbar::pixels PerLineStep()); 308 containerViewportRect.setX(containerViewportRect.x() - ScrollableArea::p ixelsPerLineStep());
309 containerViewportRect.setWidth(containerViewportRect.width() + Scrollbar ::pixelsPerLineStep()); 309 containerViewportRect.setWidth(containerViewportRect.width() + Scrollabl eArea::pixelsPerLineStep());
310 break; 310 break;
311 case FocusDirectionRight: 311 case FocusDirectionRight:
312 containerViewportRect.setWidth(containerViewportRect.width() + Scrollbar ::pixelsPerLineStep()); 312 containerViewportRect.setWidth(containerViewportRect.width() + Scrollabl eArea::pixelsPerLineStep());
313 break; 313 break;
314 case FocusDirectionUp: 314 case FocusDirectionUp:
315 containerViewportRect.setY(containerViewportRect.y() - Scrollbar::pixels PerLineStep()); 315 containerViewportRect.setY(containerViewportRect.y() - ScrollableArea::p ixelsPerLineStep());
316 containerViewportRect.setHeight(containerViewportRect.height() + Scrollb ar::pixelsPerLineStep()); 316 containerViewportRect.setHeight(containerViewportRect.height() + Scrolla bleArea::pixelsPerLineStep());
317 break; 317 break;
318 case FocusDirectionDown: 318 case FocusDirectionDown:
319 containerViewportRect.setHeight(containerViewportRect.height() + Scrollb ar::pixelsPerLineStep()); 319 containerViewportRect.setHeight(containerViewportRect.height() + Scrolla bleArea::pixelsPerLineStep());
320 break; 320 break;
321 default: 321 default:
322 break; 322 break;
323 } 323 }
324 324
325 RenderObject* render = node->renderer(); 325 RenderObject* render = node->renderer();
326 if (!render) 326 if (!render)
327 return true; 327 return true;
328 328
329 LayoutRect rect(render->absoluteClippedOverflowRect()); 329 LayoutRect rect(render->absoluteClippedOverflowRect());
330 if (rect.isEmpty()) 330 if (rect.isEmpty())
331 return true; 331 return true;
332 332
333 return !containerViewportRect.intersects(rect); 333 return !containerViewportRect.intersects(rect);
334 } 334 }
335 335
336 bool scrollInDirection(Frame* frame, FocusDirection direction) 336 bool scrollInDirection(Frame* frame, FocusDirection direction)
337 { 337 {
338 ASSERT(frame); 338 ASSERT(frame);
339 339
340 if (frame && canScrollInDirection(frame->document(), direction)) { 340 if (frame && canScrollInDirection(frame->document(), direction)) {
341 LayoutUnit dx = 0; 341 LayoutUnit dx = 0;
342 LayoutUnit dy = 0; 342 LayoutUnit dy = 0;
343 switch (direction) { 343 switch (direction) {
344 case FocusDirectionLeft: 344 case FocusDirectionLeft:
345 dx = - Scrollbar::pixelsPerLineStep(); 345 dx = - ScrollableArea::pixelsPerLineStep();
346 break; 346 break;
347 case FocusDirectionRight: 347 case FocusDirectionRight:
348 dx = Scrollbar::pixelsPerLineStep(); 348 dx = ScrollableArea::pixelsPerLineStep();
349 break; 349 break;
350 case FocusDirectionUp: 350 case FocusDirectionUp:
351 dy = - Scrollbar::pixelsPerLineStep(); 351 dy = - ScrollableArea::pixelsPerLineStep();
352 break; 352 break;
353 case FocusDirectionDown: 353 case FocusDirectionDown:
354 dy = Scrollbar::pixelsPerLineStep(); 354 dy = ScrollableArea::pixelsPerLineStep();
355 break; 355 break;
356 default: 356 default:
357 ASSERT_NOT_REACHED(); 357 ASSERT_NOT_REACHED();
358 return false; 358 return false;
359 } 359 }
360 360
361 frame->view()->scrollBy(IntSize(dx, dy)); 361 frame->view()->scrollBy(IntSize(dx, dy));
362 return true; 362 return true;
363 } 363 }
364 return false; 364 return false;
365 } 365 }
366 366
367 bool scrollInDirection(Node* container, FocusDirection direction) 367 bool scrollInDirection(Node* container, FocusDirection direction)
368 { 368 {
369 ASSERT(container); 369 ASSERT(container);
370 if (container->isDocumentNode()) 370 if (container->isDocumentNode())
371 return scrollInDirection(toDocument(container)->frame(), direction); 371 return scrollInDirection(toDocument(container)->frame(), direction);
372 372
373 if (!container->renderBox()) 373 if (!container->renderBox())
374 return false; 374 return false;
375 375
376 if (canScrollInDirection(container, direction)) { 376 if (canScrollInDirection(container, direction)) {
377 LayoutUnit dx = 0; 377 LayoutUnit dx = 0;
378 LayoutUnit dy = 0; 378 LayoutUnit dy = 0;
379 switch (direction) { 379 switch (direction) {
380 case FocusDirectionLeft: 380 case FocusDirectionLeft:
381 dx = - min<LayoutUnit>(Scrollbar::pixelsPerLineStep(), container->re nderBox()->scrollLeft()); 381 dx = - min<LayoutUnit>(ScrollableArea::pixelsPerLineStep(), containe r->renderBox()->scrollLeft());
382 break; 382 break;
383 case FocusDirectionRight: 383 case FocusDirectionRight:
384 ASSERT(container->renderBox()->scrollWidth() > (container->renderBox ()->scrollLeft() + container->renderBox()->clientWidth())); 384 ASSERT(container->renderBox()->scrollWidth() > (container->renderBox ()->scrollLeft() + container->renderBox()->clientWidth()));
385 dx = min<LayoutUnit>(Scrollbar::pixelsPerLineStep(), container->rend erBox()->scrollWidth() - (container->renderBox()->scrollLeft() + container->rend erBox()->clientWidth())); 385 dx = min<LayoutUnit>(ScrollableArea::pixelsPerLineStep(), container- >renderBox()->scrollWidth() - (container->renderBox()->scrollLeft() + container- >renderBox()->clientWidth()));
386 break; 386 break;
387 case FocusDirectionUp: 387 case FocusDirectionUp:
388 dy = - min<LayoutUnit>(Scrollbar::pixelsPerLineStep(), container->re nderBox()->scrollTop()); 388 dy = - min<LayoutUnit>(ScrollableArea::pixelsPerLineStep(), containe r->renderBox()->scrollTop());
389 break; 389 break;
390 case FocusDirectionDown: 390 case FocusDirectionDown:
391 ASSERT(container->renderBox()->scrollHeight() - (container->renderBo x()->scrollTop() + container->renderBox()->clientHeight())); 391 ASSERT(container->renderBox()->scrollHeight() - (container->renderBo x()->scrollTop() + container->renderBox()->clientHeight()));
392 dy = min<LayoutUnit>(Scrollbar::pixelsPerLineStep(), container->rend erBox()->scrollHeight() - (container->renderBox()->scrollTop() + container->rend erBox()->clientHeight())); 392 dy = min<LayoutUnit>(ScrollableArea::pixelsPerLineStep(), container- >renderBox()->scrollHeight() - (container->renderBox()->scrollTop() + container- >renderBox()->clientHeight()));
393 break; 393 break;
394 default: 394 default:
395 ASSERT_NOT_REACHED(); 395 ASSERT_NOT_REACHED();
396 return false; 396 return false;
397 } 397 }
398 398
399 container->renderBox()->enclosingLayer()->scrollByRecursively(IntSize(dx , dy)); 399 container->renderBox()->enclosingLayer()->scrollByRecursively(IntSize(dx , dy));
400 return true; 400 return true;
401 } 401 }
402 402
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 LayoutRect rect = virtualRectForDirection(direction, rectToAbsoluteCoordinat es(area->document()->frame(), area->computeRect(area->imageElement()->renderer() )), 1); 730 LayoutRect rect = virtualRectForDirection(direction, rectToAbsoluteCoordinat es(area->document()->frame(), area->computeRect(area->imageElement()->renderer() )), 1);
731 return rect; 731 return rect;
732 } 732 }
733 733
734 HTMLFrameOwnerElement* frameOwnerElement(FocusCandidate& candidate) 734 HTMLFrameOwnerElement* frameOwnerElement(FocusCandidate& candidate)
735 { 735 {
736 return candidate.isFrameOwnerElement() ? static_cast<HTMLFrameOwnerElement*> (candidate.visibleNode) : 0; 736 return candidate.isFrameOwnerElement() ? static_cast<HTMLFrameOwnerElement*> (candidate.visibleNode) : 0;
737 }; 737 };
738 738
739 } // namespace WebCore 739 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698