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) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 // The origin of the Document is the origin it was assigned when its bro
wsing context was created. | 308 // The origin of the Document is the origin it was assigned when its bro
wsing context was created. |
309 // | 309 // |
310 // Note: We generalize this to all "blank" URLs and invalid URLs because we | 310 // Note: We generalize this to all "blank" URLs and invalid URLs because we |
311 // treat all of these URLs as about:blank. | 311 // treat all of these URLs as about:blank. |
312 // | 312 // |
313 return url.isEmpty() || url.protocolIsAbout(); | 313 return url.isEmpty() || url.protocolIsAbout(); |
314 } | 314 } |
315 | 315 |
316 static Widget* widgetForElement(const Element& focusedElement) | 316 static Widget* widgetForElement(const Element& focusedElement) |
317 { | 317 { |
318 RenderObject* renderer = focusedElement.renderer(); | 318 LayoutObject* renderer = focusedElement.renderer(); |
319 if (!renderer || !renderer->isRenderPart()) | 319 if (!renderer || !renderer->isRenderPart()) |
320 return 0; | 320 return 0; |
321 return toRenderPart(renderer)->widget(); | 321 return toRenderPart(renderer)->widget(); |
322 } | 322 } |
323 | 323 |
324 static bool acceptsEditingFocus(const Element& element) | 324 static bool acceptsEditingFocus(const Element& element) |
325 { | 325 { |
326 ASSERT(element.hasEditableStyle()); | 326 ASSERT(element.hasEditableStyle()); |
327 | 327 |
328 return element.document().frame() && element.rootEditableElement(); | 328 return element.document().frame() && element.rootEditableElement(); |
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1246 return 0; | 1246 return 0; |
1247 | 1247 |
1248 return TreeScope::elementFromPoint(x, y); | 1248 return TreeScope::elementFromPoint(x, y); |
1249 } | 1249 } |
1250 | 1250 |
1251 PassRefPtrWillBeRawPtr<Range> Document::caretRangeFromPoint(int x, int y) | 1251 PassRefPtrWillBeRawPtr<Range> Document::caretRangeFromPoint(int x, int y) |
1252 { | 1252 { |
1253 if (!renderView()) | 1253 if (!renderView()) |
1254 return nullptr; | 1254 return nullptr; |
1255 HitTestResult result = hitTestInDocument(this, x, y); | 1255 HitTestResult result = hitTestInDocument(this, x, y); |
1256 RenderObject* renderer = result.renderer(); | 1256 LayoutObject* renderer = result.renderer(); |
1257 if (!renderer) | 1257 if (!renderer) |
1258 return nullptr; | 1258 return nullptr; |
1259 | 1259 |
1260 Node* node = renderer->node(); | 1260 Node* node = renderer->node(); |
1261 Node* shadowAncestorNode = ancestorInThisScope(node); | 1261 Node* shadowAncestorNode = ancestorInThisScope(node); |
1262 if (shadowAncestorNode != node) { | 1262 if (shadowAncestorNode != node) { |
1263 unsigned offset = shadowAncestorNode->nodeIndex(); | 1263 unsigned offset = shadowAncestorNode->nodeIndex(); |
1264 ContainerNode* container = shadowAncestorNode->parentNode(); | 1264 ContainerNode* container = shadowAncestorNode->parentNode(); |
1265 return Range::create(*this, container, offset, container, offset); | 1265 return Range::create(*this, container, offset, container, offset); |
1266 } | 1266 } |
(...skipping 3924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5191 PluginDocument* pluginDocument = toPluginDocument(doc); | 5191 PluginDocument* pluginDocument = toPluginDocument(doc); |
5192 node = pluginDocument->pluginNode(); | 5192 node = pluginDocument->pluginNode(); |
5193 } | 5193 } |
5194 if (!node && doc->isHTMLDocument()) | 5194 if (!node && doc->isHTMLDocument()) |
5195 node = doc->body(); | 5195 node = doc->body(); |
5196 if (!node) | 5196 if (!node) |
5197 node = doc->documentElement(); | 5197 node = doc->documentElement(); |
5198 return node; | 5198 return node; |
5199 } | 5199 } |
5200 | 5200 |
5201 void Document::adjustFloatQuadsForScrollAndAbsoluteZoom(Vector<FloatQuad>& quads
, RenderObject& renderer) | 5201 void Document::adjustFloatQuadsForScrollAndAbsoluteZoom(Vector<FloatQuad>& quads
, LayoutObject& renderer) |
5202 { | 5202 { |
5203 if (!view()) | 5203 if (!view()) |
5204 return; | 5204 return; |
5205 | 5205 |
5206 LayoutRect visibleContentRect = view()->visualViewportRect(); | 5206 LayoutRect visibleContentRect = view()->visualViewportRect(); |
5207 for (size_t i = 0; i < quads.size(); ++i) { | 5207 for (size_t i = 0; i < quads.size(); ++i) { |
5208 quads[i].move(-FloatSize(visibleContentRect.x().toFloat(), visibleConten
tRect.y().toFloat())); | 5208 quads[i].move(-FloatSize(visibleContentRect.x().toFloat(), visibleConten
tRect.y().toFloat())); |
5209 adjustFloatQuadForAbsoluteZoom(quads[i], renderer); | 5209 adjustFloatQuadForAbsoluteZoom(quads[i], renderer); |
5210 } | 5210 } |
5211 } | 5211 } |
5212 | 5212 |
5213 void Document::adjustFloatRectForScrollAndAbsoluteZoom(FloatRect& rect, RenderOb
ject& renderer) | 5213 void Document::adjustFloatRectForScrollAndAbsoluteZoom(FloatRect& rect, LayoutOb
ject& renderer) |
5214 { | 5214 { |
5215 if (!view()) | 5215 if (!view()) |
5216 return; | 5216 return; |
5217 | 5217 |
5218 LayoutRect visibleContentRect = view()->visualViewportRect(); | 5218 LayoutRect visibleContentRect = view()->visualViewportRect(); |
5219 rect.move(-FloatSize(visibleContentRect.x().toFloat(), visibleContentRect.y(
).toFloat())); | 5219 rect.move(-FloatSize(visibleContentRect.x().toFloat(), visibleContentRect.y(
).toFloat())); |
5220 adjustFloatRectForAbsoluteZoom(rect, renderer); | 5220 adjustFloatRectForAbsoluteZoom(rect, renderer); |
5221 } | 5221 } |
5222 | 5222 |
5223 bool Document::hasActiveParser() | 5223 bool Document::hasActiveParser() |
5224 { | 5224 { |
5225 return m_activeParserCount || (m_parser && m_parser->processingData()); | 5225 return m_activeParserCount || (m_parser && m_parser->processingData()); |
5226 } | 5226 } |
5227 | 5227 |
5228 void Document::setContextFeatures(ContextFeatures& features) | 5228 void Document::setContextFeatures(ContextFeatures& features) |
5229 { | 5229 { |
5230 m_contextFeatures = PassRefPtrWillBeRawPtr<ContextFeatures>(features); | 5230 m_contextFeatures = PassRefPtrWillBeRawPtr<ContextFeatures>(features); |
5231 } | 5231 } |
5232 | 5232 |
5233 static RenderObject* nearestCommonHoverAncestor(RenderObject* obj1, RenderObject
* obj2) | 5233 static LayoutObject* nearestCommonHoverAncestor(LayoutObject* obj1, LayoutObject
* obj2) |
5234 { | 5234 { |
5235 if (!obj1 || !obj2) | 5235 if (!obj1 || !obj2) |
5236 return 0; | 5236 return 0; |
5237 | 5237 |
5238 for (RenderObject* currObj1 = obj1; currObj1; currObj1 = currObj1->hoverAnce
stor()) { | 5238 for (LayoutObject* currObj1 = obj1; currObj1; currObj1 = currObj1->hoverAnce
stor()) { |
5239 for (RenderObject* currObj2 = obj2; currObj2; currObj2 = currObj2->hover
Ancestor()) { | 5239 for (LayoutObject* currObj2 = obj2; currObj2; currObj2 = currObj2->hover
Ancestor()) { |
5240 if (currObj1 == currObj2) | 5240 if (currObj1 == currObj2) |
5241 return currObj1; | 5241 return currObj1; |
5242 } | 5242 } |
5243 } | 5243 } |
5244 | 5244 |
5245 return 0; | 5245 return 0; |
5246 } | 5246 } |
5247 | 5247 |
5248 void Document::updateHoverActiveState(const HitTestRequest& request, Element* in
nerElement, const PlatformMouseEvent* event) | 5248 void Document::updateHoverActiveState(const HitTestRequest& request, Element* in
nerElement, const PlatformMouseEvent* event) |
5249 { | 5249 { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5294 // Check to see if the hovered node has changed. | 5294 // Check to see if the hovered node has changed. |
5295 // If it hasn't, we do not need to do anything. | 5295 // If it hasn't, we do not need to do anything. |
5296 Node* newHoverNode = innerElementInDocument; | 5296 Node* newHoverNode = innerElementInDocument; |
5297 while (newHoverNode && !newHoverNode->renderer()) | 5297 while (newHoverNode && !newHoverNode->renderer()) |
5298 newHoverNode = newHoverNode->parentOrShadowHostNode(); | 5298 newHoverNode = newHoverNode->parentOrShadowHostNode(); |
5299 | 5299 |
5300 // Update our current hover node. | 5300 // Update our current hover node. |
5301 setHoverNode(newHoverNode); | 5301 setHoverNode(newHoverNode); |
5302 | 5302 |
5303 // We have two different objects. Fetch their renderers. | 5303 // We have two different objects. Fetch their renderers. |
5304 RenderObject* oldHoverObj = oldHoverNode ? oldHoverNode->renderer() : 0; | 5304 LayoutObject* oldHoverObj = oldHoverNode ? oldHoverNode->renderer() : 0; |
5305 RenderObject* newHoverObj = newHoverNode ? newHoverNode->renderer() : 0; | 5305 LayoutObject* newHoverObj = newHoverNode ? newHoverNode->renderer() : 0; |
5306 | 5306 |
5307 // Locate the common ancestor render object for the two renderers. | 5307 // Locate the common ancestor render object for the two renderers. |
5308 RenderObject* ancestor = nearestCommonHoverAncestor(oldHoverObj, newHoverObj
); | 5308 LayoutObject* ancestor = nearestCommonHoverAncestor(oldHoverObj, newHoverObj
); |
5309 RefPtrWillBeRawPtr<Node> ancestorNode(ancestor ? ancestor->node() : 0); | 5309 RefPtrWillBeRawPtr<Node> ancestorNode(ancestor ? ancestor->node() : 0); |
5310 | 5310 |
5311 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> nodesToRemoveFromChain; | 5311 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> nodesToRemoveFromChain; |
5312 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> nodesToAddToChain; | 5312 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> nodesToAddToChain; |
5313 | 5313 |
5314 if (oldHoverObj != newHoverObj) { | 5314 if (oldHoverObj != newHoverObj) { |
5315 // If the old hovered node is not nil but it's renderer is, it was proba
bly detached as part of the :hover style | 5315 // If the old hovered node is not nil but it's renderer is, it was proba
bly detached as part of the :hover style |
5316 // (for instance by setting display:none in the :hover pseudo-class). In
this case, the old hovered element (and its ancestors) | 5316 // (for instance by setting display:none in the :hover pseudo-class). In
this case, the old hovered element (and its ancestors) |
5317 // must be updated, to ensure it's normal style is re-applied. | 5317 // must be updated, to ensure it's normal style is re-applied. |
5318 if (oldHoverNode && !oldHoverObj) { | 5318 if (oldHoverNode && !oldHoverObj) { |
5319 for (Node* node = oldHoverNode.get(); node; node = node->parentNode(
)) { | 5319 for (Node* node = oldHoverNode.get(); node; node = node->parentNode(
)) { |
5320 if (!mustBeInActiveChain || (node->isElementNode() && toElement(
node)->inActiveChain())) | 5320 if (!mustBeInActiveChain || (node->isElementNode() && toElement(
node)->inActiveChain())) |
5321 nodesToRemoveFromChain.append(node); | 5321 nodesToRemoveFromChain.append(node); |
5322 } | 5322 } |
5323 | 5323 |
5324 } | 5324 } |
5325 | 5325 |
5326 // The old hover path only needs to be cleared up to (and not including)
the common ancestor; | 5326 // The old hover path only needs to be cleared up to (and not including)
the common ancestor; |
5327 for (RenderObject* curr = oldHoverObj; curr && curr != ancestor; curr =
curr->hoverAncestor()) { | 5327 for (LayoutObject* curr = oldHoverObj; curr && curr != ancestor; curr =
curr->hoverAncestor()) { |
5328 if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr
->node()->inActiveChain())) | 5328 if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr
->node()->inActiveChain())) |
5329 nodesToRemoveFromChain.append(curr->node()); | 5329 nodesToRemoveFromChain.append(curr->node()); |
5330 } | 5330 } |
5331 } | 5331 } |
5332 | 5332 |
5333 // Now set the hover state for our new object up to the root. | 5333 // Now set the hover state for our new object up to the root. |
5334 for (RenderObject* curr = newHoverObj; curr; curr = curr->hoverAncestor()) { | 5334 for (LayoutObject* curr = newHoverObj; curr; curr = curr->hoverAncestor()) { |
5335 if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr->no
de()->inActiveChain())) | 5335 if (curr->node() && !curr->isText() && (!mustBeInActiveChain || curr->no
de()->inActiveChain())) |
5336 nodesToAddToChain.append(curr->node()); | 5336 nodesToAddToChain.append(curr->node()); |
5337 } | 5337 } |
5338 | 5338 |
5339 // mouseenter and mouseleave events do not bubble, so they are dispatched if
f there is a capturing | 5339 // mouseenter and mouseleave events do not bubble, so they are dispatched if
f there is a capturing |
5340 // event handler on an ancestor or a normal event handler on the element its
elf. This special | 5340 // event handler on an ancestor or a normal event handler on the element its
elf. This special |
5341 // handling is necessary to avoid O(n^2) capturing event handler checks. We'
ll check the previously | 5341 // handling is necessary to avoid O(n^2) capturing event handler checks. We'
ll check the previously |
5342 // hovered node's ancestor tree for 'mouseleave' handlers here, then check t
he newly hovered node's | 5342 // hovered node's ancestor tree for 'mouseleave' handlers here, then check t
he newly hovered node's |
5343 // ancestor tree for 'mouseenter' handlers after dispatching the 'mouseleave
' events (as the handler | 5343 // ancestor tree for 'mouseenter' handlers after dispatching the 'mouseleave
' events (as the handler |
5344 // for 'mouseleave' might set a capturing 'mouseenter' handler, odd as that
might be). | 5344 // for 'mouseleave' might set a capturing 'mouseenter' handler, odd as that
might be). |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5772 #ifndef NDEBUG | 5772 #ifndef NDEBUG |
5773 using namespace blink; | 5773 using namespace blink; |
5774 void showLiveDocumentInstances() | 5774 void showLiveDocumentInstances() |
5775 { | 5775 { |
5776 WeakDocumentSet& set = liveDocumentSet(); | 5776 WeakDocumentSet& set = liveDocumentSet(); |
5777 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); | 5777 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); |
5778 for (Document* document : set) | 5778 for (Document* document : set) |
5779 fprintf(stderr, "- Document %p URL: %s\n", document, document->url().str
ing().utf8().data()); | 5779 fprintf(stderr, "- Document %p URL: %s\n", document, document->url().str
ing().utf8().data()); |
5780 } | 5780 } |
5781 #endif | 5781 #endif |
OLD | NEW |