- Revision
- 228482
- Author
- rn...@webkit.org
- Date
- 2018-02-14 13:07:38 -0800 (Wed, 14 Feb 2018)
Log Message
REGRESSION (r223440): Copying & pasting a list from Microsoft Word to TinyMCE fails
https://bugs.webkit.org/show_bug.cgi?id=182564
Reviewed by Wenson Hsieh.
Source/WebCore:
Unfortunately, r228352 was inadaquate to fix copying & pasting of a list item from Microsoft Word into TinyMCE
in older verions of TinyMCE. This patch amends the approach taken by r228352 to make it work across the board
as well as unbreak GMail.
Turns out older versions of TinyMCE can't handle list items when computed styles are added as inline style
declarations by WebKit. To make this work, avoid adding any computed styles as inline styles within mso-list
conditionals as well as any p elements whose style attribute contains "mso-list" property. We would instead
preserve these styles by keeping Microsoft Word's CSS style rules in addition to special @list rules.
In addition, not keeping the style element of Microsoft Word in a head element as done in r228352 causes some
versions of TinyMCE to treat it as regular text, and inserting a bunch of @list rules as user visible text.
To work around this problem, we serialize the style rules as a comment (<!-- ~ -->) within a head element.
Furthermore, when Microsoft Word is in the compatibility mode, it does not generate xmlns:o as the first xmlns
declaration. Generalized the code to detect Microsoft Word's HTML declaration by looking for xmlns:o and xmlns:w
xmls declarations.
Finally, it turns out that Gmail has its own handling of list items copy & pasted from Microsoft Word, and also
needs this quirks but in the pasted HTML, not the one exposed in getData. As such, this patch also enables the
MSO list quirks in the pasted content as well as the one exposed in getData.
Tests: PasteHTML.PreservesMSOList
PasteHTML.PreservesMSOListInCompatibilityMode
PasteHTML.StripsMSOListWhenMissingMSOHTMLElement
PasteWebArchive.PreservesMSOList
PasteWebArchive.PreservesMSOListInCompatibilityMode
PasteWebArchive.StripsMSOListWhenMissingMSOHTMLElement
* editing/HTMLInterchange.h:
* editing/ReplaceSelectionCommand.cpp:
(WebCore::removeHeadContents): Don't remove the special style element needed for the MSO list quirks since we
don't keep the computed style as inline styles in this case.
* editing/cocoa/WebContentReaderCocoa.mm:
(WebCore::WebContentReader::readWebArchive): Enable the quirks in the pasted content as well as opposed to
just in DataTransfer API exposed to the _javascript_.
(WebCore::WebContentReader::readHTML): Ditto.
* editing/markup.cpp:
(WebCore::shouldPreserveMSOLists): Added. Generalized the logic to detect a Microsoft Word document.
more xmlns declarations.
(WebCore::StyledMarkupAccumulator::shouldPreserveMSOListStyleForElement): Added.
(WebCore::StyledMarkupAccumulator::appendElement): Don't generate the second style element here for elements
with most-list properties. Instead, avoid overriding inline styles with computed styles altogether.
(WebCore::StyledMarkupAccumulator::appendNodeToPreserveMSOList): Include the style rules as well as list rules
and wrap the "style" element in a "head" element to make it compatible with older versions of TinyMCE.
Tools:
Updated assertions to make sure the trailing "}" of @list rules is includd in the style, the "style" element
is wrapped by "head" element (not present in the pasted markup since the fragment parsing algorithm strips away),
and the style content is enclosed in "<!--" and "-->".
Also use execCommand('insertHTML', ~) to insert the HTML obtained via dataTransfer.getData instead of innerHTML
to make sure our pasting code preserves the special style element for MSO list quirks.
Finally, added two more test cases for pasting content from Microsoft Word's compatibility mode.
* TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
(TEST):
* TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm:
(TEST):
Modified Paths
Added Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (228481 => 228482)
--- trunk/Source/WebCore/ChangeLog 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Source/WebCore/ChangeLog 2018-02-14 21:07:38 UTC (rev 228482)
@@ -1,3 +1,55 @@
+2018-02-12 Ryosuke Niwa <rn...@webkit.org>
+
+ REGRESSION (r223440): Copying & pasting a list from Microsoft Word to TinyMCE fails
+ https://bugs.webkit.org/show_bug.cgi?id=182564
+
+ Reviewed by Wenson Hsieh.
+
+ Unfortunately, r228352 was inadaquate to fix copying & pasting of a list item from Microsoft Word into TinyMCE
+ in older verions of TinyMCE. This patch amends the approach taken by r228352 to make it work across the board
+ as well as unbreak GMail.
+
+ Turns out older versions of TinyMCE can't handle list items when computed styles are added as inline style
+ declarations by WebKit. To make this work, avoid adding any computed styles as inline styles within mso-list
+ conditionals as well as any p elements whose style attribute contains "mso-list" property. We would instead
+ preserve these styles by keeping Microsoft Word's CSS style rules in addition to special @list rules.
+
+ In addition, not keeping the style element of Microsoft Word in a head element as done in r228352 causes some
+ versions of TinyMCE to treat it as regular text, and inserting a bunch of @list rules as user visible text.
+ To work around this problem, we serialize the style rules as a comment (<!-- ~ -->) within a head element.
+
+ Furthermore, when Microsoft Word is in the compatibility mode, it does not generate xmlns:o as the first xmlns
+ declaration. Generalized the code to detect Microsoft Word's HTML declaration by looking for xmlns:o and xmlns:w
+ xmls declarations.
+
+ Finally, it turns out that Gmail has its own handling of list items copy & pasted from Microsoft Word, and also
+ needs this quirks but in the pasted HTML, not the one exposed in getData. As such, this patch also enables the
+ MSO list quirks in the pasted content as well as the one exposed in getData.
+
+ Tests: PasteHTML.PreservesMSOList
+ PasteHTML.PreservesMSOListInCompatibilityMode
+ PasteHTML.StripsMSOListWhenMissingMSOHTMLElement
+ PasteWebArchive.PreservesMSOList
+ PasteWebArchive.PreservesMSOListInCompatibilityMode
+ PasteWebArchive.StripsMSOListWhenMissingMSOHTMLElement
+
+ * editing/HTMLInterchange.h:
+ * editing/ReplaceSelectionCommand.cpp:
+ (WebCore::removeHeadContents): Don't remove the special style element needed for the MSO list quirks since we
+ don't keep the computed style as inline styles in this case.
+ * editing/cocoa/WebContentReaderCocoa.mm:
+ (WebCore::WebContentReader::readWebArchive): Enable the quirks in the pasted content as well as opposed to
+ just in DataTransfer API exposed to the _javascript_.
+ (WebCore::WebContentReader::readHTML): Ditto.
+ * editing/markup.cpp:
+ (WebCore::shouldPreserveMSOLists): Added. Generalized the logic to detect a Microsoft Word document.
+ more xmlns declarations.
+ (WebCore::StyledMarkupAccumulator::shouldPreserveMSOListStyleForElement): Added.
+ (WebCore::StyledMarkupAccumulator::appendElement): Don't generate the second style element here for elements
+ with most-list properties. Instead, avoid overriding inline styles with computed styles altogether.
+ (WebCore::StyledMarkupAccumulator::appendNodeToPreserveMSOList): Include the style rules as well as list rules
+ and wrap the "style" element in a "head" element to make it compatible with older versions of TinyMCE.
+
2018-02-14 Dean Jackson <d...@apple.com>
CrashTracer: com.apple.WebKit.WebContent at com.apple.WebCore: WebCore::HTMLPlugInImageElement::didAddUserAgentShadowRoot + 618
Modified: trunk/Source/WebCore/editing/HTMLInterchange.h (228481 => 228482)
--- trunk/Source/WebCore/editing/HTMLInterchange.h 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Source/WebCore/editing/HTMLInterchange.h 2018-02-14 21:07:38 UTC (rev 228482)
@@ -36,6 +36,7 @@
#define ApplePasteAsQuotation "Apple-paste-as-quotation"
#define AppleStyleSpanClass "Apple-style-span"
#define AppleTabSpanClass "Apple-tab-span"
+#define WebKitMSOListQuirksStyle "WebKit-mso-list-quirks-style"
enum EAnnotateForInterchange { DoNotAnnotateForInterchange, AnnotateForInterchange };
Modified: trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp (228481 => 228482)
--- trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp 2018-02-14 21:07:38 UTC (rev 228482)
@@ -728,7 +728,8 @@
auto it = descendantsOfType<Element>(*fragment.fragment()).begin();
auto end = descendantsOfType<Element>(*fragment.fragment()).end();
while (it != end) {
- if (is<HTMLBaseElement>(*it) || is<HTMLLinkElement>(*it) || is<HTMLMetaElement>(*it) || is<HTMLStyleElement>(*it) || is<HTMLTitleElement>(*it)) {
+ if (is<HTMLBaseElement>(*it) || is<HTMLLinkElement>(*it) || is<HTMLMetaElement>(*it) || is<HTMLTitleElement>(*it)
+ || (is<HTMLStyleElement>(*it) && it->getAttribute(classAttr) != WebKitMSOListQuirksStyle)) {
toRemove.append(&*it);
it.traverseNextSkippingChildren();
continue;
Modified: trunk/Source/WebCore/editing/cocoa/WebContentReaderCocoa.mm (228481 => 228482)
--- trunk/Source/WebCore/editing/cocoa/WebContentReaderCocoa.mm 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Source/WebCore/editing/cocoa/WebContentReaderCocoa.mm 2018-02-14 21:07:38 UTC (rev 228482)
@@ -457,7 +457,7 @@
return true;
}
- String sanitizedMarkup = sanitizeMarkupWithArchive(*frame.document(), *result, MSOListQuirks::Disabled, [&] (const String& type) {
+ String sanitizedMarkup = sanitizeMarkupWithArchive(*frame.document(), *result, msoListQuirksForMarkup(), [&] (const String& type) {
return frame.loader().client().canShowMIMETypeAsHTML(type);
});
fragment = createFragmentFromMarkup(*frame.document(), sanitizedMarkup, blankURL(), DisallowScriptingAndPluginContent);
@@ -518,7 +518,7 @@
String markup;
if (RuntimeEnabledFeatures::sharedFeatures().customPasteboardDataEnabled() && shouldSanitize()) {
- markup = sanitizeMarkup(stringOmittingMicrosoftPrefix, MSOListQuirks::Disabled, WTF::Function<void (DocumentFragment&)> { [] (DocumentFragment& fragment) {
+ markup = sanitizeMarkup(stringOmittingMicrosoftPrefix, msoListQuirksForMarkup(), WTF::Function<void (DocumentFragment&)> { [] (DocumentFragment& fragment) {
removeSubresourceURLAttributes(fragment, [] (const URL& url) {
return shouldReplaceSubresourceURL(url);
});
Modified: trunk/Source/WebCore/editing/markup.cpp (228481 => 228482)
--- trunk/Source/WebCore/editing/markup.cpp 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Source/WebCore/editing/markup.cpp 2018-02-14 21:07:38 UTC (rev 228482)
@@ -236,6 +236,8 @@
String renderedText(const Node&, const Range*);
String stringValueForRange(const Node&, const Range*);
+ bool shouldPreserveMSOListStyleForElement(const Element&);
+
void appendElement(StringBuilder& out, const Element&, bool addDisplayInline, RangeFullySelectsNode);
void appendCustomAttributes(StringBuilder&, const Element&, Namespaces*) override;
@@ -421,6 +423,11 @@
#endif
}
+bool StyledMarkupAccumulator::shouldPreserveMSOListStyleForElement(const Element& element)
+{
+ return m_inMSOList || (m_shouldPreserveMSOList && element.hasTagName(pTag) && element.getAttribute(styleAttr).contains(";mso-list:"));
+}
+
void StyledMarkupAccumulator::appendElement(StringBuilder& out, const Element& element, bool addDisplayInline, RangeFullySelectsNode rangeFullySelectsNode)
{
const bool documentIsHTML = element.document().isHTMLDocument();
@@ -429,16 +436,12 @@
appendCustomAttributes(out, element, nullptr);
const bool shouldAnnotateOrForceInline = element.isHTMLElement() && (shouldAnnotate() || addDisplayInline);
- const bool shouldOverrideStyleAttr = shouldAnnotateOrForceInline || shouldApplyWrappingStyle(element);
- bool containsMSOList = false;
+ bool shouldOverrideStyleAttr = (shouldAnnotateOrForceInline || shouldApplyWrappingStyle(element)) && !shouldPreserveMSOListStyleForElement(element);
if (element.hasAttributes()) {
for (const Attribute& attribute : element.attributesIterator()) {
// We'll handle the style attribute separately, below.
- if (attribute.name() == styleAttr && shouldOverrideStyleAttr) {
- if (m_shouldPreserveMSOList && attribute.value().contains(";mso-list:"))
- containsMSOList = true;
+ if (attribute.name() == styleAttr && shouldOverrideStyleAttr)
continue;
- }
if (element.isEventHandlerAttribute(attribute) || element.isJavaScriptURLAttribute(attribute))
continue;
appendAttribute(out, element, attribute, 0);
@@ -481,16 +484,6 @@
appendAttributeValue(out, newInlineStyle->style()->asText(), documentIsHTML);
out.append('\"');
}
-
- if (containsMSOList) {
- ASSERT(m_shouldPreserveMSOList);
- // Unfortunately, TinyMCE doesn't recognize mso-list inline style if the style attribute contains properties.
- // Generate a separate, second style attribute if newInlineStyle is not empty above.
- // The inline style is preserved because the first attribute always wins but TinyMCE can still recognize the list.
- out.appendLiteral(" style=\"");
- appendAttributeValue(out, element.getAttribute(styleAttr), documentIsHTML);
- out.append('\"');
- }
}
appendCloseTag(out, element);
@@ -615,18 +608,21 @@
auto& textChild = downcast<Text>(*firstChild);
auto& styleContent = textChild.data();
+ const auto msoStyleDefinitionsStart = styleContent.find("/* Style Definitions */");
const auto msoListDefinitionsStart = styleContent.find("/* List Definitions */");
const auto lastListItem = styleContent.reverseFind("\n@list");
if (msoListDefinitionsStart == notFound || lastListItem == notFound)
return false;
+ const auto start = msoStyleDefinitionsStart != notFound && msoStyleDefinitionsStart < msoListDefinitionsStart ? msoStyleDefinitionsStart : msoListDefinitionsStart;
const auto msoListDefinitionsEnd = styleContent.find(";}\n", lastListItem);
- if (msoListDefinitionsEnd == notFound || msoListDefinitionsStart >= msoListDefinitionsEnd)
+ if (msoListDefinitionsEnd == notFound || start >= msoListDefinitionsEnd)
return false;
- appendStartTag(node);
- appendTextSubstring(textChild, msoListDefinitionsStart, msoListDefinitionsEnd - msoListDefinitionsStart + 1);
- appendEndTag(node);
+ appendString("<head><style class=\"" WebKitMSOListQuirksStyle "\">\n<!--\n");
+ appendTextSubstring(textChild, start, msoListDefinitionsEnd - start + 3);
+ appendString("\n-->\n</style></head>");
+
return true;
}
return false;
@@ -839,11 +835,22 @@
return createMarkupInternal(range.ownerDocument(), range, nodes, shouldAnnotate, convertBlocksToInlines, shouldResolveURLs, MSOListMode::DoNotPreserve);
}
+static bool shouldPreserveMSOLists(const String& markup)
+{
+ if (!markup.startsWith("<html xmlns:"))
+ return false;
+ auto tagClose = markup.find('>');
+ if (tagClose == notFound)
+ return false;
+ auto htmlTag = markup.substring(0, tagClose);
+ return htmlTag.contains("xmlns:o=\"urn:schemas-microsoft-com:office:office\"")
+ && htmlTag.contains("xmlns:w=\"urn:schemas-microsoft-com:office:word\"");
+}
+
String sanitizedMarkupForFragmentInDocument(Ref<DocumentFragment>&& fragment, Document& document, MSOListQuirks msoListQuirks, const String& originalMarkup)
{
- MSOListMode msoListMode = MSOListMode::DoNotPreserve;
- if (msoListQuirks == MSOListQuirks::CheckIfNeeded && originalMarkup.startsWith("<html xmlns:o=\"urn:schemas-microsoft-com:office:office\""))
- msoListMode = MSOListMode::Preserve;
+ MSOListMode msoListMode = msoListQuirks == MSOListQuirks::CheckIfNeeded && shouldPreserveMSOLists(originalMarkup)
+ ? MSOListMode::Preserve : MSOListMode::DoNotPreserve;
auto bodyElement = makeRefPtr(document.body());
ASSERT(bodyElement);
Modified: trunk/Tools/ChangeLog (228481 => 228482)
--- trunk/Tools/ChangeLog 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Tools/ChangeLog 2018-02-14 21:07:38 UTC (rev 228482)
@@ -1,3 +1,24 @@
+2018-02-12 Ryosuke Niwa <rn...@webkit.org>
+
+ REGRESSION (r223440): Copying & pasting a list from Microsoft Word to TinyMCE fails
+ https://bugs.webkit.org/show_bug.cgi?id=182564
+
+ Reviewed by Wenson Hsieh.
+
+ Updated assertions to make sure the trailing "}" of @list rules is includd in the style, the "style" element
+ is wrapped by "head" element (not present in the pasted markup since the fragment parsing algorithm strips away),
+ and the style content is enclosed in "<!--" and "-->".
+
+ Also use execCommand('insertHTML', ~) to insert the HTML obtained via dataTransfer.getData instead of innerHTML
+ to make sure our pasting code preserves the special style element for MSO list quirks.
+
+ Finally, added two more test cases for pasting content from Microsoft Word's compatibility mode.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm:
+ (TEST):
+ * TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm:
+ (TEST):
+
2018-02-14 Ross Kirsling <ross.kirsl...@sony.com>
[Tools] --wincairo should imply --64-bit by default.
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (228481 => 228482)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-02-14 21:07:38 UTC (rev 228482)
@@ -580,6 +580,7 @@
9B26FCCA159D16DE00CC3765 /* HTMLFormCollectionNamedItem.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */; };
9B270FEE1DDC2C0B002D53F3 /* closed-shadow-tree-test.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B270FED1DDC25FD002D53F3 /* closed-shadow-tree-test.html */; };
9B4F8FA7159D52DD002D9F94 /* HTMLCollectionNamedItem.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */; };
+ 9B59F12A2034086F009E63D5 /* mso-list-compat-mode.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B59F12920340854009E63D5 /* mso-list-compat-mode.html */; };
9B62630C1F8C25C8007EE29B /* copy-url.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B62630B1F8C2510007EE29B /* copy-url.html */; };
9B7A37C41F8AEBA5004AA228 /* CopyURL.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B7A37C21F8AEBA5004AA228 /* CopyURL.mm */; };
9B7D740F1F8378770006C432 /* paste-rtfd.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B7D740E1F8377E60006C432 /* paste-rtfd.html */; };
@@ -1022,6 +1023,7 @@
51CD1C721B38D48400142CA5 /* modal-alerts-in-new-about-blank-window.html in Copy Resources */,
7A1458FC1AD5C07000E06772 /* mouse-button-listener.html in Copy Resources */,
33E79E06137B5FD900E32D99 /* mouse-move-listener.html in Copy Resources */,
+ 9B59F12A2034086F009E63D5 /* mso-list-compat-mode.html in Copy Resources */,
9BF356CD202D458500F71160 /* mso-list.html in Copy Resources */,
5797FE331EB15AB100B2F4A0 /* navigation-client-default-crypto.html in Copy Resources */,
C99B675F1E39736F00FC6C80 /* no-autoplay-with-controls.html in Copy Resources */,
@@ -1604,6 +1606,7 @@
9B270FED1DDC25FD002D53F3 /* closed-shadow-tree-test.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "closed-shadow-tree-test.html"; sourceTree = "<group>"; };
9B4F8FA3159D52B1002D9F94 /* HTMLCollectionNamedItem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HTMLCollectionNamedItem.mm; sourceTree = "<group>"; };
9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = HTMLCollectionNamedItem.html; sourceTree = "<group>"; };
+ 9B59F12920340854009E63D5 /* mso-list-compat-mode.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "mso-list-compat-mode.html"; sourceTree = "<group>"; };
9B62630B1F8C2510007EE29B /* copy-url.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "copy-url.html"; sourceTree = "<group>"; };
9B79164F1BD89D0D00D50B8F /* FirstResponderScrollingPosition.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FirstResponderScrollingPosition.mm; sourceTree = "<group>"; };
9B7A37C21F8AEBA5004AA228 /* CopyURL.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CopyURL.mm; sourceTree = "<group>"; };
@@ -2453,6 +2456,7 @@
46C519E31D35629600DAA51A /* LocalStorageNullEntries.localstorage */,
46C519E41D35629600DAA51A /* LocalStorageNullEntries.localstorage-shm */,
7A6A2C711DCCFB0200C0D085 /* LocalStorageQuirkEnabled.html */,
+ 9B59F12920340854009E63D5 /* mso-list-compat-mode.html */,
9BF356CC202D44F200F71160 /* mso-list.html */,
93E2D2751ED7D51700FA76F6 /* offscreen-iframe-of-media-document.html */,
7CCB99221D3B44E7003922F6 /* open-multiple-external-url.html */,
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm (228481 => 228482)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteHTML.mm 2018-02-14 21:07:38 UTC (rev 228482)
@@ -170,32 +170,74 @@
[webView stringByEvaluatingJavaScript:@"window.pastedHTML = editor.innerHTML"];
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('}\\n\\n-->\\n</style>')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/Users/webkitten/Library/')"].boolValue);
+
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('<head><style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* List Definitions */')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('}\\n\\n-->\\n</style></head>')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[if !supportLists]')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[endif]')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/Users/webkitten/Library/')"].boolValue);
- [webView stringByEvaluatingJavaScript:@"editor.innerHTML = htmlInDataTransfer"];
+ [webView stringByEvaluatingJavaScript:@"editor.innerHTML = ''; editor.focus();"];
+ [webView stringByEvaluatingJavaScript:@"document.execCommand('insertHTML', false, htmlInDataTransfer);"];
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
}
+TEST(PasteHTML, PreservesMSOListInCompatibilityMode)
+{
+ writeHTMLToPasteboard([NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mso-list-compat-mode" ofType:@"html" inDirectory:@"TestWebKitAPI.resources"]
+ encoding:NSUTF8StringEncoding error:NULL]);
+
+ auto webView = createWebViewWithCustomPasteboardDataSetting(true);
+ [webView synchronouslyLoadTestPageNamed:@"paste-rtfd"];
+ [webView paste:nil];
+
+ EXPECT_WK_STREQ("[\"text/html\"]", [webView stringByEvaluatingJavaScript:@"JSON.stringify(clipboardData.types)"]);
+ [webView stringByEvaluatingJavaScript:@"window.htmlInDataTransfer = clipboardData.values[0]"];
+ [webView stringByEvaluatingJavaScript:@"window.pastedHTML = editor.innerHTML"];
+
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('}\\n\\n-->\\n</style>')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<p style=\"margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/Users/webkitten/Library/')"].boolValue);
+
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('<head><style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* List Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('}\\n\\n-->\\n</style></head>')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[if !supportLists]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[endif]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<p style=\"margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/Users/webkitten/Library/')"].boolValue);
+}
+
TEST(PasteHTML, StripsMSOListWhenMissingMSOHTMLElement)
{
auto *markup = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mso-list" ofType:@"html" inDirectory:@"TestWebKitAPI.resources"] encoding:NSUTF8StringEncoding error:NULL];
@@ -211,26 +253,33 @@
[webView stringByEvaluatingJavaScript:@"window.pastedHTML = editor.innerHTML"];
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('}\\n\\n-->\\n</style>')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/Users/webkitten/Library/')"].boolValue);
+
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('<head><style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* List Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('@list l0:level1')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('}\\n\\n-->\\n</style></head>')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[if !supportLists]')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[endif]')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/Users/webkitten/Library/')"].boolValue);
- [webView stringByEvaluatingJavaScript:@"editor.innerHTML = htmlInDataTransfer"];
+ [webView stringByEvaluatingJavaScript:@"editor.innerHTML = ''; editor.focus();"];
+ [webView stringByEvaluatingJavaScript:@"document.execCommand('insertHTML', false, htmlInDataTransfer);"];
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm (228481 => 228482)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm 2018-02-14 20:37:11 UTC (rev 228481)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm 2018-02-14 21:07:38 UTC (rev 228482)
@@ -120,31 +120,77 @@
[webView stringByEvaluatingJavaScript:@"window.pastedHTML = editor.innerHTML"];
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('}\\n\\n-->\\n</style>')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/Users/webkitten/Library/')"].boolValue);
+
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('<head><style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* List Definitions */')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('}\\n\\n-->\\n</style></head>')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[if !supportLists]')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[endif]')"].boolValue);
EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/Users/webkitten/Library/')"].boolValue);
- [webView stringByEvaluatingJavaScript:@"editor.innerHTML = htmlInDataTransfer"];
+ [webView stringByEvaluatingJavaScript:@"editor.innerHTML = ''; editor.focus();"];
+ [webView stringByEvaluatingJavaScript:@"document.execCommand('insertHTML', false, htmlInDataTransfer);"];
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
+}
+TEST(PasteWebArchive, PreservesMSOListInCompatibilityMode)
+{
+ auto *url = "" URLWithString:@"file:///some-file.html"];
+ auto *markup = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mso-list-compat-mode" ofType:@"html" inDirectory:@"TestWebKitAPI.resources"]];
+ auto mainResource = adoptNS([[WebResource alloc] initWithData:markup URL:url MIMEType:@"text/html" textEncodingName:@"utf-8" frameName:nil]);
+ auto archive = adoptNS([[WebArchive alloc] initWithMainResource:mainResource.get() subresources:nil subframeArchives:nil]);
+
+ [[NSPasteboard generalPasteboard] declareTypes:@[WebArchivePboardType] owner:nil];
+ [[NSPasteboard generalPasteboard] setData:[archive data] forType:WebArchivePboardType];
+
+ auto webView = createWebViewWithCustomPasteboardDataEnabled();
+ [webView synchronouslyLoadTestPageNamed:@"paste-rtfd"];
+ [webView paste:nil];
+
+ EXPECT_WK_STREQ("[\"text/html\"]", [webView stringByEvaluatingJavaScript:@"JSON.stringify(clipboardData.types)"]);
+ [webView stringByEvaluatingJavaScript:@"window.htmlInDataTransfer = clipboardData.values[0]"];
+ [webView stringByEvaluatingJavaScript:@"window.pastedHTML = editor.innerHTML"];
+
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/* List Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('}\\n\\n-->\\n</style>')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[if !supportLists]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('[endif]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<p style=\"margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('/Users/webkitten/Library/')"].boolValue);
+
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('<head><style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* List Definitions */')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('@list l0:level1')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('}\\n\\n-->\\n</style></head>')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[if !supportLists]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[endif]')"].boolValue);
+ EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"pastedHTML.includes('<p style=\"margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/Users/webkitten/Library/')"].boolValue);
}
static NSData *msoListMarkupWithoutProperHTMLElement()
@@ -177,15 +223,18 @@
EXPECT_WK_STREQ("[\"text/html\"]", [webView stringByEvaluatingJavaScript:@"JSON.stringify(clipboardData.types)"]);
[webView stringByEvaluatingJavaScript:@"window.htmlInDataTransfer = clipboardData.values[0]"];
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.startsWith('<html xmlns:o=\"urn:schemas-microsoft-com:office:office\"')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('<head><style class=\"WebKit-mso-list-quirks-style\">\\n<!--\\n')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* List Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('@list l0:level1')"].boolValue);
+ EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('}\\n\\n-->\\n</style></head>')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[if !supportLists]')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('[endif]')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes(' style=\"text-indent:-.25in;mso-list:l0 level1 lfo1\">')"].boolValue);
- EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/* Style Definitions */')"].boolValue);
EXPECT_FALSE([webView stringByEvaluatingJavaScript:@"htmlInDataTransfer.includes('/Users/webkitten/Library/')"].boolValue);
- [webView stringByEvaluatingJavaScript:@"editor.innerHTML = htmlInDataTransfer"];
+ [webView stringByEvaluatingJavaScript:@"editor.innerHTML = ''; editor.focus();"];
+ [webView stringByEvaluatingJavaScript:@"document.execCommand('insertHTML', false, htmlInDataTransfer);"];
[webView stringByEvaluatingJavaScript:@"getSelection().setPosition(document.querySelector('.MsoListParagraphCxSpLast'));"];
[webView stringByEvaluatingJavaScript:@"getSelection().modify('move', 'forward', 'lineboundary');"];
EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"document.queryCommandValue('foreColor')"]);
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/mso-list-compat-mode.html (0 => 228482)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/mso-list-compat-mode.html (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/mso-list-compat-mode.html 2018-02-14 21:07:38 UTC (rev 228482)
@@ -0,0 +1,836 @@
+<html xmlns:v="urn:schemas-microsoft-com:vml"
+xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=utf-8">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 15">
+<meta name=Originator content="Microsoft Word 15">
+<link rel=File-List
+href=""
+<!--[if gte mso 9]><xml>
+ <o:OfficeDocumentSettings>
+ <o:TargetScreenSize>800x600</o:TargetScreenSize>
+ </o:OfficeDocumentSettings>
+</xml><![endif]-->
+<link rel=themeData
+href=""
+<link rel=colorSchemeMapping
+href=""
+<!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:View>Normal</w:View>
+ <w:Zoom>0</w:Zoom>
+ <w:TrackMoves/>
+ <w:TrackFormatting/>
+ <w:PunctuationKerning/>
+ <w:ValidateAgainstSchemas/>
+ <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
+ <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
+ <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
+ <w:DoNotPromoteQF/>
+ <w:LidThemeOther>EN-US</w:LidThemeOther>
+ <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
+ <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
+ <w:Compatibility>
+ <w:BreakWrappedTables/>
+ <w:SnapToGridInCell/>
+ <w:WrapTextWithPunct/>
+ <w:UseAsianBreakRules/>
+ <w:DontGrowAutofit/>
+ <w:SplitPgBreakAndParaMark/>
+ <w:EnableOpenTypeKerning/>
+ <w:DontFlipMirrorIndents/>
+ <w:OverrideTableStyleHps/>
+ </w:Compatibility>
+ <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
+ <m:mathPr>
+ <m:mathFont m:val="Cambria Math"/>
+ <m:brkBin m:val="before"/>
+ <m:brkBinSub m:val="--"/>
+ <m:smallFrac m:val="off"/>
+ <m:dispDef/>
+ <m:lMargin m:val="0"/>
+ <m:rMargin m:val="0"/>
+ <m:defJc m:val="centerGroup"/>
+ <m:wrapIndent m:val="1440"/>
+ <m:intLim m:val="subSup"/>
+ <m:naryLim m:val="undOvr"/>
+ </m:mathPr></w:WordDocument>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
+ DefSemiHidden="false" DefQFormat="false" DefPriority="99"
+ LatentStyleCount="375">
+ <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
+ <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
+ <w:LsdException Locked="false" Priority="0" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
+ <w:LsdException Locked="false" Priority="9" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 6"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 7"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 8"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index 9"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 1"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 2"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 3"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 4"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 5"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 6"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 7"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 8"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" Name="toc 9"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Normal Indent"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="footnote text"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="annotation text"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="header"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="footer"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="index heading"/>
+ <w:LsdException Locked="false" Priority="35" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="caption"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="table of figures"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="envelope address"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="envelope return"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="footnote reference"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="annotation reference"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="line number"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="page number"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="endnote reference"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="endnote text"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="table of authorities"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="macro"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="toa heading"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Bullet"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Number"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Bullet 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Bullet 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Bullet 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Bullet 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Number 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Number 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Number 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Number 5"/>
+ <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Closing"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Signature"/>
+ <w:LsdException Locked="false" Priority="0" SemiHidden="true"
+ UnhideWhenUsed="true" Name="Default Paragraph Font"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text Indent"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Continue"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Continue 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Continue 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Continue 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="List Continue 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Message Header"/>
+ <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Salutation"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Date"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text First Indent"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text First Indent 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Note Heading"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text Indent 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Body Text Indent 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Block Text"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Hyperlink"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="FollowedHyperlink"/>
+ <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
+ <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Document Map"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Plain Text"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="E-mail Signature"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Top of Form"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Bottom of Form"/>
+ <w:LsdException Locked="false" Priority="0" SemiHidden="true"
+ UnhideWhenUsed="true" Name="Normal (Web)"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Acronym"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Address"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Cite"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Code"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Definition"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Keyboard"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Preformatted"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Sample"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Typewriter"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="HTML Variable"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Normal Table"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="annotation subject"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="No List"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Outline List 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Outline List 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Outline List 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Simple 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Simple 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Simple 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Classic 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Classic 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Classic 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Classic 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Colorful 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Colorful 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Colorful 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Columns 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Columns 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Columns 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Columns 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Columns 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 6"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 7"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Grid 8"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 4"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 5"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 6"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 7"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table List 8"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table 3D effects 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table 3D effects 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table 3D effects 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Contemporary"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Elegant"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Professional"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Subtle 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Subtle 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Web 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Web 2"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Web 3"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Balloon Text"/>
+ <w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Table Theme"/>
+ <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
+ <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
+ <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
+ <w:LsdException Locked="false" Priority="34" QFormat="true"
+ Name="List Paragraph"/>
+ <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
+ <w:LsdException Locked="false" Priority="30" QFormat="true"
+ Name="Intense Quote"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
+ <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
+ <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
+ <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
+ <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
+ <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
+ <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
+ <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
+ <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
+ <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
+ <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
+ <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
+ <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
+ <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
+ <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
+ <w:LsdException Locked="false" Priority="19" QFormat="true"
+ Name="Subtle Emphasis"/>
+ <w:LsdException Locked="false" Priority="21" QFormat="true"
+ Name="Intense Emphasis"/>
+ <w:LsdException Locked="false" Priority="31" QFormat="true"
+ Name="Subtle Reference"/>
+ <w:LsdException Locked="false" Priority="32" QFormat="true"
+ Name="Intense Reference"/>
+ <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
+ <w:LsdException Locked="false" Priority="37" SemiHidden="true"
+ UnhideWhenUsed="true" Name="Bibliography"/>
+ <w:LsdException Locked="false" Priority="39" SemiHidden="true"
+ UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
+ <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
+ <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
+ <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
+ <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
+ <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
+ <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
+ <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
+ <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
+ <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="Grid Table 1 Light Accent 1"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="Grid Table 6 Colorful Accent 1"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="Grid Table 7 Colorful Accent 1"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="Grid Table 1 Light Accent 2"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="Grid Table 6 Colorful Accent 2"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="Grid Table 7 Colorful Accent 2"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="Grid Table 1 Light Accent 3"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="Grid Table 6 Colorful Accent 3"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="Grid Table 7 Colorful Accent 3"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="Grid Table 1 Light Accent 4"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="Grid Table 6 Colorful Accent 4"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="Grid Table 7 Colorful Accent 4"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="Grid Table 1 Light Accent 5"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="Grid Table 6 Colorful Accent 5"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="Grid Table 7 Colorful Accent 5"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="Grid Table 1 Light Accent 6"/>
+ <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
+ <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
+ <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
+ <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="Grid Table 6 Colorful Accent 6"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="Grid Table 7 Colorful Accent 6"/>
+ <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
+ <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
+ <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="List Table 1 Light Accent 1"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="List Table 6 Colorful Accent 1"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="List Table 7 Colorful Accent 1"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="List Table 1 Light Accent 2"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="List Table 6 Colorful Accent 2"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="List Table 7 Colorful Accent 2"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="List Table 1 Light Accent 3"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="List Table 6 Colorful Accent 3"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="List Table 7 Colorful Accent 3"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="List Table 1 Light Accent 4"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="List Table 6 Colorful Accent 4"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="List Table 7 Colorful Accent 4"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="List Table 1 Light Accent 5"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="List Table 6 Colorful Accent 5"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="List Table 7 Colorful Accent 5"/>
+ <w:LsdException Locked="false" Priority="46"
+ Name="List Table 1 Light Accent 6"/>
+ <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
+ <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
+ <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
+ <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
+ <w:LsdException Locked="false" Priority="51"
+ Name="List Table 6 Colorful Accent 6"/>
+ <w:LsdException Locked="false" Priority="52"
+ Name="List Table 7 Colorful Accent 6"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Mention"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Smart Hyperlink"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Hashtag"/>
+ <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
+ Name="Unresolved Mention"/>
+ </w:LatentStyles>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+ @font-face
+ {font-family:"Cambria Math";
+ panose-1:2 4 5 3 5 4 6 3 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:roman;
+ mso-font-pitch:variable;
+ mso-font-signature:-536870145 1107305727 0 0 415 0;}
+@font-face
+ {font-family:Calibri;
+ panose-1:2 15 5 2 2 2 4 3 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:-536859905 -1073697537 9 0 511 0;}
+ /* Style Definitions */
+ p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-unhide:no;
+ mso-style-qformat:yes;
+ mso-style-parent:"";
+ margin-top:0in;
+ margin-right:0in;
+ margin-bottom:10.0pt;
+ margin-left:0in;
+ line-height:115%;
+ mso-pagination:widow-orphan;
+ font-size:11.0pt;
+ font-family:"Calibri",sans-serif;
+ mso-fareast-font-family:"Times New Roman";
+ mso-bidi-font-family:"Times New Roman";
+ mso-fareast-language:EN-US;}
+h3
+ {mso-style-unhide:no;
+ mso-style-qformat:yes;
+ mso-style-link:"Heading 3 Char";
+ mso-style-next:Normal;
+ margin-top:12.0pt;
+ margin-right:0in;
+ margin-bottom:3.0pt;
+ margin-left:0in;
+ line-height:115%;
+ mso-pagination:widow-orphan;
+ page-break-after:avoid;
+ mso-outline-level:3;
+ font-size:13.0pt;
+ font-family:"Arial",sans-serif;
+ mso-fareast-language:EN-US;
+ font-weight:bold;}
+p
+ {mso-style-update:auto;
+ mso-style-unhide:no;
+ mso-margin-top-alt:auto;
+ margin-right:0in;
+ margin-bottom:0in;
+ margin-left:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:11.0pt;
+ mso-bidi-font-size:12.0pt;
+ font-family:"Arial",sans-serif;
+ mso-fareast-font-family:"Times New Roman";
+ mso-bidi-font-family:"Times New Roman";
+ mso-fareast-language:EN-US;}
+span.Heading3Char
+ {mso-style-name:"Heading 3 Char";
+ mso-style-unhide:no;
+ mso-style-locked:yes;
+ mso-style-link:"Heading 3";
+ mso-ansi-font-size:13.0pt;
+ mso-bidi-font-size:13.0pt;
+ font-family:"Arial",sans-serif;
+ mso-ascii-font-family:Arial;
+ mso-hansi-font-family:Arial;
+ mso-bidi-font-family:Arial;
+ mso-fareast-language:EN-US;
+ font-weight:bold;}
+.MsoChpDefault
+ {mso-style-type:export-only;
+ mso-default-props:yes;
+ font-size:10.0pt;
+ mso-ansi-font-size:10.0pt;
+ mso-bidi-font-size:10.0pt;
+ font-family:"Calibri",sans-serif;
+ mso-ascii-font-family:Calibri;
+ mso-hansi-font-family:Calibri;}
+@page WordSection1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.0in 1.0in 1.0in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.WordSection1
+ {page:WordSection1;}
+ /* List Definitions */
+ @list l0
+ {mso-list-id:337470154;
+ mso-list-type:hybrid;
+ mso-list-template-ids:1678785270 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
+@list l0:level1
+ {mso-level-tab-stop:none;
+ mso-level-number-position:left;
+ text-indent:-.25in;}
+@list l0:level2
+ {mso-level-number-format:alpha-lower;
+ mso-level-tab-stop:none;
+ mso-level-number-position:left;
+ text-indent:-.25in;}
+@list l0:level3
+ {mso-level-number-format:roman-lower;
+ mso-level-tab-stop:none;
+ mso-level-number-position:right;
+ text-indent:-9.0pt;}
+@list l0:level4
+ {mso-level-tab-stop:none;
+ mso-level-number-position:left;
+ text-indent:-.25in;}
+@list l0:level5
+ {mso-level-number-format:alpha-lower;
+ mso-level-tab-stop:none;
+ mso-level-number-position:left;
+ text-indent:-.25in;}
+@list l0:level6
+ {mso-level-number-format:roman-lower;
+ mso-level-tab-stop:none;
+ mso-level-number-position:right;
+ text-indent:-9.0pt;}
+@list l0:level7
+ {mso-level-tab-stop:none;
+ mso-level-number-position:left;
+ text-indent:-.25in;}
+@list l0:level8
+ {mso-level-number-format:alpha-lower;
+ mso-level-tab-stop:none;
+ mso-level-number-position:left;
+ text-indent:-.25in;}
+@list l0:level9
+ {mso-level-number-format:roman-lower;
+ mso-level-tab-stop:none;
+ mso-level-number-position:right;
+ text-indent:-9.0pt;}
+ol
+ {margin-bottom:0in;}
+ul
+ {margin-bottom:0in;}
+-->
+</style>
+<!--[if gte mso 10]>
+<style>
+ /* Style Definitions */
+ table.MsoNormalTable
+ {mso-style-name:"Table Normal";
+ mso-tstyle-rowband-size:0;
+ mso-tstyle-colband-size:0;
+ mso-style-noshow:yes;
+ mso-style-priority:99;
+ mso-style-parent:"";
+ mso-padding-alt:0in 5.4pt 0in 5.4pt;
+ mso-para-margin:0in;
+ mso-para-margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:10.0pt;
+ font-family:"Calibri",sans-serif;
+ mso-bidi-font-family:"Times New Roman";}
+</style>
+<![endif]--><!--[if gte mso 9]><xml>
+ <o:shapedefaults v:ext="edit" spidmax="1026"/>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <o:shapelayout v:ext="edit">
+ <o:idmap v:ext="edit" data=""
+ </o:shapelayout></xml><![endif]-->
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+<!--StartFragment-->
+
+<h3>Some text <o:p></o:p></h3>
+
+<p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span
+style='mso-fareast-font-family:Arial;mso-bidi-font-family:Arial'><span
+style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>
+</span></span></span><![endif]>Hello<o:p></o:p></p>
+
+<p style='margin-left:.5in;text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span
+style='mso-fareast-font-family:Arial;mso-bidi-font-family:Arial'><span
+style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>
+</span></span></span><![endif]>world<o:p></o:p></p>
+
+<p>some other text <o:p></o:p></p>
+
+<!--EndFragment-->
+</body>
+
+</html>
+