OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 1702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1713 FrameView* view = m_frame->view(); | 1713 FrameView* view = m_frame->view(); |
1714 RenderView* renderView = m_frame->contentRenderer(); | 1714 RenderView* renderView = m_frame->contentRenderer(); |
1715 | 1715 |
1716 if (!view || !renderView) | 1716 if (!view || !renderView) |
1717 return FloatRect(); | 1717 return FloatRect(); |
1718 | 1718 |
1719 LayoutRect selectionRect = renderView->selectionBounds(clipToVisibleContent)
; | 1719 LayoutRect selectionRect = renderView->selectionBounds(clipToVisibleContent)
; |
1720 return clipToVisibleContent ? intersection(selectionRect, view->visibleConte
ntRect()) : selectionRect; | 1720 return clipToVisibleContent ? intersection(selectionRect, view->visibleConte
ntRect()) : selectionRect; |
1721 } | 1721 } |
1722 | 1722 |
| 1723 static inline HTMLFormElement* associatedFormElement(HTMLElement& element) |
| 1724 { |
| 1725 if (isHTMLFormElement(element)) |
| 1726 return &toHTMLFormElement(element); |
| 1727 return element.formOwner(); |
| 1728 } |
| 1729 |
1723 // Scans logically forward from "start", including any child frames. | 1730 // Scans logically forward from "start", including any child frames. |
1724 static HTMLFormElement* scanForForm(Node* start) | 1731 static HTMLFormElement* scanForForm(Node* start) |
1725 { | 1732 { |
1726 if (!start) | 1733 if (!start) |
1727 return 0; | 1734 return 0; |
| 1735 |
1728 HTMLElement* element = start->isHTMLElement() ? toHTMLElement(start) : Trave
rsal<HTMLElement>::next(*start); | 1736 HTMLElement* element = start->isHTMLElement() ? toHTMLElement(start) : Trave
rsal<HTMLElement>::next(*start); |
1729 for (; element; element = Traversal<HTMLElement>::next(*element)) { | 1737 for (; element; element = Traversal<HTMLElement>::next(*element)) { |
1730 if (isHTMLFormElement(*element)) | 1738 if (HTMLFormElement* form = associatedFormElement(*element)) |
1731 return toHTMLFormElement(element); | 1739 return form; |
1732 | |
1733 if (HTMLFormElement* owner = element->formOwner()) | |
1734 return owner; | |
1735 | 1740 |
1736 if (isHTMLFrameElementBase(*element)) { | 1741 if (isHTMLFrameElementBase(*element)) { |
1737 Node* childDocument = toHTMLFrameElementBase(*element).contentDocume
nt(); | 1742 Node* childDocument = toHTMLFrameElementBase(*element).contentDocume
nt(); |
1738 if (HTMLFormElement* frameResult = scanForForm(childDocument)) | 1743 if (HTMLFormElement* frameResult = scanForForm(childDocument)) |
1739 return frameResult; | 1744 return frameResult; |
1740 } | 1745 } |
1741 } | 1746 } |
1742 return 0; | 1747 return 0; |
1743 } | 1748 } |
1744 | 1749 |
1745 // We look for either the form containing the current focus, or for one immediat
ely after it | 1750 // We look for either the form containing the current focus, or for one immediat
ely after it |
1746 HTMLFormElement* FrameSelection::currentForm() const | 1751 HTMLFormElement* FrameSelection::currentForm() const |
1747 { | 1752 { |
1748 // Start looking either at the active (first responder) node, or where the s
election is. | 1753 // Start looking either at the active (first responder) node, or where the s
election is. |
1749 Node* start = m_frame->document()->focusedElement(); | 1754 Node* start = m_frame->document()->focusedElement(); |
1750 if (!start) | 1755 if (!start) |
1751 start = this->start().deprecatedNode(); | 1756 start = this->start().deprecatedNode(); |
| 1757 if (!start) |
| 1758 return 0; |
1752 | 1759 |
1753 // Try walking up the node tree to find a form element. | 1760 // Try walking up the node tree to find a form element. |
1754 Node* node; | 1761 for (HTMLElement* element = Traversal<HTMLElement>::firstAncestorOrSelf(*sta
rt); element; element = Traversal<HTMLElement>::firstAncestor(*element)) { |
1755 for (node = start; node; node = node->parentNode()) { | 1762 if (HTMLFormElement* form = associatedFormElement(*element)) |
1756 if (isHTMLFormElement(*node)) | 1763 return form; |
1757 return toHTMLFormElement(node); | |
1758 if (node->isHTMLElement()) { | |
1759 HTMLFormElement* owner = toHTMLElement(node)->formOwner(); | |
1760 if (owner) | |
1761 return owner; | |
1762 } | |
1763 } | 1764 } |
1764 | 1765 |
1765 // Try walking forward in the node tree to find a form element. | 1766 // Try walking forward in the node tree to find a form element. |
1766 return scanForForm(start); | 1767 return scanForForm(start); |
1767 } | 1768 } |
1768 | 1769 |
1769 void FrameSelection::revealSelection(const ScrollAlignment& alignment, RevealExt
entOption revealExtentOption) | 1770 void FrameSelection::revealSelection(const ScrollAlignment& alignment, RevealExt
entOption revealExtentOption) |
1770 { | 1771 { |
1771 LayoutRect rect; | 1772 LayoutRect rect; |
1772 | 1773 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 sel.showTreeForThis(); | 1876 sel.showTreeForThis(); |
1876 } | 1877 } |
1877 | 1878 |
1878 void showTree(const WebCore::FrameSelection* sel) | 1879 void showTree(const WebCore::FrameSelection* sel) |
1879 { | 1880 { |
1880 if (sel) | 1881 if (sel) |
1881 sel->showTreeForThis(); | 1882 sel->showTreeForThis(); |
1882 } | 1883 } |
1883 | 1884 |
1884 #endif | 1885 #endif |
OLD | NEW |