OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
3 * Copyright (C) 2008, 2009, 2010, 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2008, 2009, 2010, 2011 Google Inc. All rights reserved. |
4 * Copyright (C) 2011 Igalia S.L. | 4 * Copyright (C) 2011 Igalia S.L. |
5 * Copyright (C) 2011 Motorola Mobility. All rights reserved. | 5 * Copyright (C) 2011 Motorola Mobility. 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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 #include "core/dom/Range.h" | 46 #include "core/dom/Range.h" |
47 #include "core/editing/Editor.h" | 47 #include "core/editing/Editor.h" |
48 #include "core/editing/MarkupAccumulator.h" | 48 #include "core/editing/MarkupAccumulator.h" |
49 #include "core/editing/TextIterator.h" | 49 #include "core/editing/TextIterator.h" |
50 #include "core/editing/VisibleSelection.h" | 50 #include "core/editing/VisibleSelection.h" |
51 #include "core/editing/VisibleUnits.h" | 51 #include "core/editing/VisibleUnits.h" |
52 #include "core/editing/htmlediting.h" | 52 #include "core/editing/htmlediting.h" |
53 #include "core/frame/LocalFrame.h" | 53 #include "core/frame/LocalFrame.h" |
54 #include "core/html/HTMLBodyElement.h" | 54 #include "core/html/HTMLBodyElement.h" |
55 #include "core/html/HTMLElement.h" | 55 #include "core/html/HTMLElement.h" |
| 56 #include "core/html/HTMLSpanElement.h" |
56 #include "core/html/HTMLTableCellElement.h" | 57 #include "core/html/HTMLTableCellElement.h" |
57 #include "core/html/HTMLTextFormControlElement.h" | 58 #include "core/html/HTMLTextFormControlElement.h" |
58 #include "core/rendering/RenderObject.h" | 59 #include "core/rendering/RenderObject.h" |
59 #include "platform/weborigin/KURL.h" | 60 #include "platform/weborigin/KURL.h" |
60 #include "wtf/StdLibExtras.h" | 61 #include "wtf/StdLibExtras.h" |
61 #include "wtf/text/StringBuilder.h" | 62 #include "wtf/text/StringBuilder.h" |
62 | 63 |
63 namespace blink { | 64 namespace blink { |
64 | 65 |
65 using namespace HTMLNames; | 66 using namespace HTMLNames; |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 wrappingStyle->forceInline(); | 232 wrappingStyle->forceInline(); |
232 // FIXME: Should this be included in forceInline? | 233 // FIXME: Should this be included in forceInline? |
233 wrappingStyle->style()->setProperty(CSSPropertyFloat, CSSValueNone); | 234 wrappingStyle->style()->setProperty(CSSPropertyFloat, CSSValueNone); |
234 | 235 |
235 appendStyleNodeOpenTag(out, wrappingStyle->style(), text.document()); | 236 appendStyleNodeOpenTag(out, wrappingStyle->style(), text.document()); |
236 } | 237 } |
237 | 238 |
238 if (!shouldAnnotate() || parentIsTextarea) | 239 if (!shouldAnnotate() || parentIsTextarea) |
239 MarkupAccumulator::appendText(out, text); | 240 MarkupAccumulator::appendText(out, text); |
240 else { | 241 else { |
241 const bool useRenderedText = !enclosingNodeWithTag(firstPositionInNode(&
text), selectTag); | 242 const bool useRenderedText = !enclosingElementWithTag(firstPositionInNod
e(&text), selectTag); |
242 String content = useRenderedText ? renderedText(text, m_range) : stringV
alueForRange(text, m_range); | 243 String content = useRenderedText ? renderedText(text, m_range) : stringV
alueForRange(text, m_range); |
243 StringBuilder buffer; | 244 StringBuilder buffer; |
244 appendCharactersReplacingEntities(buffer, content, 0, content.length(),
EntityMaskInPCDATA); | 245 appendCharactersReplacingEntities(buffer, content, 0, content.length(),
EntityMaskInPCDATA); |
245 out.append(convertHTMLTextToInterchangeFormat(buffer.toString(), text)); | 246 out.append(convertHTMLTextToInterchangeFormat(buffer.toString(), text)); |
246 } | 247 } |
247 | 248 |
248 if (wrappingSpan) | 249 if (wrappingSpan) |
249 out.append(styleNodeCloseTag()); | 250 out.append(styleNodeCloseTag()); |
250 } | 251 } |
251 | 252 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 if (!n) | 374 if (!n) |
374 break; | 375 break; |
375 | 376 |
376 next = NodeTraversal::next(*n); | 377 next = NodeTraversal::next(*n); |
377 bool openedTag = false; | 378 bool openedTag = false; |
378 | 379 |
379 if (isBlock(n) && canHaveChildrenForEditing(n) && next == pastEnd) | 380 if (isBlock(n) && canHaveChildrenForEditing(n) && next == pastEnd) |
380 // Don't write out empty block containers that aren't fully selected
. | 381 // Don't write out empty block containers that aren't fully selected
. |
381 continue; | 382 continue; |
382 | 383 |
383 if (!n->renderer() && !enclosingNodeWithTag(firstPositionInOrBeforeNode(
n), selectTag) && m_shouldAnnotate != AnnotateForNavigationTransition) { | 384 if (!n->renderer() && !enclosingElementWithTag(firstPositionInOrBeforeNo
de(n), selectTag) && m_shouldAnnotate != AnnotateForNavigationTransition) { |
384 next = NodeTraversal::nextSkippingChildren(*n); | 385 next = NodeTraversal::nextSkippingChildren(*n); |
385 // Don't skip over pastEnd. | 386 // Don't skip over pastEnd. |
386 if (pastEnd && pastEnd->isDescendantOf(n)) | 387 if (pastEnd && pastEnd->isDescendantOf(n)) |
387 next = pastEnd; | 388 next = pastEnd; |
388 } else { | 389 } else { |
389 // Add the node to the markup if we're not skipping the descendants | 390 // Add the node to the markup if we're not skipping the descendants |
390 if (shouldEmit) | 391 if (shouldEmit) |
391 appendStartTag(*n); | 392 appendStartTag(*n); |
392 | 393 |
393 // If node has no children, close the tag now. | 394 // If node has no children, close the tag now. |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 if (newSpecialCommonAncestor) | 545 if (newSpecialCommonAncestor) |
545 specialCommonAncestor = newSpecialCommonAncestor; | 546 specialCommonAncestor = newSpecialCommonAncestor; |
546 } | 547 } |
547 | 548 |
548 // If a single tab is selected, commonAncestor will be a text node inside a
tab span. | 549 // If a single tab is selected, commonAncestor will be a text node inside a
tab span. |
549 // If two or more tabs are selected, commonAncestor will be the tab span. | 550 // If two or more tabs are selected, commonAncestor will be the tab span. |
550 // In either case, if there is a specialCommonAncestor already, it will nece
ssarily be above | 551 // In either case, if there is a specialCommonAncestor already, it will nece
ssarily be above |
551 // any tab span that needs to be included. | 552 // any tab span that needs to be included. |
552 if (!specialCommonAncestor && isTabSpanTextNode(commonAncestor)) | 553 if (!specialCommonAncestor && isTabSpanTextNode(commonAncestor)) |
553 specialCommonAncestor = commonAncestor->parentNode(); | 554 specialCommonAncestor = commonAncestor->parentNode(); |
554 if (!specialCommonAncestor && isTabSpanNode(commonAncestor)) | 555 if (!specialCommonAncestor && isTabSpanElement(commonAncestor)) |
555 specialCommonAncestor = commonAncestor; | 556 specialCommonAncestor = commonAncestor; |
556 | 557 |
557 if (Node *enclosingAnchor = enclosingNodeWithTag(firstPositionInNode(special
CommonAncestor ? specialCommonAncestor : commonAncestor), aTag)) | 558 if (Element* enclosingAnchor = enclosingElementWithTag(firstPositionInNode(s
pecialCommonAncestor ? specialCommonAncestor : commonAncestor), aTag)) |
558 specialCommonAncestor = enclosingAnchor; | 559 specialCommonAncestor = enclosingAnchor; |
559 | 560 |
560 return specialCommonAncestor; | 561 return specialCommonAncestor; |
561 } | 562 } |
562 | 563 |
563 // FIXME: Shouldn't we omit style info when annotate == DoNotAnnotateForIntercha
nge? | 564 // FIXME: Shouldn't we omit style info when annotate == DoNotAnnotateForIntercha
nge? |
564 // FIXME: At least, annotation and style info should probably not be included in
range.markupString() | 565 // FIXME: At least, annotation and style info should probably not be included in
range.markupString() |
565 static String createMarkupInternal(Document& document, const Range* range, const
Range* updatedRange, WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes, | 566 static String createMarkupInternal(Document& document, const Range* range, const
Range* updatedRange, WillBeHeapVector<RawPtrWillBeMember<Node> >* nodes, |
566 EAnnotateForInterchange shouldAnnotate, bool convertBlocksToInlines, EAbsolu
teURLs shouldResolveURLs, Node* constrainingAncestor) | 567 EAnnotateForInterchange shouldAnnotate, bool convertBlocksToInlines, EAbsolu
teURLs shouldResolveURLs, Node* constrainingAncestor) |
567 { | 568 { |
568 ASSERT(range); | 569 ASSERT(range); |
569 ASSERT(updatedRange); | 570 ASSERT(updatedRange); |
570 DEFINE_STATIC_LOCAL(const String, interchangeNewlineString, ("<br class=\""
AppleInterchangeNewline "\">")); | 571 DEFINE_STATIC_LOCAL(const String, interchangeNewlineString, ("<br class=\""
AppleInterchangeNewline "\">")); |
571 | 572 |
572 bool collapsed = updatedRange->collapsed(); | 573 bool collapsed = updatedRange->collapsed(); |
573 if (collapsed) | 574 if (collapsed) |
574 return emptyString(); | 575 return emptyString(); |
575 Node* commonAncestor = updatedRange->commonAncestorContainer(); | 576 Node* commonAncestor = updatedRange->commonAncestorContainer(); |
576 if (!commonAncestor) | 577 if (!commonAncestor) |
577 return emptyString(); | 578 return emptyString(); |
578 | 579 |
579 document.updateLayoutIgnorePendingStylesheets(); | 580 document.updateLayoutIgnorePendingStylesheets(); |
580 | 581 |
581 Node* body = enclosingNodeWithTag(firstPositionInNode(commonAncestor), bodyT
ag); | 582 Element* body = enclosingElementWithTag(firstPositionInNode(commonAncestor),
bodyTag); |
582 Node* fullySelectedRoot = 0; | 583 Node* fullySelectedRoot = 0; |
583 // FIXME: Do this for all fully selected blocks, not just the body. | 584 // FIXME: Do this for all fully selected blocks, not just the body. |
584 if (body && areRangesEqual(VisibleSelection::selectionFromContentsOfNode(bod
y).toNormalizedRange().get(), range)) | 585 if (body && areRangesEqual(VisibleSelection::selectionFromContentsOfNode(bod
y).toNormalizedRange().get(), range)) |
585 fullySelectedRoot = body; | 586 fullySelectedRoot = body; |
586 Node* specialCommonAncestor = highestAncestorToWrapMarkup(updatedRange, shou
ldAnnotate, constrainingAncestor); | 587 Node* specialCommonAncestor = highestAncestorToWrapMarkup(updatedRange, shou
ldAnnotate, constrainingAncestor); |
587 StyledMarkupAccumulator accumulator(nodes, shouldResolveURLs, shouldAnnotate
, updatedRange, specialCommonAncestor); | 588 StyledMarkupAccumulator accumulator(nodes, shouldResolveURLs, shouldAnnotate
, updatedRange, specialCommonAncestor); |
588 Node* pastEnd = updatedRange->pastLastNode(); | 589 Node* pastEnd = updatedRange->pastLastNode(); |
589 | 590 |
590 Node* startNode = updatedRange->firstNode(); | 591 Node* startNode = updatedRange->firstNode(); |
591 VisiblePosition visibleStart(updatedRange->startPosition(), VP_DEFAULT_AFFIN
ITY); | 592 VisiblePosition visibleStart(updatedRange->startPosition(), VP_DEFAULT_AFFIN
ITY); |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1110 node->document().updateLayoutIgnorePendingStylesheets(); | 1111 node->document().updateLayoutIgnorePendingStylesheets(); |
1111 | 1112 |
1112 StyledMarkupAccumulator accumulator(0, ResolveAllURLs, AnnotateForNavigation
Transition, nullptr, 0); | 1113 StyledMarkupAccumulator accumulator(0, ResolveAllURLs, AnnotateForNavigation
Transition, nullptr, 0); |
1113 accumulator.serializeNodes(node, NodeTraversal::nextSkippingChildren(*node))
; | 1114 accumulator.serializeNodes(node, NodeTraversal::nextSkippingChildren(*node))
; |
1114 | 1115 |
1115 static const char* documentMarkup = "<!DOCTYPE html><meta name=\"viewport\"
content=\"width=device-width, user-scalable=0\">"; | 1116 static const char* documentMarkup = "<!DOCTYPE html><meta name=\"viewport\"
content=\"width=device-width, user-scalable=0\">"; |
1116 return documentMarkup + accumulator.takeResults(); | 1117 return documentMarkup + accumulator.takeResults(); |
1117 } | 1118 } |
1118 | 1119 |
1119 } | 1120 } |
OLD | NEW |