| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2008 Nuanti Ltd. | 3 * Copyright (C) 2008 Nuanti Ltd. |
| 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 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 | 239 |
| 240 Node* currentNode = document->focusedNode(); | 240 Node* currentNode = document->focusedNode(); |
| 241 // FIXME: Not quite correct when it comes to focus transitions leaving/enter
ing the WebView itself | 241 // FIXME: Not quite correct when it comes to focus transitions leaving/enter
ing the WebView itself |
| 242 bool caretBrowsing = focusedOrMainFrame()->settings()->caretBrowsingEnabled(
); | 242 bool caretBrowsing = focusedOrMainFrame()->settings()->caretBrowsingEnabled(
); |
| 243 | 243 |
| 244 if (caretBrowsing && !currentNode) | 244 if (caretBrowsing && !currentNode) |
| 245 currentNode = frame->selection()->start().deprecatedNode(); | 245 currentNode = frame->selection()->start().deprecatedNode(); |
| 246 | 246 |
| 247 document->updateLayoutIgnorePendingStylesheets(); | 247 document->updateLayoutIgnorePendingStylesheets(); |
| 248 | 248 |
| 249 Node* node = findFocusableNodeAcrossTreeScope(direction, currentNode ? curre
ntNode->treeScope() : document, currentNode, event); | 249 RefPtr<Node> node = findFocusableNodeAcrossTreeScope(direction, currentNode
? currentNode->treeScope() : document, currentNode, event); |
| 250 | 250 |
| 251 if (!node) { | 251 if (!node) { |
| 252 // We didn't find a node to focus, so we should try to pass focus to Chr
ome. | 252 // We didn't find a node to focus, so we should try to pass focus to Chr
ome. |
| 253 if (!initialFocus && m_page->chrome()->canTakeFocus(direction)) { | 253 if (!initialFocus && m_page->chrome()->canTakeFocus(direction)) { |
| 254 document->setFocusedNode(0); | 254 document->setFocusedNode(0); |
| 255 setFocusedFrame(0); | 255 setFocusedFrame(0); |
| 256 m_page->chrome()->takeFocus(direction); | 256 m_page->chrome()->takeFocus(direction); |
| 257 return true; | 257 return true; |
| 258 } | 258 } |
| 259 | 259 |
| 260 // Chrome doesn't want focus, so we should wrap focus. | 260 // Chrome doesn't want focus, so we should wrap focus. |
| 261 node = findFocusableNode(direction, m_page->mainFrame()->document(), 0,
event); | 261 node = findFocusableNode(direction, m_page->mainFrame()->document(), 0,
event); |
| 262 node = findFocusableNodeDecendingDownIntoFrameDocumentOrShadowRoot(direc
tion, node, event); | 262 node = findFocusableNodeDecendingDownIntoFrameDocumentOrShadowRoot(direc
tion, node.get(), event); |
| 263 | 263 |
| 264 if (!node) | 264 if (!node) |
| 265 return false; | 265 return false; |
| 266 } | 266 } |
| 267 | 267 |
| 268 ASSERT(node); | 268 ASSERT(node); |
| 269 | 269 |
| 270 if (node == document->focusedNode()) | 270 if (node == document->focusedNode()) |
| 271 // Focus wrapped around to the same node. | 271 // Focus wrapped around to the same node. |
| 272 return true; | 272 return true; |
| 273 | 273 |
| 274 if (!node->isElementNode()) | 274 if (!node->isElementNode()) |
| 275 // FIXME: May need a way to focus a document here. | 275 // FIXME: May need a way to focus a document here. |
| 276 return false; | 276 return false; |
| 277 | 277 |
| 278 if (node->isFrameOwnerElement()) { | 278 if (node->isFrameOwnerElement()) { |
| 279 // We focus frames rather than frame owners. | 279 // We focus frames rather than frame owners. |
| 280 // FIXME: We should not focus frames that have no scrollbars, as focusin
g them isn't useful to the user. | 280 // FIXME: We should not focus frames that have no scrollbars, as focusin
g them isn't useful to the user. |
| 281 HTMLFrameOwnerElement* owner = static_cast<HTMLFrameOwnerElement*>(node)
; | 281 HTMLFrameOwnerElement* owner = static_cast<HTMLFrameOwnerElement*>(node.
get()); |
| 282 if (!owner->contentFrame()) | 282 if (!owner->contentFrame()) |
| 283 return false; | 283 return false; |
| 284 | 284 |
| 285 document->setFocusedNode(0); | 285 document->setFocusedNode(0); |
| 286 setFocusedFrame(owner->contentFrame()); | 286 setFocusedFrame(owner->contentFrame()); |
| 287 return true; | 287 return true; |
| 288 } | 288 } |
| 289 | 289 |
| 290 // FIXME: It would be nice to just be able to call setFocusedNode(node) here
, but we can't do | 290 // FIXME: It would be nice to just be able to call setFocusedNode(node) here
, but we can't do |
| 291 // that because some elements (e.g. HTMLInputElement and HTMLTextAreaElement
) do extra work in | 291 // that because some elements (e.g. HTMLInputElement and HTMLTextAreaElement
) do extra work in |
| 292 // their focus() methods. | 292 // their focus() methods. |
| 293 | 293 |
| 294 Document* newDocument = node->document(); | 294 Document* newDocument = node->document(); |
| 295 | 295 |
| 296 if (newDocument != document) | 296 if (newDocument != document) |
| 297 // Focus is going away from this document, so clear the focused node. | 297 // Focus is going away from this document, so clear the focused node. |
| 298 document->setFocusedNode(0); | 298 document->setFocusedNode(0); |
| 299 | 299 |
| 300 if (newDocument) | 300 if (newDocument) |
| 301 setFocusedFrame(newDocument->frame()); | 301 setFocusedFrame(newDocument->frame()); |
| 302 | 302 |
| 303 if (caretBrowsing) { | 303 if (caretBrowsing) { |
| 304 Position position = firstPositionInOrBeforeNode(node); | 304 Position position = firstPositionInOrBeforeNode(node.get()); |
| 305 VisibleSelection newSelection(position, position, DOWNSTREAM); | 305 VisibleSelection newSelection(position, position, DOWNSTREAM); |
| 306 if (frame->selection()->shouldChangeSelection(newSelection)) | 306 if (frame->selection()->shouldChangeSelection(newSelection)) |
| 307 frame->selection()->setSelection(newSelection); | 307 frame->selection()->setSelection(newSelection); |
| 308 } | 308 } |
| 309 | 309 |
| 310 static_cast<Element*>(node)->focus(false); | 310 static_cast<Element*>(node.get())->focus(false); |
| 311 return true; | 311 return true; |
| 312 } | 312 } |
| 313 | 313 |
| 314 static inline Node* ownerOfTreeScope(TreeScope* scope) | 314 static inline Node* ownerOfTreeScope(TreeScope* scope) |
| 315 { | 315 { |
| 316 ASSERT(scope); | 316 ASSERT(scope); |
| 317 if (scope->isShadowRoot()) | 317 if (scope->isShadowRoot()) |
| 318 return scope->shadowHost(); | 318 return scope->shadowHost(); |
| 319 if (scope->document()->frame()) | 319 if (scope->document()->frame()) |
| 320 return scope->document()->frame()->ownerElement(); | 320 return scope->document()->frame()->ownerElement(); |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b
order */); | 769 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b
order */); |
| 770 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(direct
ion, container); | 770 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(direct
ion, container); |
| 771 if (container && container->isDocumentNode()) | 771 if (container && container->isDocumentNode()) |
| 772 static_cast<Document*>(container)->updateLayoutIgnorePendingStyleshe
ets(); | 772 static_cast<Document*>(container)->updateLayoutIgnorePendingStyleshe
ets(); |
| 773 } while (!consumed && container); | 773 } while (!consumed && container); |
| 774 | 774 |
| 775 return consumed; | 775 return consumed; |
| 776 } | 776 } |
| 777 | 777 |
| 778 } // namespace WebCore | 778 } // namespace WebCore |
| OLD | NEW |