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 22 matching lines...) Expand all Loading... |
33 #include "core/dom/Element.h" | 33 #include "core/dom/Element.h" |
34 #include "core/dom/ElementTraversal.h" | 34 #include "core/dom/ElementTraversal.h" |
35 #include "core/dom/NodeTraversal.h" | 35 #include "core/dom/NodeTraversal.h" |
36 #include "core/dom/Range.h" | 36 #include "core/dom/Range.h" |
37 #include "core/dom/shadow/ElementShadow.h" | 37 #include "core/dom/shadow/ElementShadow.h" |
38 #include "core/dom/shadow/ShadowRoot.h" | 38 #include "core/dom/shadow/ShadowRoot.h" |
39 #include "core/editing/Editor.h" | 39 #include "core/editing/Editor.h" |
40 #include "core/editing/FrameSelection.h" | 40 #include "core/editing/FrameSelection.h" |
41 #include "core/editing/htmlediting.h" // For firstPositionInOrBeforeNode | 41 #include "core/editing/htmlediting.h" // For firstPositionInOrBeforeNode |
42 #include "core/events/Event.h" | 42 #include "core/events/Event.h" |
| 43 #include "core/frame/FrameView.h" |
43 #include "core/frame/LocalDOMWindow.h" | 44 #include "core/frame/LocalDOMWindow.h" |
44 #include "core/frame/FrameView.h" | |
45 #include "core/frame/LocalFrame.h" | 45 #include "core/frame/LocalFrame.h" |
46 #include "core/html/HTMLAreaElement.h" | 46 #include "core/html/HTMLAreaElement.h" |
47 #include "core/html/HTMLImageElement.h" | 47 #include "core/html/HTMLImageElement.h" |
48 #include "core/html/HTMLPlugInElement.h" | 48 #include "core/html/HTMLPlugInElement.h" |
49 #include "core/html/HTMLShadowElement.h" | 49 #include "core/html/HTMLShadowElement.h" |
50 #include "core/html/HTMLTextFormControlElement.h" | 50 #include "core/html/HTMLTextFormControlElement.h" |
51 #include "core/page/Chrome.h" | 51 #include "core/page/Chrome.h" |
52 #include "core/page/ChromeClient.h" | 52 #include "core/page/ChromeClient.h" |
53 #include "core/page/EventHandler.h" | 53 #include "core/page/EventHandler.h" |
54 #include "core/page/FrameTree.h" | 54 #include "core/page/FrameTree.h" |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 } | 222 } |
223 | 223 |
224 FocusController::FocusController(Page* page) | 224 FocusController::FocusController(Page* page) |
225 : m_page(page) | 225 : m_page(page) |
226 , m_isActive(false) | 226 , m_isActive(false) |
227 , m_isFocused(false) | 227 , m_isFocused(false) |
228 , m_isChangingFocusedFrame(false) | 228 , m_isChangingFocusedFrame(false) |
229 { | 229 { |
230 } | 230 } |
231 | 231 |
232 PassOwnPtr<FocusController> FocusController::create(Page* page) | 232 PassOwnPtrWillBeRawPtr<FocusController> FocusController::create(Page* page) |
233 { | 233 { |
234 return adoptPtr(new FocusController(page)); | 234 return adoptPtrWillBeNoop(new FocusController(page)); |
235 } | 235 } |
236 | 236 |
237 void FocusController::setFocusedFrame(PassRefPtr<Frame> frame) | 237 void FocusController::setFocusedFrame(PassRefPtrWillBeRawPtr<Frame> frame) |
238 { | 238 { |
239 ASSERT(!frame || frame->page() == m_page); | 239 ASSERT(!frame || frame->page() == m_page); |
240 if (m_focusedFrame == frame || m_isChangingFocusedFrame) | 240 if (m_focusedFrame == frame || m_isChangingFocusedFrame) |
241 return; | 241 return; |
242 | 242 |
243 m_isChangingFocusedFrame = true; | 243 m_isChangingFocusedFrame = true; |
244 | 244 |
245 RefPtr<LocalFrame> oldFrame = (m_focusedFrame && m_focusedFrame->isLocalFram
e()) ? toLocalFrame(m_focusedFrame.get()) : 0; | 245 RefPtrWillBeRawPtr<LocalFrame> oldFrame = (m_focusedFrame && m_focusedFrame-
>isLocalFrame()) ? toLocalFrame(m_focusedFrame.get()) : 0; |
246 RefPtr<LocalFrame> newFrame = (frame && frame->isLocalFrame()) ? toLocalFram
e(frame.get()) : 0; | 246 |
| 247 RefPtrWillBeRawPtr<LocalFrame> newFrame = (frame && frame->isLocalFrame()) ?
toLocalFrame(frame.get()) : 0; |
247 | 248 |
248 m_focusedFrame = frame.get(); | 249 m_focusedFrame = frame.get(); |
249 | 250 |
250 // Now that the frame is updated, fire events and update the selection focus
ed states of both frames. | 251 // Now that the frame is updated, fire events and update the selection focus
ed states of both frames. |
251 if (oldFrame && oldFrame->view()) { | 252 if (oldFrame && oldFrame->view()) { |
252 oldFrame->selection().setFocused(false); | 253 oldFrame->selection().setFocused(false); |
253 oldFrame->domWindow()->dispatchEvent(Event::create(EventTypeNames::blur)
); | 254 oldFrame->domWindow()->dispatchEvent(Event::create(EventTypeNames::blur)
); |
254 } | 255 } |
255 | 256 |
256 if (newFrame && newFrame->view() && isFocused()) { | 257 if (newFrame && newFrame->view() && isFocused()) { |
257 newFrame->selection().setFocused(true); | 258 newFrame->selection().setFocused(true); |
258 newFrame->domWindow()->dispatchEvent(Event::create(EventTypeNames::focus
)); | 259 newFrame->domWindow()->dispatchEvent(Event::create(EventTypeNames::focus
)); |
259 } | 260 } |
260 | 261 |
261 m_isChangingFocusedFrame = false; | 262 m_isChangingFocusedFrame = false; |
262 | 263 |
263 m_page->chrome().client().focusedFrameChanged(newFrame.get()); | 264 m_page->chrome().client().focusedFrameChanged(newFrame.get()); |
264 } | 265 } |
265 | 266 |
266 void FocusController::focusDocumentView(PassRefPtr<Frame> frame) | 267 void FocusController::focusDocumentView(PassRefPtrWillBeRawPtr<Frame> frame) |
267 { | 268 { |
268 ASSERT(!frame || frame->page() == m_page); | 269 ASSERT(!frame || frame->page() == m_page); |
269 if (m_focusedFrame == frame) | 270 if (m_focusedFrame == frame) |
270 return; | 271 return; |
271 | 272 |
272 RefPtr<LocalFrame> focusedFrame = (m_focusedFrame && m_focusedFrame->isLocal
Frame()) ? toLocalFrame(m_focusedFrame.get()) : 0; | 273 RefPtrWillBeRawPtr<LocalFrame> focusedFrame = (m_focusedFrame && m_focusedFr
ame->isLocalFrame()) ? toLocalFrame(m_focusedFrame.get()) : 0; |
273 if (focusedFrame && focusedFrame->view()) { | 274 if (focusedFrame && focusedFrame->view()) { |
274 RefPtrWillBeRawPtr<Document> document = focusedFrame->document(); | 275 RefPtrWillBeRawPtr<Document> document = focusedFrame->document(); |
275 Element* focusedElement = document ? document->focusedElement() : 0; | 276 Element* focusedElement = document ? document->focusedElement() : 0; |
276 if (focusedElement) { | 277 if (focusedElement) { |
277 focusedElement->dispatchBlurEvent(0); | 278 focusedElement->dispatchBlurEvent(0); |
278 if (focusedElement == document->focusedElement()) { | 279 if (focusedElement == document->focusedElement()) { |
279 focusedElement->dispatchFocusOutEvent(EventTypeNames::focusout,
0); | 280 focusedElement->dispatchFocusOutEvent(EventTypeNames::focusout,
0); |
280 if (focusedElement == document->focusedElement()) | 281 if (focusedElement == document->focusedElement()) |
281 focusedElement->dispatchFocusOutEvent(EventTypeNames::DOMFoc
usOut, 0); | 282 focusedElement->dispatchFocusOutEvent(EventTypeNames::DOMFoc
usOut, 0); |
282 } | 283 } |
283 } | 284 } |
284 } | 285 } |
285 | 286 |
286 RefPtr<LocalFrame> newFocusedFrame = (frame && frame->isLocalFrame()) ? toLo
calFrame(frame.get()) : 0; | 287 RefPtrWillBeRawPtr<LocalFrame> newFocusedFrame = (frame && frame->isLocalFra
me()) ? toLocalFrame(frame.get()) : 0; |
287 if (newFocusedFrame && newFocusedFrame->view()) { | 288 if (newFocusedFrame && newFocusedFrame->view()) { |
288 RefPtrWillBeRawPtr<Document> document = newFocusedFrame->document(); | 289 RefPtrWillBeRawPtr<Document> document = newFocusedFrame->document(); |
289 Element* focusedElement = document ? document->focusedElement() : 0; | 290 Element* focusedElement = document ? document->focusedElement() : 0; |
290 if (focusedElement) { | 291 if (focusedElement) { |
291 focusedElement->dispatchFocusEvent(0, FocusTypePage); | 292 focusedElement->dispatchFocusEvent(0, FocusTypePage); |
292 if (focusedElement == document->focusedElement()) { | 293 if (focusedElement == document->focusedElement()) { |
293 document->focusedElement()->dispatchFocusInEvent(EventTypeNames:
:focusin, 0, FocusTypePage); | 294 document->focusedElement()->dispatchFocusInEvent(EventTypeNames:
:focusin, 0, FocusTypePage); |
294 if (focusedElement == document->focusedElement()) | 295 if (focusedElement == document->focusedElement()) |
295 document->focusedElement()->dispatchFocusInEvent(EventTypeNa
mes::DOMFocusIn, 0, FocusTypePage); | 296 document->focusedElement()->dispatchFocusInEvent(EventTypeNa
mes::DOMFocusIn, 0, FocusTypePage); |
296 } | 297 } |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 | 668 |
668 if (!enclosingTextFormControl(selectionStartNode)) | 669 if (!enclosingTextFormControl(selectionStartNode)) |
669 return; | 670 return; |
670 | 671 |
671 if (selectionStartNode->isInShadowTree() && selectionStartNode->shadowHost()
== newFocusedNode) | 672 if (selectionStartNode->isInShadowTree() && selectionStartNode->shadowHost()
== newFocusedNode) |
672 return; | 673 return; |
673 | 674 |
674 selection.clear(); | 675 selection.clear(); |
675 } | 676 } |
676 | 677 |
677 bool FocusController::setFocusedElement(Element* element, PassRefPtr<Frame> newF
ocusedFrame, FocusType type) | 678 bool FocusController::setFocusedElement(Element* element, PassRefPtrWillBeRawPtr
<Frame> newFocusedFrame, FocusType type) |
678 { | 679 { |
679 RefPtr<LocalFrame> oldFocusedFrame = toLocalFrame(focusedFrame()); | 680 RefPtrWillBeRawPtr<LocalFrame> oldFocusedFrame = toLocalFrame(focusedFrame()
); |
680 RefPtrWillBeRawPtr<Document> oldDocument = oldFocusedFrame ? oldFocusedFrame
->document() : 0; | 681 RefPtrWillBeRawPtr<Document> oldDocument = oldFocusedFrame ? oldFocusedFrame
->document() : 0; |
681 | 682 |
682 Element* oldFocusedElement = oldDocument ? oldDocument->focusedElement() : 0
; | 683 Element* oldFocusedElement = oldDocument ? oldDocument->focusedElement() : 0
; |
683 if (element && oldFocusedElement == element) | 684 if (element && oldFocusedElement == element) |
684 return true; | 685 return true; |
685 | 686 |
686 // FIXME: Might want to disable this check for caretBrowsing | 687 // FIXME: Might want to disable this check for caretBrowsing |
687 if (oldFocusedElement && oldFocusedElement->isRootEditableElement() && !reli
nquishesEditingFocus(oldFocusedElement)) | 688 if (oldFocusedElement && oldFocusedElement->isRootEditableElement() && !reli
nquishesEditingFocus(oldFocusedElement)) |
688 return false; | 689 return false; |
689 | 690 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 consumed = advanceFocusDirectionallyInContainer(container, startingRect,
type); | 919 consumed = advanceFocusDirectionallyInContainer(container, startingRect,
type); |
919 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b
order */); | 920 startingRect = nodeRectInAbsoluteCoordinates(container, true /* ignore b
order */); |
920 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(type,
container); | 921 container = scrollableEnclosingBoxOrParentFrameForNodeInDirection(type,
container); |
921 if (container && container->isDocumentNode()) | 922 if (container && container->isDocumentNode()) |
922 toDocument(container)->updateLayoutIgnorePendingStylesheets(); | 923 toDocument(container)->updateLayoutIgnorePendingStylesheets(); |
923 } while (!consumed && container); | 924 } while (!consumed && container); |
924 | 925 |
925 return consumed; | 926 return consumed; |
926 } | 927 } |
927 | 928 |
| 929 void FocusController::trace(Visitor* visitor) |
| 930 { |
| 931 visitor->trace(m_page); |
| 932 visitor->trace(m_focusedFrame); |
| 933 } |
| 934 |
928 } // namespace blink | 935 } // namespace blink |
OLD | NEW |