[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

rniwa at webkit.org rniwa at webkit.org
Wed Dec 22 15:32:20 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 7e06f4abd79e8b6d9f2ca28cb101165945e4a16b
Author: rniwa at webkit.org <rniwa at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Nov 6 21:19:59 2010 +0000

    2010-11-04  Ryosuke Niwa  <rniwa at webkit.org>
    
            Reviewed by Darin Adler.
    
            Bug 46335 - Add EditingStyle
            https://bugs.webkit.org/show_bug.cgi?id=46335
    
            Added EditingStyle to WebCore/editing.  This class is intended to encapsulate getPropertiesNotIn, removeNonEditingProperties,
            editingStyleAtPosition, and prepareEditingStyleToApplyAt in ApplyStyleCommand.cpp once deployed everywhere.
            Deployed it in typing styles.
    
            No new tests are added since this is a refactoring in progress.
    
            * CMakeLists.txt: Added EditingStyle.cpp
            * GNUmakefile.am: Added EditingStyle.cpp and EditingStyle.h
            * WebCore.gypi: Ditto.
            * WebCore.pro: Ditto.
            * WebCore.xcodeproj/project.pbxproj: Ditto.
            * editing/CompositeEditCommand.cpp:
            (WebCore::CompositeEditCommand::moveParagraphs): Calls editingStyleIncludingTypingStyle.
            (WebCore::CompositeEditCommand::breakOutOfEmptyListItem): Uses EditingStyle.
            * editing/DeleteSelectionCommand.cpp:
            (WebCore::DeleteSelectionCommand::saveTypingStyleState): Ditto.
            (WebCore::DeleteSelectionCommand::calculateTypingStyleAfterDelete): Ditto.
            * editing/DeleteSelectionCommand.h:
            * editing/EditingStyle.cpp: Added.
            (WebCore::editingStyleFromComputedStyle): Added.
            (WebCore::EditingStyle::EditingStyle): Added.
            (WebCore::EditingStyle::init): Added; a clone of ApplyStyleCommand::editingStyleAtPosition.
            (WebCore::EditingStyle::removeTextFillAndStrokeColorsIfNeeded): Extracted from init.
            (WebCore::EditingStyle::replaceFontSizeByKeywordIfPossible): Extracted from init.
            (WebCore::EditingStyle::isEmpty): Added.
            (WebCore::EditingStyle::setStyle): Added.
            (WebCore::EditingStyle::clear): Added.
            (WebCore::EditingStyle::removeBlockProperties): Added.
            (WebCore::EditingStyle::prepareToApplyAt): Added.
            (WebCore::editingStyleIncludingTypingStyle): Added.
            * editing/EditingStyle.h: Added.
            (WebCore::EditingStyle::create): Added.
            (WebCore::EditingStyle::style): Added.
            * editing/RemoveFormatCommand.cpp:
            (WebCore::RemoveFormatCommand::doApply): Uses EditingStyle.
            * editing/SelectionController.h:
            (WebCore::SelectionController::typingStyle): Uses EditingStyle.
            (WebCore::SelectionController::clearTypingStyle): Uses EditingStyle.
            (WebCore::SelectionController::setTypingStyle): Uses EditingStyle.
            * rendering/style/RenderStyle.h: Added EditingStyle as a friend.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@71469 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/CMakeLists.txt b/WebCore/CMakeLists.txt
index 12e3178..f1bd015 100644
--- a/WebCore/CMakeLists.txt
+++ b/WebCore/CMakeLists.txt
@@ -900,6 +900,7 @@ SET(WebCore_SOURCES
     editing/DeleteFromTextNodeCommand.cpp
     editing/DeleteSelectionCommand.cpp
     editing/EditCommand.cpp
+    editing/EditingStyle.cpp
     editing/Editor.cpp
     editing/EditorCommand.cpp
     editing/FormatBlockCommand.cpp
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 274f8c9..1bc7649 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,51 @@
+2010-11-04  Ryosuke Niwa  <rniwa at webkit.org>
+
+        Reviewed by Darin Adler.
+
+        Bug 46335 - Add EditingStyle
+        https://bugs.webkit.org/show_bug.cgi?id=46335
+
+        Added EditingStyle to WebCore/editing.  This class is intended to encapsulate getPropertiesNotIn, removeNonEditingProperties,
+        editingStyleAtPosition, and prepareEditingStyleToApplyAt in ApplyStyleCommand.cpp once deployed everywhere.
+        Deployed it in typing styles.
+
+        No new tests are added since this is a refactoring in progress.
+
+        * CMakeLists.txt: Added EditingStyle.cpp
+        * GNUmakefile.am: Added EditingStyle.cpp and EditingStyle.h
+        * WebCore.gypi: Ditto.
+        * WebCore.pro: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * editing/CompositeEditCommand.cpp:
+        (WebCore::CompositeEditCommand::moveParagraphs): Calls editingStyleIncludingTypingStyle.
+        (WebCore::CompositeEditCommand::breakOutOfEmptyListItem): Uses EditingStyle.
+        * editing/DeleteSelectionCommand.cpp:
+        (WebCore::DeleteSelectionCommand::saveTypingStyleState): Ditto.
+        (WebCore::DeleteSelectionCommand::calculateTypingStyleAfterDelete): Ditto.
+        * editing/DeleteSelectionCommand.h:
+        * editing/EditingStyle.cpp: Added.
+        (WebCore::editingStyleFromComputedStyle): Added.
+        (WebCore::EditingStyle::EditingStyle): Added.
+        (WebCore::EditingStyle::init): Added; a clone of ApplyStyleCommand::editingStyleAtPosition.
+        (WebCore::EditingStyle::removeTextFillAndStrokeColorsIfNeeded): Extracted from init.
+        (WebCore::EditingStyle::replaceFontSizeByKeywordIfPossible): Extracted from init.
+        (WebCore::EditingStyle::isEmpty): Added.
+        (WebCore::EditingStyle::setStyle): Added.
+        (WebCore::EditingStyle::clear): Added.
+        (WebCore::EditingStyle::removeBlockProperties): Added.
+        (WebCore::EditingStyle::prepareToApplyAt): Added.
+        (WebCore::editingStyleIncludingTypingStyle): Added.
+        * editing/EditingStyle.h: Added.
+        (WebCore::EditingStyle::create): Added.
+        (WebCore::EditingStyle::style): Added.
+        * editing/RemoveFormatCommand.cpp:
+        (WebCore::RemoveFormatCommand::doApply): Uses EditingStyle.
+        * editing/SelectionController.h:
+        (WebCore::SelectionController::typingStyle): Uses EditingStyle.
+        (WebCore::SelectionController::clearTypingStyle): Uses EditingStyle.
+        (WebCore::SelectionController::setTypingStyle): Uses EditingStyle.
+        * rendering/style/RenderStyle.h: Added EditingStyle as a friend.
+
 2010-11-05  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Dan Bernstein and Simon Fraser.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index 6b189bc..1ccfbe3 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -1296,6 +1296,8 @@ webcore_sources += \
 	WebCore/editing/EditCommand.h \
 	WebCore/editing/EditingBehavior.h \
 	WebCore/editing/EditingBehaviorTypes.h \
+	WebCore/editing/EditingStyle.cpp \
+	WebCore/editing/EditingStyle.h \
 	WebCore/editing/EditorCommand.cpp \
 	WebCore/editing/Editor.cpp \
 	WebCore/editing/EditorDeleteAction.h \
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index 15fa44b..0ca45b3 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -1383,6 +1383,8 @@
             'editing/EditCommand.h',
             'editing/EditingBehavior.h',
             'editing/EditingBehaviorTypes.h',
+            'editing/EditingStyle.cpp',
+            'editing/EditingStyle.h',
             'editing/Editor.cpp',
             'editing/Editor.h',
             'editing/EditorCommand.cpp',
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index 18f40c4..3989742 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -789,6 +789,7 @@ SOURCES += \
     editing/DeleteFromTextNodeCommand.cpp \
     editing/DeleteSelectionCommand.cpp \
     editing/EditCommand.cpp \
+    editing/EditingStyle.cpp \
     editing/Editor.cpp \
     editing/EditorCommand.cpp \
     editing/FormatBlockCommand.cpp \
@@ -1700,6 +1701,7 @@ HEADERS += \
     editing/DeleteFromTextNodeCommand.h \
     editing/DeleteSelectionCommand.h \
     editing/EditCommand.h \
+    editing/EditingStyle.h \
     editing/EditingBehavior.h \
     editing/Editor.h \
     editing/FormatBlockCommand.h \
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index b4e23b9..f5d75bf 100644
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -46268,6 +46268,62 @@
 				>
 			</File>
 			<File
+				RelativePath="..\editing\EditingStyle.h"
+				>
+			</File>
+			<File
+				RelativePath="..\editing\EditingStyle.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug_Internal|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug_Cairo|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release_Cairo|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug_All|Win32"
+					ExcludedFromBuild="true"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
 				RelativePath="..\editing\Editor.cpp"
 				>
 				<FileConfiguration
diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index d73731c..a291e52 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -2988,6 +2988,8 @@
 		97EF7DFE107E55B700D7C49C /* ScriptControllerBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97EF7DFD107E55B700D7C49C /* ScriptControllerBase.cpp */; };
 		9B417064125662B3006B28FC /* ApplyBlockElementCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B417062125662B3006B28FC /* ApplyBlockElementCommand.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		9B417065125662B3006B28FC /* ApplyBlockElementCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B417063125662B3006B28FC /* ApplyBlockElementCommand.cpp */; };
+		9BAB6C6C12550631001626D4 /* EditingStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BAB6C6A12550631001626D4 /* EditingStyle.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		9BAB6C6D12550631001626D4 /* EditingStyle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9BAB6C6B12550631001626D4 /* EditingStyle.cpp */; };
 		9F0D6B2E121BFEBA006C0288 /* InspectorProfilerAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9F0D6B2C121BFEBA006C0288 /* InspectorProfilerAgent.cpp */; };
 		9F0D6B2F121BFEBA006C0288 /* InspectorProfilerAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F0D6B2D121BFEBA006C0288 /* InspectorProfilerAgent.h */; };
 		9F3B947E12241758005304E7 /* ScriptHeapSnapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F3B947D12241758005304E7 /* ScriptHeapSnapshot.h */; };
@@ -9089,6 +9091,8 @@
 		97EF7DFD107E55B700D7C49C /* ScriptControllerBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptControllerBase.cpp; sourceTree = "<group>"; };
 		9B417062125662B3006B28FC /* ApplyBlockElementCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplyBlockElementCommand.h; sourceTree = "<group>"; };
 		9B417063125662B3006B28FC /* ApplyBlockElementCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ApplyBlockElementCommand.cpp; sourceTree = "<group>"; };
+		9BAB6C6A12550631001626D4 /* EditingStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditingStyle.h; sourceTree = "<group>"; };
+		9BAB6C6B12550631001626D4 /* EditingStyle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EditingStyle.cpp; sourceTree = "<group>"; };
 		9F0D6B2C121BFEBA006C0288 /* InspectorProfilerAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorProfilerAgent.cpp; sourceTree = "<group>"; };
 		9F0D6B2D121BFEBA006C0288 /* InspectorProfilerAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorProfilerAgent.h; sourceTree = "<group>"; };
 		9F3B947D12241758005304E7 /* ScriptHeapSnapshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptHeapSnapshot.h; sourceTree = "<group>"; };
@@ -14526,6 +14530,8 @@
 				93309D95099E64910056E581 /* EditCommand.h */,
 				4F1534DD11B532EC0021FD86 /* EditingBehavior.h */,
 				4F1534DF11B533020021FD86 /* EditingBehaviorTypes.h */,
+				9BAB6C6A12550631001626D4 /* EditingStyle.h */,
+				9BAB6C6B12550631001626D4 /* EditingStyle.cpp */,
 				4B3043CA0AE0373B00A82647 /* Editor.cpp */,
 				4B3043CB0AE0373B00A82647 /* Editor.h */,
 				93A38B4A0D0E5808006872C2 /* EditorCommand.cpp */,
@@ -19524,6 +19530,7 @@
 				93309DE4099E64920056E581 /* EditCommand.h in Headers */,
 				4F1534DE11B532EC0021FD86 /* EditingBehavior.h in Headers */,
 				4F1534E011B533020021FD86 /* EditingBehaviorTypes.h in Headers */,
+				9BAB6C6C12550631001626D4 /* EditingStyle.h in Headers */,
 				6550B6A4099DF0270090D781 /* EditingText.h in Headers */,
 				4B3043CD0AE0373B00A82647 /* Editor.h in Headers */,
 				1AF326790D78B9440068F0C4 /* EditorClient.h in Headers */,
@@ -22175,6 +22182,7 @@
 				498771531243F9FA002226BA /* DrawingBufferMac.mm in Sources */,
 				BC7FA6200D1F0CBD00DB22A9 /* DynamicNodeList.cpp in Sources */,
 				93309DE3099E64920056E581 /* EditCommand.cpp in Sources */,
+				9BAB6C6D12550631001626D4 /* EditingStyle.cpp in Sources */,
 				6550B6A3099DF0270090D781 /* EditingText.cpp in Sources */,
 				4B3043CC0AE0373B00A82647 /* Editor.cpp in Sources */,
 				93A38B4B0D0E5808006872C2 /* EditorCommand.cpp in Sources */,
diff --git a/WebCore/editing/ApplyStyleCommand.cpp b/WebCore/editing/ApplyStyleCommand.cpp
index 230a789..2acc373 100644
--- a/WebCore/editing/ApplyStyleCommand.cpp
+++ b/WebCore/editing/ApplyStyleCommand.cpp
@@ -36,7 +36,6 @@
 #include "Document.h"
 #include "Editor.h"
 #include "Frame.h"
-#include "HTMLElement.h"
 #include "HTMLFontElement.h"
 #include "HTMLInterchange.h"
 #include "HTMLNames.h"
@@ -491,9 +490,9 @@ PassRefPtr<CSSMutableStyleDeclaration> ApplyStyleCommand::editingStyleAtPosition
     }
 
     if (shouldIncludeTypingStyle == IncludeTypingStyle) {
-        CSSMutableStyleDeclaration* typingStyle = pos.node()->document()->frame()->selection()->typingStyle();
+        RefPtr<CSSMutableStyleDeclaration> typingStyle = pos.node()->document()->frame()->selection()->typingStyle();
         if (typingStyle)
-            style->merge(typingStyle);
+            style->merge(typingStyle.get());
     }
 
     return style.release();
diff --git a/WebCore/editing/ApplyStyleCommand.h b/WebCore/editing/ApplyStyleCommand.h
index e4bdc6c..4da4243 100644
--- a/WebCore/editing/ApplyStyleCommand.h
+++ b/WebCore/editing/ApplyStyleCommand.h
@@ -27,6 +27,7 @@
 #define ApplyStyleCommand_h
 
 #include "CompositeEditCommand.h"
+#include "HTMLElement.h"
 
 namespace WebCore {
 
diff --git a/WebCore/editing/CompositeEditCommand.cpp b/WebCore/editing/CompositeEditCommand.cpp
index f55b86a..5579b25 100644
--- a/WebCore/editing/CompositeEditCommand.cpp
+++ b/WebCore/editing/CompositeEditCommand.cpp
@@ -937,9 +937,9 @@ void CompositeEditCommand::moveParagraphs(const VisiblePosition& startOfParagrap
     // A non-empty paragraph's style is moved when we copy and move it.  We don't move 
     // anything if we're given an empty paragraph, but an empty paragraph can have style
     // too, <div><b><br></b></div> for example.  Save it so that we can preserve it later.
-    RefPtr<CSSMutableStyleDeclaration> styleInEmptyParagraph;
+    RefPtr<EditingStyle> styleInEmptyParagraph;
     if (startOfParagraphToMove == endOfParagraphToMove && preserveStyle) {
-        styleInEmptyParagraph = ApplyStyleCommand::editingStyleAtPosition(startOfParagraphToMove.deepEquivalent(), IncludeTypingStyle);
+        styleInEmptyParagraph = editingStyleIncludingTypingStyle(startOfParagraphToMove.deepEquivalent());
         // The moved paragraph should assume the block style of the destination.
         styleInEmptyParagraph->removeBlockProperties();
     }
@@ -983,8 +983,8 @@ void CompositeEditCommand::moveParagraphs(const VisiblePosition& startOfParagrap
     // If the selection is in an empty paragraph, restore styles from the old empty paragraph to the new empty paragraph.
     bool selectionIsEmptyParagraph = endingSelection().isCaret() && isStartOfParagraph(endingSelection().visibleStart()) && isEndOfParagraph(endingSelection().visibleStart());
     if (styleInEmptyParagraph && selectionIsEmptyParagraph)
-        applyStyle(styleInEmptyParagraph.get());
-    
+        applyStyle(styleInEmptyParagraph->style());
+
     if (preserveSelection && startIndex != -1) {
         // Fragment creation (using createMarkup) incorrectly uses regular
         // spaces instead of nbsps for some spaces that were rendered (11475), which
@@ -1005,7 +1005,7 @@ bool CompositeEditCommand::breakOutOfEmptyListItem()
     if (!emptyListItem)
         return false;
 
-    RefPtr<CSSMutableStyleDeclaration> style = ApplyStyleCommand::editingStyleAtPosition(endingSelection().start(), IncludeTypingStyle);
+    RefPtr<EditingStyle> style = editingStyleIncludingTypingStyle(endingSelection().start());
 
     ContainerNode* listNode = emptyListItem->parentNode();
     // FIXME: Can't we do something better when the immediate parent wasn't a list node?
@@ -1054,10 +1054,10 @@ bool CompositeEditCommand::breakOutOfEmptyListItem()
     appendBlockPlaceholder(newBlock);
     setEndingSelection(VisibleSelection(Position(newBlock.get(), 0), DOWNSTREAM));
 
-    prepareEditingStyleToApplyAt(style.get(), endingSelection().start());
-    if (style->length())
-        applyStyle(style.get());
-    
+    style->prepareToApplyAt(endingSelection().start());
+    if (!style->isEmpty())
+        applyStyle(style->style());
+
     return true;
 }
 
diff --git a/WebCore/editing/DeleteSelectionCommand.cpp b/WebCore/editing/DeleteSelectionCommand.cpp
index 1f56da7..cd88877 100644
--- a/WebCore/editing/DeleteSelectionCommand.cpp
+++ b/WebCore/editing/DeleteSelectionCommand.cpp
@@ -294,14 +294,14 @@ void DeleteSelectionCommand::saveTypingStyleState()
         return;
 
     // Figure out the typing style in effect before the delete is done.
-    m_typingStyle = ApplyStyleCommand::editingStyleAtPosition(positionBeforeTabSpan(m_selectionToDelete.start()));
+    m_typingStyle = EditingStyle::create(positionBeforeTabSpan(m_selectionToDelete.start()));
 
-    removeEnclosingAnchorStyle(m_typingStyle.get(), m_selectionToDelete.start());
+    removeEnclosingAnchorStyle(m_typingStyle->style(), m_selectionToDelete.start());
 
     // If we're deleting into a Mail blockquote, save the style at end() instead of start()
     // We'll use this later in computeTypingStyleAfterDelete if we end up outside of a Mail blockquote
     if (nearestMailBlockquote(m_selectionToDelete.start().node()))
-        m_deleteIntoBlockquoteStyle = ApplyStyleCommand::editingStyleAtPosition(m_selectionToDelete.end());
+        m_deleteIntoBlockquoteStyle = EditingStyle::create(m_selectionToDelete.end());
     else
         m_deleteIntoBlockquoteStyle = 0;
 }
@@ -693,8 +693,8 @@ void DeleteSelectionCommand::calculateTypingStyleAfterDelete()
         m_typingStyle = m_deleteIntoBlockquoteStyle;
     m_deleteIntoBlockquoteStyle = 0;
 
-    prepareEditingStyleToApplyAt(m_typingStyle.get(), m_endingPosition);
-    if (!m_typingStyle->length())
+    m_typingStyle->prepareToApplyAt(m_endingPosition);
+    if (m_typingStyle->isEmpty())
         m_typingStyle = 0;
     VisiblePosition visibleEnd(m_endingPosition);
     if (m_typingStyle && 
@@ -707,7 +707,7 @@ void DeleteSelectionCommand::calculateTypingStyleAfterDelete()
         // then move it back (which will clear typing style).
 
         setEndingSelection(visibleEnd);
-        applyStyle(m_typingStyle.get(), EditActionUnspecified);
+        applyStyle(m_typingStyle->style(), EditActionUnspecified);
         // applyStyle can destroy the placeholder that was at m_endingPosition if it needs to 
         // move it, but it will set an endingSelection() at [movedPlaceholder, 0] if it does so.
         m_endingPosition = endingSelection().start();
diff --git a/WebCore/editing/DeleteSelectionCommand.h b/WebCore/editing/DeleteSelectionCommand.h
index 20f52f4..7b46935 100644
--- a/WebCore/editing/DeleteSelectionCommand.h
+++ b/WebCore/editing/DeleteSelectionCommand.h
@@ -30,6 +30,8 @@
 
 namespace WebCore {
 
+class EditingStyle;
+
 class DeleteSelectionCommand : public CompositeEditCommand { 
 public:
     static PassRefPtr<DeleteSelectionCommand> create(Document* document, bool smartDelete = false, bool mergeBlocksAfterDelete = true, bool replace = false, bool expandForSpecialElements = false)
@@ -86,8 +88,8 @@ private:
     Position m_trailingWhitespace;
     RefPtr<Node> m_startBlock;
     RefPtr<Node> m_endBlock;
-    RefPtr<CSSMutableStyleDeclaration> m_typingStyle;
-    RefPtr<CSSMutableStyleDeclaration> m_deleteIntoBlockquoteStyle;
+    RefPtr<EditingStyle> m_typingStyle;
+    RefPtr<EditingStyle> m_deleteIntoBlockquoteStyle;
     RefPtr<Node> m_startRoot;
     RefPtr<Node> m_endRoot;
     RefPtr<Node> m_startTableRow;
diff --git a/WebCore/editing/EditingStyle.cpp b/WebCore/editing/EditingStyle.cpp
new file mode 100644
index 0000000..265808d
--- /dev/null
+++ b/WebCore/editing/EditingStyle.cpp
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2007, 2008, 2009 Apple Computer, Inc.
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "EditingStyle.h"
+
+#include "ApplyStyleCommand.h"
+#include "CSSComputedStyleDeclaration.h"
+#include "CSSMutableStyleDeclaration.h"
+#include "Frame.h"
+#include "RenderStyle.h"
+#include "SelectionController.h"
+
+namespace WebCore {
+
+static PassRefPtr<CSSMutableStyleDeclaration> editingStyleFromComputedStyle(CSSComputedStyleDeclaration* style)
+{
+    if (!style)
+        return CSSMutableStyleDeclaration::create();
+    return ApplyStyleCommand::removeNonEditingProperties(style);
+}
+
+EditingStyle::EditingStyle()
+    : m_shouldUseFixedDefaultFontSize(false)
+{
+}
+
+EditingStyle::EditingStyle(Node* node)
+    : m_shouldUseFixedDefaultFontSize(false)
+{
+    init(node);
+}
+
+EditingStyle::EditingStyle(const Position& position)
+    : m_shouldUseFixedDefaultFontSize(false)
+{
+    init(position.node());
+}
+
+EditingStyle::EditingStyle(const CSSStyleDeclaration* style)
+    : m_mutableStyle(style->copy())
+    , m_shouldUseFixedDefaultFontSize(false)
+{
+}
+
+void EditingStyle::init(Node* node)
+{
+    RefPtr<CSSComputedStyleDeclaration> computedStyleAtPosition = computedStyle(node);
+    m_mutableStyle = editingStyleFromComputedStyle(computedStyleAtPosition.get());
+
+    if (node && node->computedStyle()) {
+        RenderStyle* renderStyle = node->computedStyle();
+        removeTextFillAndStrokeColorsIfNeeded(renderStyle);
+        replaceFontSizeByKeywordIfPossible(renderStyle, computedStyleAtPosition.get());
+    }
+
+    m_shouldUseFixedDefaultFontSize = computedStyleAtPosition->useFixedFontDefaultSize();
+}
+
+void EditingStyle::removeTextFillAndStrokeColorsIfNeeded(RenderStyle* renderStyle)
+{
+    // If a node's text fill color is invalid, then its children use 
+    // their font-color as their text fill color (they don't
+    // inherit it).  Likewise for stroke color.
+    ExceptionCode ec = 0;
+    if (!renderStyle->textFillColor().isValid())
+        m_mutableStyle->removeProperty(CSSPropertyWebkitTextFillColor, ec);
+    if (!renderStyle->textStrokeColor().isValid())
+        m_mutableStyle->removeProperty(CSSPropertyWebkitTextStrokeColor, ec);
+    ASSERT(!ec);
+}
+
+void EditingStyle::replaceFontSizeByKeywordIfPossible(RenderStyle* renderStyle, CSSComputedStyleDeclaration* computedStyle)
+{
+    ASSERT(renderStyle);
+    if (renderStyle->fontDescription().keywordSize())
+        m_mutableStyle->setProperty(CSSPropertyFontSize, computedStyle->getFontSizeCSSValuePreferringKeyword()->cssText());
+}
+
+bool EditingStyle::isEmpty() const
+{
+    return !m_mutableStyle || m_mutableStyle->isEmpty();
+}
+
+void EditingStyle::setStyle(PassRefPtr<CSSMutableStyleDeclaration> style)
+{
+    m_mutableStyle = style;
+    // FIXME: We should be able to figure out whether or not font is fixed width for mutable style.
+    // We need to check font-family is monospace as in FontDescription but we don't want to duplicate code here.
+    m_shouldUseFixedDefaultFontSize = false;
+}
+
+void EditingStyle::clear()
+{
+    m_mutableStyle.clear();
+    m_shouldUseFixedDefaultFontSize = false;
+}
+
+void EditingStyle::removeBlockProperties()
+{
+    if (!m_mutableStyle)
+        return;
+
+    m_mutableStyle->removeBlockProperties();
+}
+
+void EditingStyle::prepareToApplyAt(const Position& position)
+{
+    // ReplaceSelectionCommand::handleStyleSpans() requires that this function only removes the editing style.
+    // If this function was modified in the future to delete all redundant properties, then add a boolean value to indicate
+    // which one of editingStyleAtPosition or computedStyle is called.
+    RefPtr<EditingStyle> style = EditingStyle::create(position);
+    style->m_mutableStyle->diff(m_mutableStyle.get());
+
+    // if alpha value is zero, we don't add the background color.
+    RefPtr<CSSValue> backgroundColor = m_mutableStyle->getPropertyCSSValue(CSSPropertyBackgroundColor);
+    if (backgroundColor && backgroundColor->isPrimitiveValue()
+        && !alphaChannel(static_cast<CSSPrimitiveValue*>(backgroundColor.get())->getRGBA32Value())) {
+        ExceptionCode ec;
+        m_mutableStyle->removeProperty(CSSPropertyBackgroundColor, ec);
+    }
+}
+
+PassRefPtr<EditingStyle> editingStyleIncludingTypingStyle(const Position& position)
+{
+    RefPtr<EditingStyle> editingStyle = EditingStyle::create(position);
+    RefPtr<CSSMutableStyleDeclaration> typingStyle = position.node()->document()->frame()->selection()->typingStyle();
+    if (typingStyle) {
+        RefPtr<CSSMutableStyleDeclaration> inheritableTypingStyle = typingStyle->copy();
+        ApplyStyleCommand::removeNonEditingProperties(inheritableTypingStyle.get());
+        editingStyle->style()->merge(inheritableTypingStyle.get(), true);
+    }
+    return editingStyle;
+}
+    
+}
diff --git a/WebCore/editing/EditingStyle.h b/WebCore/editing/EditingStyle.h
new file mode 100644
index 0000000..0ad9b68
--- /dev/null
+++ b/WebCore/editing/EditingStyle.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef EditingStyle_h
+#define EditingStyle_h
+
+#include "CSSMutableStyleDeclaration.h"
+#include "Document.h"
+#include "Position.h"
+
+namespace WebCore {
+
+class CSSStyleDeclaration;
+class CSSComputedStyleDeclaration;
+
+class EditingStyle : public RefCounted<EditingStyle> {
+public:
+
+    static PassRefPtr<EditingStyle> create()
+    {
+        return adoptRef(new EditingStyle());
+    }
+
+    static PassRefPtr<EditingStyle> create(Node* node)
+    {
+        return adoptRef(new EditingStyle(node));
+    }
+
+    static PassRefPtr<EditingStyle> create(const Position& position)
+    {
+        return adoptRef(new EditingStyle(position));
+    }
+
+    static PassRefPtr<EditingStyle> create(const CSSStyleDeclaration* style)
+    {
+        return adoptRef(new EditingStyle(style));
+    }
+
+    CSSMutableStyleDeclaration* style() { return m_mutableStyle.get(); }
+    bool isEmpty() const;
+    void setStyle(PassRefPtr<CSSMutableStyleDeclaration>);
+    void clear();
+    void removeBlockProperties();
+    void prepareToApplyAt(const Position&);
+
+private:
+    EditingStyle();
+    EditingStyle(Node*);
+    EditingStyle(const Position&);
+    EditingStyle(const CSSStyleDeclaration*);
+    void init(Node*);
+    void removeTextFillAndStrokeColorsIfNeeded(RenderStyle*);
+    void replaceFontSizeByKeywordIfPossible(RenderStyle*, CSSComputedStyleDeclaration*);
+
+    RefPtr<CSSMutableStyleDeclaration> m_mutableStyle;
+    bool m_shouldUseFixedDefaultFontSize;
+};
+
+PassRefPtr<EditingStyle> editingStyleIncludingTypingStyle(const Position&);
+    
+} // namespace WebCore
+
+#endif // EditingStyle_h
diff --git a/WebCore/editing/Editor.cpp b/WebCore/editing/Editor.cpp
index e7d066e..1ce0a70 100644
--- a/WebCore/editing/Editor.cpp
+++ b/WebCore/editing/Editor.cpp
@@ -608,7 +608,8 @@ WritingDirection Editor::textDirectionForSelection(bool& hasNestedOrMultipleEmbe
     }
 
     if (m_frame->selection()->isCaret()) {
-        if (CSSMutableStyleDeclaration* typingStyle = m_frame->selection()->typingStyle()) {
+        RefPtr<CSSMutableStyleDeclaration> typingStyle = m_frame->selection()->typingStyle();
+        if (typingStyle) {
             RefPtr<CSSValue> unicodeBidi = typingStyle->getPropertyCSSValue(CSSPropertyUnicodeBidi);
             if (unicodeBidi) {
                 ASSERT(unicodeBidi->isPrimitiveValue());
@@ -3053,7 +3054,7 @@ void Editor::computeAndSetTypingStyle(CSSStyleDeclaration* style, EditAction edi
         applyCommand(ApplyStyleCommand::create(m_frame->document(), blockStyle.get(), editingAction));
 
     // Set the remaining style as the typing style.
-    m_frame->selection()->setTypingStyle(mutableStyle.release());
+    m_frame->selection()->setTypingStyle(EditingStyle::create(mutableStyle.get()));
 }
 
 PassRefPtr<CSSMutableStyleDeclaration> Editor::selectionComputedStyle(bool& shouldUseFixedFontDefaultSize) const
diff --git a/WebCore/editing/InsertLineBreakCommand.cpp b/WebCore/editing/InsertLineBreakCommand.cpp
index 8ac1167..5588326 100644
--- a/WebCore/editing/InsertLineBreakCommand.cpp
+++ b/WebCore/editing/InsertLineBreakCommand.cpp
@@ -165,14 +165,14 @@ void InsertLineBreakCommand::doApply()
 
     // Handle the case where there is a typing style.
     
-    CSSMutableStyleDeclaration* typingStyle = document()->frame()->selection()->typingStyle();
+    RefPtr<CSSMutableStyleDeclaration> typingStyle = document()->frame()->selection()->typingStyle();
     
     if (typingStyle && typingStyle->length() > 0) {
         // Apply the typing style to the inserted line break, so that if the selection
         // leaves and then comes back, new input will have the right style.
         // FIXME: We shouldn't always apply the typing style to the line break here,
         // see <rdar://problem/5794462>.
-        applyStyle(typingStyle, firstDeepEditingPositionForNode(nodeToInsert.get()), lastDeepEditingPositionForNode(nodeToInsert.get()));
+        applyStyle(typingStyle.get(), firstDeepEditingPositionForNode(nodeToInsert.get()), lastDeepEditingPositionForNode(nodeToInsert.get()));
         // Even though this applyStyle operates on a Range, it still sets an endingSelection().
         // It tries to set a VisibleSelection around the content it operated on. So, that VisibleSelection
         // will either (a) select the line break we inserted, or it will (b) be a caret just 
diff --git a/WebCore/editing/InsertTextCommand.cpp b/WebCore/editing/InsertTextCommand.cpp
index b6c8236..87a695d 100644
--- a/WebCore/editing/InsertTextCommand.cpp
+++ b/WebCore/editing/InsertTextCommand.cpp
@@ -190,7 +190,7 @@ void InsertTextCommand::input(const String& text, bool selectInsertedText)
     setEndingSelection(forcedEndingSelection);
 
     // Handle the case where there is a typing style.
-    CSSMutableStyleDeclaration* typingStyle = document()->frame()->selection()->typingStyle();
+    RefPtr<CSSMutableStyleDeclaration> typingStyle = document()->frame()->selection()->typingStyle();
     RefPtr<CSSComputedStyleDeclaration> endingStyle = endPosition.computedStyle();
     RefPtr<CSSValue> unicodeBidi;
     RefPtr<CSSValue> direction;
@@ -198,7 +198,7 @@ void InsertTextCommand::input(const String& text, bool selectInsertedText)
         unicodeBidi = typingStyle->getPropertyCSSValue(CSSPropertyUnicodeBidi);
         direction = typingStyle->getPropertyCSSValue(CSSPropertyDirection);
     }
-    endingStyle->diff(typingStyle);
+    endingStyle->diff(typingStyle.get());
     if (typingStyle && unicodeBidi) {
         ASSERT(unicodeBidi->isPrimitiveValue());
         typingStyle->setProperty(CSSPropertyUnicodeBidi, static_cast<CSSPrimitiveValue*>(unicodeBidi.get())->getIdent());
@@ -209,7 +209,7 @@ void InsertTextCommand::input(const String& text, bool selectInsertedText)
     }
 
     if (typingStyle && typingStyle->length())
-        applyStyle(typingStyle);
+        applyStyle(typingStyle.get());
 
     if (!selectInsertedText)
         setEndingSelection(VisibleSelection(endingSelection().end(), endingSelection().affinity()));
diff --git a/WebCore/editing/SelectionController.h b/WebCore/editing/SelectionController.h
index e5fe71b..2edad0a 100644
--- a/WebCore/editing/SelectionController.h
+++ b/WebCore/editing/SelectionController.h
@@ -26,7 +26,7 @@
 #ifndef SelectionController_h
 #define SelectionController_h
 
-#include "CSSMutableStyleDeclaration.h"
+#include "EditingStyle.h"
 #include "IntRect.h"
 #include "Range.h"
 #include "ScrollBehavior.h"
@@ -37,6 +37,7 @@
 namespace WebCore {
 
 class Frame;
+class CSSMutableStyleDeclaration;
 class GraphicsContext;
 class HTMLFormElement;
 class RenderObject;
@@ -160,7 +161,7 @@ public:
     void paintDragCaret(GraphicsContext*, int tx, int ty, const IntRect& clipRect) const;
 
     CSSMutableStyleDeclaration* typingStyle() const;
-    void setTypingStyle(PassRefPtr<CSSMutableStyleDeclaration>);
+    void setTypingStyle(PassRefPtr<EditingStyle>);
     void clearTypingStyle();
 
     FloatRect bounds(bool clipToVisibleContent = true) const;
@@ -214,7 +215,7 @@ private:
     VisibleSelection m_selection;
     TextGranularity m_granularity;
 
-    RefPtr<CSSMutableStyleDeclaration> m_typingStyle;
+    RefPtr<EditingStyle> m_typingStyle;
 
     Timer<SelectionController> m_caretBlinkTimer;
 
@@ -234,7 +235,7 @@ private:
 
 inline CSSMutableStyleDeclaration* SelectionController::typingStyle() const
 {
-    return m_typingStyle.get();
+    return m_typingStyle ? m_typingStyle->style() : 0;
 }
 
 inline void SelectionController::clearTypingStyle()
@@ -242,7 +243,7 @@ inline void SelectionController::clearTypingStyle()
     m_typingStyle.clear();
 }
 
-inline void SelectionController::setTypingStyle(PassRefPtr<CSSMutableStyleDeclaration> style)
+inline void SelectionController::setTypingStyle(PassRefPtr<EditingStyle> style)
 {
     m_typingStyle = style;
 }
diff --git a/WebCore/rendering/style/RenderStyle.h b/WebCore/rendering/style/RenderStyle.h
index ed0f9d2..91fb86a 100644
--- a/WebCore/rendering/style/RenderStyle.h
+++ b/WebCore/rendering/style/RenderStyle.h
@@ -109,6 +109,7 @@ typedef Vector<RefPtr<RenderStyle>, 4> PseudoStyleCache;
 class RenderStyle: public RefCounted<RenderStyle> {
     friend class AnimationBase; // Used by CSS animations. We can't allow them to animate based off visited colors.
     friend class ApplyStyleCommand; // Editing has to only reveal unvisited info.
+    friend class EditingStyle; // Editing has to only reveal unvisited info.
     friend class CSSStyleSelector; // Sets members directly.
     friend class CSSComputedStyleDeclaration; // Ignores visited styles, so needs to be able to see unvisited info.
     friend class PropertyWrapperMaybeInvalidColor; // Used by CSS animations. We can't allow them to animate based off visited colors.

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list