[SCM] WebKit Debian packaging branch, debian/unstable, updated. 0+svn29752-1-1645-gd3fe478
Mike Hommey
glandium at debian.org
Sat Apr 12 19:56:54 UTC 2008
The following commit has been merged in the debian/unstable branch:
commit 857668d36ed877517cea292fb78ce124ade06eec
Merge: 24180a9e2b7396b161c6fdae08ba9e3c56d395f2 c77f42765c0a6cd82cafa8c88ab158c064b34a6e
Author: Mike Hommey <glandium at debian.org>
Date: Sun Apr 6 17:59:39 2008 +0200
Merge branch 'debian/experimental' into debian/unstable
Conflicts:
JavaScriptCore/kjs/interpreter.cpp
WebCore/ksvg2/svg/SVGFontFaceElement.cpp
WebCore/loader/icon/IconDatabase.cpp
WebKit.pro
diff --combined JavaScriptCore/wtf/ASCIICType.h
index 3e61a87,8f8e357..3c4489f
--- a/JavaScriptCore/wtf/ASCIICType.h
+++ b/JavaScriptCore/wtf/ASCIICType.h
@@@ -48,48 -48,63 +48,63 @@@ namespace WTF
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
inline bool isASCIIAlpha(wchar_t c) { return (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; }
#endif
+ inline bool isASCIIAlpha(int c) { return (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; }
- inline bool isASCIIAlphanumeric(char c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; }
- inline bool isASCIIAlphanumeric(unsigned short c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; }
+ inline bool isASCIIAlphanumeric(char c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'z'); }
+ inline bool isASCIIAlphanumeric(unsigned short c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'z'); }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
- inline bool isASCIIAlphanumeric(wchar_t c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; }
+ inline bool isASCIIAlphanumeric(wchar_t c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'z'); }
#endif
+ inline bool isASCIIAlphanumeric(int c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'z'; }
- inline bool isASCIIDigit(char c) { return c >= '0' && c <= '9'; }
- inline bool isASCIIDigit(unsigned short c) { return c >= '0' && c <= '9'; }
+ inline bool isASCIIDigit(char c) { return (c >= '0') & (c <= '9'); }
+ inline bool isASCIIDigit(unsigned short c) { return (c >= '0') & (c <= '9'); }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
- inline bool isASCIIDigit(wchar_t c) { return c >= '0' && c <= '9'; }
+ inline bool isASCIIDigit(wchar_t c) { return (c >= '0') & (c <= '9'); }
#endif
+ inline bool isASCIIDigit(int c) { return (c >= '0') & (c <= '9'); }
- inline bool isASCIIHexDigit(char c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'f'; }
- inline bool isASCIIHexDigit(unsigned short c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'f'; }
+ inline bool isASCIIHexDigit(char c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); }
+ inline bool isASCIIHexDigit(unsigned short c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
- inline bool isASCIIHexDigit(wchar_t c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'f'; }
+ inline bool isASCIIHexDigit(wchar_t c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f'); }
#endif
+ inline bool isASCIIHexDigit(int c) { return c >= '0' && c <= '9' || (c | 0x20) >= 'a' && (c | 0x20) <= 'f'; }
inline bool isASCIILower(char c) { return c >= 'a' && c <= 'z'; }
inline bool isASCIILower(unsigned short c) { return c >= 'a' && c <= 'z'; }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
inline bool isASCIILower(wchar_t c) { return c >= 'a' && c <= 'z'; }
#endif
+ inline bool isASCIILower(int c) { return c >= 'a' && c <= 'z'; }
+
+ inline bool isASCIIUpper(char c) { return c >= 'A' && c <= 'Z'; }
+ inline bool isASCIIUpper(unsigned short c) { return c >= 'A' && c <= 'Z'; }
+ #if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
+ inline bool isASCIIUpper(wchar_t c) { return c >= 'A' && c <= 'Z'; }
+ #endif
+ inline bool isASCIIUpper(int c) { return c >= 'A' && c <= 'Z'; }
inline bool isASCIISpace(char c) { return c == '\t' || c == '\n' || c == '\v' || c =='\f' || c == '\r' || c == ' '; }
inline bool isASCIISpace(unsigned short c) { return c == '\t' || c == '\n' || c == '\v' || c =='\f' || c == '\r' || c == ' '; }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
inline bool isASCIISpace(wchar_t c) { return c == '\t' || c == '\n' || c == '\v' || c =='\f' || c == '\r' || c == ' '; }
#endif
+ inline bool isASCIISpace(int c) { return c == '\t' || c == '\n' || c == '\v' || c =='\f' || c == '\r' || c == ' '; }
inline char toASCIILower(char c) { return c | ((c >= 'A' && c <= 'Z') << 5); }
inline unsigned short toASCIILower(unsigned short c) { return c | ((c >= 'A' && c <= 'Z') << 5); }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
inline wchar_t toASCIILower(wchar_t c) { return c | ((c >= 'A' && c <= 'Z') << 5); }
#endif
+ inline int toASCIILower(int c) { return c | ((c >= 'A' && c <= 'Z') << 5); }
inline char toASCIIUpper(char c) { return static_cast<char>(c & ~((c >= 'a' && c <= 'z') << 5)); }
inline unsigned short toASCIIUpper(unsigned short c) { return static_cast<unsigned short>(c & ~((c >= 'a' && c <= 'z') << 5)); }
#if !COMPILER(MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
inline wchar_t toASCIIUpper(wchar_t c) { return static_cast<wchar_t>(c & ~((c >= 'a' && c <= 'z') << 5)); }
#endif
+ inline int toASCIIUpper(int c) { return static_cast<int>(c & ~((c >= 'a' && c <= 'z') << 5)); }
}
diff --combined WebCore/dom/Position.cpp
index 0c9ae73,bfed910..f2898c1
--- a/WebCore/dom/Position.cpp
+++ b/WebCore/dom/Position.cpp
@@@ -38,8 -38,6 +38,8 @@@
#include "Text.h"
#include "TextIterator.h"
#include "visible_units.h"
+
+#include <cstdio>
namespace WebCore {
@@@ -135,7 -133,7 +135,7 @@@ Position Position::previous(EUsingCompo
// Going backward one character at a time is correct.
// 2) The old offset was a bogus offset like (<br>, 1), and there is no child.
// Going from 1 to 0 is correct.
- return Position(n, usingComposedCharacters ? n->previousOffset(o) : o - 1);
+ return Position(n, usingComposedCharacters ? uncheckedPreviousOffset(n, o) : o - 1);
}
Node *parent = n->parentNode();
@@@ -165,7 -163,7 +165,7 @@@ Position Position::next(EUsingComposedC
// Going forward one character at a time is correct.
// 2) The new offset is a bogus offset like (<br>, 1), and there is no child.
// Going from 0 to 1 is correct.
- return Position(n, usingComposedCharacters ? n->nextOffset(o) : o + 1);
+ return Position(n, usingComposedCharacters ? uncheckedNextOffset(n, o) : o + 1);
}
Node *parent = n->parentNode();
@@@ -175,6 -173,16 +175,16 @@@
return Position(parent, n->nodeIndex() + 1);
}
+ int Position::uncheckedPreviousOffset(const Node* n, int current)
+ {
+ return n->renderer() ? n->renderer()->previousOffset(current) : current - 1;
+ }
+
+ int Position::uncheckedNextOffset(const Node* n, int current)
+ {
+ return n->renderer() ? n->renderer()->nextOffset(current) : current + 1;
+ }
+
bool Position::atStart() const
{
Node *n = node();
@@@ -322,9 -330,9 +332,9 @@@ Position Position::upstream() cons
// return lastVisible on the next iteration, but we terminate early.
if (currentNode == enclosingBlock(currentNode) && currentPos.atStartOfNode())
return lastVisible;
-
- // Return position after brs, tables, and nodes which have content that can be ignored.
- if (editingIgnoresContent(currentNode) || renderer->isBR() || isTableElement(currentNode)) {
+
+ // Return position after tables and nodes which have content that can be ignored.
+ if (editingIgnoresContent(currentNode) || isTableElement(currentNode)) {
if (currentPos.atEndOfNode())
return Position(currentNode, maxDeepOffset(currentNode));
continue;
@@@ -394,8 -402,8 +404,8 @@@ Position Position::downstream() cons
if (isStreamer(currentPos))
lastVisible = currentPos;
- // Return position before brs, tables, and nodes which have content that can be ignored.
- if (editingIgnoresContent(currentNode) || renderer->isBR() || isTableElement(currentNode)) {
+ // Return position before tables and nodes which have content that can be ignored.
+ if (editingIgnoresContent(currentNode) || isTableElement(currentNode)) {
if (currentPos.offsetInLeafNode() <= renderer->caretMinOffset())
return Position(currentNode, renderer->caretMinOffset());
continue;
@@@ -495,6 -503,17 +505,17 @@@ bool Position::inRenderedText() cons
return false;
}
+ static unsigned caretMaxRenderedOffset(const Node* n)
+ {
+ RenderObject* r = n->renderer();
+ if (r)
+ return r->caretMaxRenderedOffset();
+
+ if (n->isCharacterDataNode())
+ return static_cast<const CharacterData*>(n)->length();
+ return 1;
+ }
+
bool Position::isRenderedCharacter() const
{
if (isNull() || !node()->isTextNode())
@@@ -574,8 -593,8 +595,8 @@@ bool Position::rendersInDifferentPositi
LOG(Editing, "thisRenderedOffset: %d\n", thisRenderedOffset);
LOG(Editing, "posRenderer: %p [%p]\n", posRenderer, posRenderer ? posRenderer->inlineBox(offset()) : 0);
LOG(Editing, "posRenderedOffset: %d\n", posRenderedOffset);
- LOG(Editing, "node min/max: %d:%d\n", node()->caretMinOffset(), node()->caretMaxRenderedOffset());
- LOG(Editing, "pos node min/max: %d:%d\n", pos.node()->caretMinOffset(), pos.node()->caretMaxRenderedOffset());
+ LOG(Editing, "node min/max: %d:%d\n", caretMinOffset(node()), caretMaxRenderedOffset(node()));
+ LOG(Editing, "pos node min/max: %d:%d\n", caretMinOffset(pos.node()), caretMaxRenderedOffset(pos.node()));
LOG(Editing, "----------------------------------------------------------------------\n");
InlineBox *b1 = renderer ? renderer->inlineBox(offset()) : 0;
@@@ -590,19 -609,19 +611,19 @@@
}
if (nextRenderedEditable(node()) == pos.node() &&
- thisRenderedOffset == (int)node()->caretMaxRenderedOffset() && posRenderedOffset == 0) {
+ thisRenderedOffset == (int)caretMaxRenderedOffset(node()) && posRenderedOffset == 0) {
return false;
}
if (previousRenderedEditable(node()) == pos.node() &&
- thisRenderedOffset == 0 && posRenderedOffset == (int)pos.node()->caretMaxRenderedOffset()) {
+ thisRenderedOffset == 0 && posRenderedOffset == (int)caretMaxRenderedOffset(pos.node())) {
return false;
}
return true;
}
- // This is only called from DeleteSelectionCommand and assumes that it starts in editable content.
+ // This assumes that it starts in editable content.
Position Position::leadingWhitespacePosition(EAffinity affinity, bool considerNonCollapsibleWhitespace) const
{
ASSERT(isEditablePosition(*this));
@@@ -624,7 -643,7 +645,7 @@@
return Position();
}
- // This is only called from DeleteSelectionCommand and assumes that it starts in editable content.
+ // This assumes that it starts in editable content.
Position Position::trailingWhitespacePosition(EAffinity affinity, bool considerNonCollapsibleWhitespace) const
{
ASSERT(isEditablePosition(*this));
diff --combined WebCore/editing/Selection.cpp
index d69bc49,32f6500..0a36c2b
--- a/WebCore/editing/Selection.cpp
+++ b/WebCore/editing/Selection.cpp
@@@ -33,7 -33,6 +33,7 @@@
#include "visible_units.h"
#include "Range.h"
#include <wtf/Assertions.h>
+#include <cstdio>
namespace WebCore {
@@@ -130,6 -129,10 +130,10 @@@ PassRefPtr<Range> Selection::toRange()
// incorrect results.
m_start.node()->document()->updateLayout();
+ // Check again, because updating layout can clear the selection.
+ if (isNone())
+ return 0;
+
Position s, e;
if (isCaret()) {
// If the selection is a caret, move the range start upstream. This helps us match
diff --combined WebCore/editing/SelectionController.cpp
index 0afe3e4,880876a..3816a68
--- a/WebCore/editing/SelectionController.cpp
+++ b/WebCore/editing/SelectionController.cpp
@@@ -30,6 -30,7 +30,7 @@@
#include "Document.h"
#include "Editor.h"
#include "Element.h"
+ #include "EventHandler.h"
#include "EventNames.h"
#include "ExceptionCode.h"
#include "FocusController.h"
@@@ -43,14 -44,13 +44,15 @@@
#include "HitTestResult.h"
#include "Page.h"
#include "Range.h"
+ #include "RenderTheme.h"
#include "RenderView.h"
#include "TextIterator.h"
#include "TypingCommand.h"
#include "htmlediting.h"
#include "visible_units.h"
+#include <cstdio>
+
#define EDIT_DEBUG 0
namespace WebCore {
@@@ -67,6 -67,7 +69,7 @@@ SelectionController::SelectionControlle
, m_isDragCaretController(isDragCaretController)
, m_isCaretBlinkingSuspended(false)
, m_xPosForVerticalArrowNavigation(NoXPosForVerticalArrowNavigation)
+ , m_focused(false)
{
}
@@@ -152,11 -153,14 +155,14 @@@ static bool removingNodeRemovesPosition
if (!position.node())
return false;
- if (position.node() == node || position.node()->isDescendantOf(node))
+ if (position.node() == node)
return true;
- Node* shadowAncestorNode = position.node()->shadowAncestorNode();
- return shadowAncestorNode && shadowAncestorNode->isDescendantOf(node);
+ if (!node->isElementNode())
+ return false;
+
+ Element* element = static_cast<Element*>(node);
+ return element->contains(position.node()) || element->contains(position.node()->shadowAncestorNode());
}
void SelectionController::nodeWillBeRemoved(Node *node)
@@@ -164,8 -168,8 +170,8 @@@
if (isNone())
return;
- bool baseRemoved = removingNodeRemovesPosition(node, m_sel.base());
- bool extentRemoved = removingNodeRemovesPosition(node, m_sel.extent());
+ bool baseRemoved = !m_sel.base().isCandidate() || removingNodeRemovesPosition(node, m_sel.base());
+ bool extentRemoved = !m_sel.extent().isCandidate() || removingNodeRemovesPosition(node, m_sel.extent());
bool startRemoved = removingNodeRemovesPosition(node, m_sel.start());
bool endRemoved = removingNodeRemovesPosition(node, m_sel.end());
@@@ -409,56 -413,6 +415,6 @@@ VisiblePosition SelectionController::mo
return pos;
}
- bool SelectionController::modify(const String &alterString, const String &directionString, const String &granularityString, bool userTriggered)
- {
- String alterStringLower = alterString.lower();
- EAlteration alter;
- if (alterStringLower == "extend")
- alter = EXTEND;
- else if (alterStringLower == "move")
- alter = MOVE;
- else
- return false;
-
- String directionStringLower = directionString.lower();
- EDirection direction;
- if (directionStringLower == "forward")
- direction = FORWARD;
- else if (directionStringLower == "backward")
- direction = BACKWARD;
- else if (directionStringLower == "left")
- direction = LEFT;
- else if (directionStringLower == "right")
- direction = RIGHT;
- else
- return false;
-
- String granularityStringLower = granularityString.lower();
- TextGranularity granularity;
- if (granularityStringLower == "character")
- granularity = CharacterGranularity;
- else if (granularityStringLower == "word")
- granularity = WordGranularity;
- else if (granularityStringLower == "sentence")
- granularity = SentenceGranularity;
- else if (granularityStringLower == "line")
- granularity = LineGranularity;
- else if (granularityStringLower == "paragraph")
- granularity = ParagraphGranularity;
- else if (granularityStringLower == "lineboundary")
- granularity = LineBoundary;
- else if (granularityStringLower == "sentenceboundary")
- granularity = SentenceBoundary;
- else if (granularityStringLower == "paragraphboundary")
- granularity = ParagraphBoundary;
- else if (granularityStringLower == "documentboundary")
- granularity = DocumentBoundary;
- else
- return false;
-
- return modify(alter, direction, granularity, userTriggered);
- }
-
bool SelectionController::modify(EAlteration alter, EDirection dir, TextGranularity granularity, bool userTriggered)
{
if (userTriggered) {
@@@ -708,240 -662,6 +664,6 @@@ void SelectionController::setNeedsLayou
m_needsLayout = flag;
}
- String SelectionController::type() const
- {
- if (isNone())
- return "None";
- else if (isCaret())
- return "Caret";
- else
- return "Range";
- }
-
- // These methods are accessible via JS (and are not used internally), so they must return valid DOM positions.
- Node* SelectionController::baseNode() const
- {
- Position base = rangeCompliantEquivalent(m_sel.base());
- return base.node();
- }
-
- int SelectionController::baseOffset() const
- {
- Position base = rangeCompliantEquivalent(m_sel.base());
- return base.offset();
- }
-
- Node* SelectionController::extentNode() const
- {
- Position extent = rangeCompliantEquivalent(m_sel.extent());
- return extent.node();
- }
-
- int SelectionController::extentOffset() const
- {
- Position extent = rangeCompliantEquivalent(m_sel.extent());
- return extent.offset();
- }
-
- Node* SelectionController::anchorNode() const
- {
- Position anchor = m_sel.isBaseFirst() ? m_sel.start() : m_sel.end();
- anchor = rangeCompliantEquivalent(anchor);
- return anchor.node();
- }
-
- int SelectionController::anchorOffset() const
- {
- Position anchor = m_sel.isBaseFirst() ? m_sel.start() : m_sel.end();
- anchor = rangeCompliantEquivalent(anchor);
- return anchor.offset();
- }
-
- Node* SelectionController::focusNode() const
- {
- Position focus = m_sel.isBaseFirst() ? m_sel.end() : m_sel.start();
- focus = rangeCompliantEquivalent(focus);
- return focus.node();
- }
-
- int SelectionController::focusOffset() const
- {
- Position focus = m_sel.isBaseFirst() ? m_sel.end() : m_sel.start();
- focus = rangeCompliantEquivalent(focus);
- return focus.offset();
- }
-
- String SelectionController::toString() const
- {
- return plainText(m_sel.toRange().get());
- }
-
- PassRefPtr<Range> SelectionController::getRangeAt(int index, ExceptionCode& ec) const
- {
- if (index < 0 || index >= rangeCount()) {
- ec = INDEX_SIZE_ERR;
- return 0;
- }
- return m_sel.toRange();
- }
-
- void SelectionController::removeAllRanges()
- {
- clear();
- }
-
- // Adds r to the currently selected range.
- void SelectionController::addRange(const Range* r)
- {
- if (!r)
- return;
-
- if (isNone()) {
- setSelection(Selection(r));
- return;
- }
-
- RefPtr<Range> range = m_sel.toRange();
- ExceptionCode ec = 0;
- if (r->compareBoundaryPoints(Range::START_TO_START, range.get(), ec) == -1) {
- // We don't support discontiguous selection. We don't do anything if r and range don't intersect.
- if (r->compareBoundaryPoints(Range::END_TO_START, range.get(), ec) > -1) {
- if (r->compareBoundaryPoints(Range::END_TO_END, range.get(), ec) == -1)
- // The original range and r intersect.
- setSelection(Selection(r->startPosition(), range->endPosition(), DOWNSTREAM));
- else
- // r contains the original range.
- setSelection(Selection(r));
- }
- } else {
- // We don't support discontiguous selection. We don't do anything if r and range don't intersect.
- if (r->compareBoundaryPoints(Range::START_TO_END, range.get(), ec) < 1) {
- if (r->compareBoundaryPoints(Range::END_TO_END, range.get(), ec) == -1)
- // The original range contains r.
- setSelection(Selection(range.get()));
- else
- // The original range and r intersect.
- setSelection(Selection(range->startPosition(), r->endPosition(), DOWNSTREAM));
- }
- }
- }
-
- void SelectionController::deleteFromDocument()
- {
- if (isNone())
- return;
-
- if (isCollapsed())
- modify(EXTEND, BACKWARD, CharacterGranularity);
-
- RefPtr<Range> selectedRange = m_sel.toRange();
-
- ExceptionCode ec = 0;
- selectedRange->deleteContents(ec);
- ASSERT(!ec);
-
- setBaseAndExtent(selectedRange->startContainer(ec), selectedRange->startOffset(ec), selectedRange->startContainer(ec), selectedRange->startOffset(ec), ec);
- ASSERT(!ec);
- }
-
- bool SelectionController::containsNode(const Node* n, bool allowPartial) const
- {
- if (!n || isNone())
- return false;
-
- Node* parentNode = n->parentNode();
- unsigned nodeIndex = n->nodeIndex();
- RefPtr<Range> selectedRange = m_sel.toRange();
-
- if (!parentNode)
- return false;
-
- ExceptionCode ec = 0;
- bool nodeFullySelected = Range::compareBoundaryPoints(parentNode, nodeIndex, selectedRange->startContainer(ec), selectedRange->startOffset(ec)) >= 0
- && Range::compareBoundaryPoints(parentNode, nodeIndex + 1, selectedRange->endContainer(ec), selectedRange->endOffset(ec)) <= 0;
- ASSERT(!ec);
- if (nodeFullySelected)
- return true;
-
- bool nodeFullyUnselected = Range::compareBoundaryPoints(parentNode, nodeIndex, selectedRange->endContainer(ec), selectedRange->endOffset(ec)) > 0
- || Range::compareBoundaryPoints(parentNode, nodeIndex + 1, selectedRange->startContainer(ec), selectedRange->startOffset(ec)) < 0;
- ASSERT(!ec);
- if (nodeFullyUnselected)
- return false;
-
- return allowPartial || n->isTextNode();
- }
-
- void SelectionController::selectAllChildren(Node* n, ExceptionCode& ec)
- {
- if (!n)
- return;
-
- // This doesn't (and shouldn't) select text node characters.
- setBaseAndExtent(n, 0, n, n->childNodeCount(), ec);
- }
-
- void SelectionController::setBaseAndExtent(Node *baseNode, int baseOffset, Node *extentNode, int extentOffset, ExceptionCode& ec)
- {
- if (baseOffset < 0 || extentOffset < 0) {
- ec = INDEX_SIZE_ERR;
- return;
- }
- VisiblePosition visibleBase = VisiblePosition(baseNode, baseOffset, DOWNSTREAM);
- VisiblePosition visibleExtent = VisiblePosition(extentNode, extentOffset, DOWNSTREAM);
-
- moveTo(visibleBase, visibleExtent);
- }
-
- void SelectionController::setPosition(Node *node, int offset, ExceptionCode& ec)
- {
- if (offset < 0) {
- ec = INDEX_SIZE_ERR;
- return;
- }
- moveTo(VisiblePosition(node, offset, DOWNSTREAM));
- }
-
- void SelectionController::collapse(Node *node, int offset, ExceptionCode& ec)
- {
- if (offset < 0) {
- ec = INDEX_SIZE_ERR;
- return;
- }
- moveTo(VisiblePosition(node, offset, DOWNSTREAM));
- }
-
- void SelectionController::collapseToEnd()
- {
- moveTo(VisiblePosition(m_sel.end(), DOWNSTREAM));
- }
-
- void SelectionController::collapseToStart()
- {
- moveTo(VisiblePosition(m_sel.start(), DOWNSTREAM));
- }
-
- void SelectionController::empty()
- {
- moveTo(VisiblePosition());
- }
-
- void SelectionController::extend(Node* node, int offset, ExceptionCode& ec)
- {
- if (!node) {
- ec = TYPE_MISMATCH_ERR;
- return;
- }
- if (offset < 0
- || node->offsetInCharacters() && offset > node->caretMaxOffset()
- || !node->offsetInCharacters() && offset > (int)node->childNodeCount()) {
- ec = INDEX_SIZE_ERR;
- return;
- }
- m_sel.expandUsingGranularity(CharacterGranularity);
- setExtent(VisiblePosition(node, offset, DOWNSTREAM));
- }
-
void SelectionController::layout()
{
if (isNone() || !m_sel.start().node()->inDocument() || !m_sel.end().node()->inDocument()) {
@@@ -987,17 -707,9 +709,9 @@@ IntRect SelectionController::caretRect(
return caret;
}
- static IntRect repaintRectForCaret(IntRect caret)
- {
- if (caret.isEmpty())
- return IntRect();
- caret.inflate(1);
- return caret;
- }
-
IntRect SelectionController::caretRepaintRect() const
{
- return repaintRectForCaret(caretRect());
+ return caretRect();
}
bool SelectionController::recomputeCaretRect()
@@@ -1018,8 -730,8 +732,8 @@@
if (oldRect == newRect)
return false;
- v->updateContents(repaintRectForCaret(oldRect), false);
- v->updateContents(repaintRectForCaret(newRect), false);
+ v->updateContents(oldRect, false);
+ v->updateContents(newRect, false);
return true;
}
@@@ -1246,22 -958,19 +960,19 @@@ void SelectionController::selectAll(
m_frame->notifyRendererOfSelectionChange(true);
}
- void SelectionController::setSelectedRange(Range* range, EAffinity affinity, bool closeTyping, ExceptionCode& ec)
+ bool SelectionController::setSelectedRange(Range* range, EAffinity affinity, bool closeTyping)
{
- ec = 0;
-
- if (!range) {
- ec = INVALID_STATE_ERR;
- return;
- }
-
+ if (!range)
+ return false;
+
+ ExceptionCode ec = 0;
Node* startContainer = range->startContainer(ec);
if (ec)
- return;
+ return false;
Node* endContainer = range->endContainer(ec);
if (ec)
- return;
+ return false;
ASSERT(startContainer);
ASSERT(endContainer);
@@@ -1273,20 -982,21 +984,21 @@@
// they start at the beginning of the next line instead
bool collapsed = range->collapsed(ec);
if (ec)
- return;
+ return false;
int startOffset = range->startOffset(ec);
if (ec)
- return;
+ return false;
int endOffset = range->endOffset(ec);
if (ec)
- return;
+ return false;
// FIXME: Can we provide extentAffinity?
VisiblePosition visibleStart(startContainer, startOffset, collapsed ? affinity : DOWNSTREAM);
VisiblePosition visibleEnd(endContainer, endOffset, SEL_DEFAULT_AFFINITY);
setSelection(Selection(visibleStart, visibleEnd), closeTyping);
+ return true;
}
bool SelectionController::isInPasswordField() const
@@@ -1312,6 -1022,61 +1024,61 @@@ bool SelectionController::isInsideNode(
return false;
return !isTableElement(startNode) && !editingIgnoresContent(startNode);
}
+
+ void SelectionController::focusedOrActiveStateChanged()
+ {
+ bool activeAndFocused = isFocusedAndActive();
+
+ // Because RenderObject::selectionBackgroundColor() and
+ // RenderObject::selectionForegroundColor() check if the frame is active,
+ // we have to update places those colors were painted.
+ if (m_frame->view())
+ m_frame->view()->updateContents(enclosingIntRect(m_frame->selectionRect()));
+
+ // Caret appears in the active frame.
+ if (activeAndFocused)
+ m_frame->setSelectionFromNone();
+ m_frame->setCaretVisible(activeAndFocused);
+
+ // Update for caps lock state
+ m_frame->eventHandler()->capsLockStateMayHaveChanged();
+
+ // Because CSSStyleSelector::checkOneSelector() and
+ // RenderTheme::isFocused() check if the frame is active, we have to
+ // update style and theme state that depended on those.
+ if (Node* node = m_frame->document()->focusedNode()) {
+ node->setChanged();
+ if (RenderObject* renderer = node->renderer())
+ if (renderer && renderer->style()->hasAppearance())
+ theme()->stateChanged(renderer, FocusState);
+ }
+
+ // Secure keyboard entry is set by the active frame.
+ if (m_frame->document()->useSecureKeyboardEntryWhenActive())
+ m_frame->setUseSecureKeyboardEntry(activeAndFocused);
+ }
+
+ void SelectionController::pageActivationChanged()
+ {
+ focusedOrActiveStateChanged();
+ }
+
+ void SelectionController::setFocused(bool flag)
+ {
+ if (m_focused == flag)
+ return;
+ m_focused = flag;
+
+ focusedOrActiveStateChanged();
+
+ if (Document* doc = m_frame->document())
+ doc->dispatchWindowEvent(flag ? focusEvent : blurEvent, false, false);
+ }
+
+ bool SelectionController::isFocusedAndActive() const
+ {
+ return m_focused && m_frame->page() && m_frame->page()->focusController()->isActive();
+ }
#ifndef NDEBUG
diff --combined WebCore/loader/FTPDirectoryParser.cpp
index e36013d,fdda0b6..f350e95
--- a/WebCore/loader/FTPDirectoryParser.cpp
+++ b/WebCore/loader/FTPDirectoryParser.cpp
@@@ -24,12 -24,34 +24,35 @@@
#if ENABLE(FTPDIR)
#include "FTPDirectoryParser.h"
+ // On Win, the threadsafe *_r functions need to be gotten from pthreads.
+ #if COMPILER(MSVC) && USE(PTHREADS)
+ #include <pthread.h>
+ #endif
+
#include <wtf/ASCIICType.h>
+#include <cstdio>
using namespace WTF;
+ #if PLATFORM(QT)
+ #include <QDateTime>
+ #endif
+
namespace WebCore {
+ #if PLATFORM(QT) && defined(Q_WS_WIN32)
+ // Defined in FTPDirectoryDocument.cpp.
+ struct tm gmtimeQt(const QDateTime &input);
+
+ static struct tm *gmtimeQt(const time_t *const timep, struct tm *result)
+ {
+ const QDateTime dt(QDateTime::fromTime_t(*timep));
+ *result = WebCore::gmtimeQt(dt);
+ return result;
+ }
+
+ #define gmtime_r(x, y) gmtimeQt(x, y)
+ #endif
+
FTPEntryType parseOneFTPLine(const char* line, ListState& state, ListResult& result)
{
@@@ -110,10 -132,6 +133,6 @@@
}
/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
- #if PLATFORM(QT) && defined(Q_WS_WIN32)
- #define gmtime_r(x, y) gmtime_s(y, x)
- #endif
-
#if defined(SUPPORT_EPLF)
/* EPLF handling must come somewhere before /bin/dls handling. */
if (!lstyle && (!state.listStyle || state.listStyle == 'E'))
diff --combined WebCore/loader/icon/IconDatabase.cpp
index e4502a3,f7431e1..0358e91
--- a/WebCore/loader/icon/IconDatabase.cpp
+++ b/WebCore/loader/icon/IconDatabase.cpp
@@@ -1,5 -1,6 +1,6 @@@
/*
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2007 Justin Haygood (jhaygood at reaktix.com)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@@ -49,7 -50,9 +50,7 @@@
#include <sys/stat.h>
#endif
-#if PLATFORM(DARWIN)
#include <pthread.h>
-#endif
#include <errno.h>
@@@ -57,7 -60,7 +58,7 @@@
#define ASSERT_NOT_SYNC_THREAD() ASSERT(!m_syncThreadRunning || !IS_ICON_SYNC_THREAD())
// For methods that are meant to support the sync thread ONLY
- #define IS_ICON_SYNC_THREAD() pthread_equal(pthread_self(), m_syncThread)
+ #define IS_ICON_SYNC_THREAD() (m_syncThread == currentThread())
#define ASSERT_ICON_SYNC_THREAD() ASSERT(IS_ICON_SYNC_THREAD())
namespace WebCore {
@@@ -138,13 -141,14 +139,14 @@@ bool IconDatabase::open(const String& d
// Formulate the full path for the database file
m_completeDatabasePath = pathByAppendingComponent(m_databaseDirectory, defaultDatabaseFilename());
- // Lock here as well as first thing in the thread so the tread doesn't actually commence until the pthread_create() call
+ // Lock here as well as first thing in the thread so the thread doesn't actually commence until the createThread() call
// completes and m_syncThreadRunning is properly set
m_syncLock.lock();
- m_syncThreadRunning = !pthread_create(&m_syncThread, NULL, IconDatabase::iconDatabaseSyncThreadStart, this);
+ m_syncThread = createThread(IconDatabase::iconDatabaseSyncThreadStart, this);
m_syncLock.unlock();
-
- return m_syncThreadRunning;
+ if (!m_syncThread)
+ return false;
+ return true;
}
void IconDatabase::close()
@@@ -159,8 -163,7 +161,7 @@@
wakeSyncThread();
// Wait for the sync thread to terminate
- if (pthread_join(m_syncThread, NULL) == EDEADLK)
- LOG_ERROR("m_syncThread was found to be deadlocked trying to quit");
+ waitForThreadCompletion(m_syncThread, 0);
}
m_syncThreadRunning = false;
@@@ -1115,7 -1118,7 +1116,7 @@@ void IconDatabase::performOpenInitializ
}
if (!isValidDatabase(m_syncDB)) {
- LOG(IconDatabase, "%s is missing or in an invalid state - reconstructing", m_syncDB.path().ascii().data());
+ LOG(IconDatabase, "%s is missing or in an invalid state - reconstructing", m_completeDatabasePath.ascii().data());
m_syncDB.clearAllTables();
createDatabaseTables(m_syncDB);
}
@@@ -1284,7 -1287,7 +1285,7 @@@ void IconDatabase::performURLImport(
}
}
- LOG(IconDatabase, "Notifying %i interested page URLs that their icon URL is known due to the import", urlsToNotify.size());
+ LOG(IconDatabase, "Notifying %zu interested page URLs that their icon URL is known due to the import", urlsToNotify.size());
// Now that we don't hold any locks, perform the actual notifications
for (unsigned i = 0; i < urlsToNotify.size(); ++i) {
LOG(IconDatabase, "Notifying icon info known for pageURL %s", urlsToNotify[i].ascii().data());
@@@ -1524,7 -1527,7 +1525,7 @@@ bool IconDatabase::writeToDatabase(
for (unsigned i = 0; i < iconSnapshots.size(); ++i) {
writeIconSnapshotToSQLDatabase(iconSnapshots[i]);
- LOG(IconDatabase, "Wrote IconRecord for IconURL %s with timeStamp of %li to the DB", urlForLogging(iconSnapshots[i].iconURL).ascii().data(), iconSnapshots[i].timestamp);
+ LOG(IconDatabase, "Wrote IconRecord for IconURL %s with timeStamp of %i to the DB", urlForLogging(iconSnapshots[i].iconURL).ascii().data(), iconSnapshots[i].timestamp);
}
for (unsigned i = 0; i < pageSnapshots.size(); ++i) {
@@@ -1806,7 -1809,7 +1807,7 @@@ void IconDatabase::setIconIDForPageURLI
ASSERT_ICON_SYNC_THREAD();
readySQLiteStatement(m_setIconIDForPageURLStatement, m_syncDB, "INSERT INTO PageURL (url, iconID) VALUES ((?), ?);");
- m_setIconIDForPageURLStatement->bindText16(1, pageURL, false);
+ m_setIconIDForPageURLStatement->bindText(1, pageURL);
m_setIconIDForPageURLStatement->bindInt64(2, iconID);
int result = m_setIconIDForPageURLStatement->step();
@@@ -1823,7 -1826,7 +1824,7 @@@ void IconDatabase::removePageURLFromSQL
ASSERT_ICON_SYNC_THREAD();
readySQLiteStatement(m_removePageURLStatement, m_syncDB, "DELETE FROM PageURL WHERE url = (?);");
- m_removePageURLStatement->bindText16(1, pageURL, false);
+ m_removePageURLStatement->bindText(1, pageURL);
if (m_removePageURLStatement->step() != SQLResultDone)
LOG_ERROR("removePageURLFromSQLDatabase failed for url %s", urlForLogging(pageURL).ascii().data());
@@@ -1837,7 -1840,7 +1838,7 @@@ int64_t IconDatabase::getIconIDForIconU
ASSERT_ICON_SYNC_THREAD();
readySQLiteStatement(m_getIconIDForIconURLStatement, m_syncDB, "SELECT IconInfo.iconID FROM IconInfo WHERE IconInfo.url = (?);");
- m_getIconIDForIconURLStatement->bindText16(1, iconURL, false);
+ m_getIconIDForIconURLStatement->bindText(1, iconURL);
int64_t result = m_getIconIDForIconURLStatement->step();
if (result == SQLResultRow)
@@@ -1861,7 -1864,7 +1862,7 @@@ int64_t IconDatabase::addIconURLToSQLDa
// here is unnecessary
readySQLiteStatement(m_addIconToIconInfoStatement, m_syncDB, "INSERT INTO IconInfo (url, stamp) VALUES (?, 0);");
- m_addIconToIconInfoStatement->bindText16(1, iconURL);
+ m_addIconToIconInfoStatement->bindText(1, iconURL);
int result = m_addIconToIconInfoStatement->step();
m_addIconToIconInfoStatement->reset();
@@@ -1891,7 -1894,7 +1892,7 @@@ PassRefPtr<SharedBuffer> IconDatabase::
RefPtr<SharedBuffer> imageData;
readySQLiteStatement(m_getImageDataForIconURLStatement, m_syncDB, "SELECT IconData.data FROM IconData WHERE IconData.iconID IN (SELECT iconID FROM IconInfo WHERE IconInfo.url = (?));");
- m_getImageDataForIconURLStatement->bindText16(1, iconURL, false);
+ m_getImageDataForIconURLStatement->bindText(1, iconURL);
int result = m_getImageDataForIconURLStatement->step();
if (result == SQLResultRow) {
@@@ -1971,7 -1974,7 +1972,7 @@@ void IconDatabase::writeIconSnapshotToS
if (iconID) {
readySQLiteStatement(m_updateIconInfoStatement, m_syncDB, "UPDATE IconInfo SET stamp = ?, url = ? WHERE iconID = ?;");
m_updateIconInfoStatement->bindInt64(1, snapshot.timestamp);
- m_updateIconInfoStatement->bindText16(2, snapshot.iconURL);
+ m_updateIconInfoStatement->bindText(2, snapshot.iconURL);
m_updateIconInfoStatement->bindInt64(3, iconID);
if (m_updateIconInfoStatement->step() != SQLResultDone)
@@@ -1995,7 -1998,7 +1996,7 @@@
m_updateIconDataStatement->reset();
} else {
readySQLiteStatement(m_setIconInfoStatement, m_syncDB, "INSERT INTO IconInfo (url,stamp) VALUES (?, ?);");
- m_setIconInfoStatement->bindText16(1, snapshot.iconURL);
+ m_setIconInfoStatement->bindText(1, snapshot.iconURL);
m_setIconInfoStatement->bindInt64(2, snapshot.timestamp);
if (m_setIconInfoStatement->step() != SQLResultDone)
diff --combined WebCore/platform/text/TextCodecLatin1.cpp
index 0000000,a687235..ad01511
mode 000000,100644..100644
--- a/WebCore/platform/text/TextCodecLatin1.cpp
+++ b/WebCore/platform/text/TextCodecLatin1.cpp
@@@ -1,0 -1,202 +1,204 @@@
+ /*
+ * Copyright (C) 2004, 2006, 2008 Apple 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "TextCodecLatin1.h"
+
+ #include "CString.h"
+ #include "PlatformString.h"
+ #include "StringBuffer.h"
+
++#include <cstdio>
++
+ using std::auto_ptr;
+
+ namespace WebCore {
+
+ static const UChar table[256] = {
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, // 00-07
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, // 08-0F
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, // 10-17
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, // 18-1F
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, // 20-27
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, // 28-2F
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 30-37
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, // 38-3F
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 40-47
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, // 48-4F
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 50-57
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, // 58-5F
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 60-67
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, // 68-6F
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // 70-77
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, // 78-7F
+ 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, // 80-87
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F, // 88-8F
+ 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, // 90-97
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, // 98-9F
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, // A0-A7
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, // A8-AF
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, // B0-B7
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, // B8-BF
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, // C0-C7
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, // C8-CF
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, // D0-D7
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, // D8-DF
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, // E0-E7
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, // E8-EF
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, // F0-F7
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF // F8-FF
+ };
+
+ void TextCodecLatin1::registerEncodingNames(EncodingNameRegistrar registrar)
+ {
+ registrar("windows-1252", "windows-1252");
+ registrar("ISO-8859-1", "ISO-8859-1");
+ registrar("US-ASCII", "US-ASCII");
+
+ registrar("WinLatin1", "windows-1252");
+ registrar("ibm-1252", "windows-1252");
+ registrar("ibm-1252_P100-2000", "windows-1252");
+
+ registrar("8859-1", "ISO-8859-1");
+ registrar("CP819", "ISO-8859-1");
+ registrar("IBM819", "ISO-8859-1");
+ registrar("csISOLatin1", "ISO-8859-1");
+ registrar("iso-ir-100", "ISO-8859-1");
+ registrar("iso_8859-1:1987", "ISO-8859-1");
+ registrar("l1", "ISO-8859-1");
+ registrar("latin1", "ISO-8859-1");
+
+ registrar("ANSI_X3.4-1968", "US-ASCII");
+ registrar("ANSI_X3.4-1986", "US-ASCII");
+ registrar("ASCII", "US-ASCII");
+ registrar("IBM367", "US-ASCII");
+ registrar("ISO646-US", "US-ASCII");
+ registrar("ISO_646.irv:1991", "US-ASCII");
+ registrar("cp367", "US-ASCII");
+ registrar("csASCII", "US-ASCII");
+ registrar("ibm-367_P100-1995", "US-ASCII");
+ registrar("iso-ir-6", "US-ASCII");
+ registrar("iso-ir-6-us", "US-ASCII");
+ registrar("us", "US-ASCII");
+ registrar("x-ansi", "US-ASCII");
+ }
+
+ static auto_ptr<TextCodec> newStreamingTextDecoderWindowsLatin1(const TextEncoding&, const void*)
+ {
+ return auto_ptr<TextCodec>(new TextCodecLatin1);
+ }
+
+ void TextCodecLatin1::registerCodecs(TextCodecRegistrar registrar)
+ {
+ registrar("windows-1252", newStreamingTextDecoderWindowsLatin1, 0);
+
+ // ASCII and Latin-1 both decode as Windows Latin-1 although they retain unique identities.
+ registrar("ISO-8859-1", newStreamingTextDecoderWindowsLatin1, 0);
+ registrar("US-ASCII", newStreamingTextDecoderWindowsLatin1, 0);
+ }
+
+ String TextCodecLatin1::decode(const char* bytes, size_t length, bool)
+ {
+ StringBuffer characters(length);
+
+ // Convert the string a fast way and simultaneously do an efficient check to see if it's all ASCII.
+ unsigned char ored = 0;
+ for (size_t i = 0; i < length; ++i) {
+ unsigned char c = bytes[i];
+ characters[i] = c;
+ ored |= c;
+ }
+
+ if (!(ored & 0x80))
+ return String::adopt(characters);
+
+ // Convert the slightly slower way when there are non-ASCII characters.
+ for (size_t i = 0; i < length; ++i) {
+ unsigned char c = bytes[i];
+ characters[i] = table[c];
+ }
+
+ return String::adopt(characters);
+ }
+
+ static CString encodeComplexWindowsLatin1(const UChar* characters, size_t length, bool allowEntities)
+ {
+ Vector<char> result(length);
+ char* bytes = result.data();
+
+ size_t resultLength = 0;
+ for (size_t i = 0; i < length; ) {
+ UChar32 c;
+ U16_NEXT(characters, i, length, c);
+ unsigned char b = c;
+ // Do an efficient check to detect characters other than 00-7F and A0-FF.
+ if (b != c || (c & 0xE0) == 0x80) {
+ // Look for a way to encode this with Windows Latin-1.
+ for (b = 0x80; b < 0xA0; ++b)
+ if (table[b] == c)
+ goto gotByte;
+ // No way to encode this character with Windows Latin-1.
+ if (allowEntities) {
+ char entityBuffer[16];
+ sprintf(entityBuffer, "&#%u;", c);
+ size_t entityLength = strlen(entityBuffer);
+ result.grow(resultLength + entityLength + length - i);
+ bytes = result.data();
+ memcpy(bytes + resultLength, entityBuffer, entityLength);
+ resultLength += entityLength;
+ continue;
+ }
+ b = '?';
+ }
+ gotByte:
+ bytes[resultLength++] = b;
+ }
+
+ return CString(bytes, resultLength);
+ }
+
+ CString TextCodecLatin1::encode(const UChar* characters, size_t length, bool allowEntities)
+ {
+ {
+ char* bytes;
+ CString string = CString::newUninitialized(length, bytes);
+
+ // Convert the string a fast way and simultaneously do an efficient check to see if it's all ASCII.
+ UChar ored = 0;
+ for (size_t i = 0; i < length; ++i) {
+ UChar c = characters[i];
+ bytes[i] = c;
+ ored |= c;
+ }
+
+ if (!(ored & 0xFF80))
+ return string;
+ }
+
+ // If it wasn't all ASCII, call the function that handles more-complex cases.
+ return encodeComplexWindowsLatin1(characters, length, allowEntities);
+ }
+
+ } // namespace WebCore
diff --combined WebCore/platform/text/TextCodecUserDefined.cpp
index 0000000,a420992..54af7ba
mode 000000,100644..100644
--- a/WebCore/platform/text/TextCodecUserDefined.cpp
+++ b/WebCore/platform/text/TextCodecUserDefined.cpp
@@@ -1,0 -1,114 +1,116 @@@
+ /*
+ * Copyright (C) 2007, 2008 Apple, 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "TextCodecUserDefined.h"
+
+ #include "CString.h"
+ #include "PlatformString.h"
+ #include "StringBuffer.h"
+
++#include <cstdio>
++
+ using std::auto_ptr;
+
+ namespace WebCore {
+
+ void TextCodecUserDefined::registerEncodingNames(EncodingNameRegistrar registrar)
+ {
+ registrar("x-user-defined", "x-user-defined");
+ }
+
+ static auto_ptr<TextCodec> newStreamingTextDecoderUserDefined(const TextEncoding&, const void*)
+ {
+ return auto_ptr<TextCodec>(new TextCodecUserDefined);
+ }
+
+ void TextCodecUserDefined::registerCodecs(TextCodecRegistrar registrar)
+ {
+ registrar("x-user-defined", newStreamingTextDecoderUserDefined, 0);
+ }
+
+ String TextCodecUserDefined::decode(const char* bytes, size_t length, bool)
+ {
+ StringBuffer buffer(length);
+
+ for (size_t i = 0; i < length; ++i) {
+ signed char c = bytes[i];
+ buffer[i] = c & 0xF7FF;
+ }
+
+ return String::adopt(buffer);
+ }
+
+ static CString encodeComplexUserDefined(const UChar* characters, size_t length, bool allowEntities)
+ {
+ Vector<char> result(length);
+ char* bytes = result.data();
+
+ size_t resultLength = 0;
+ for (size_t i = 0; i < length; ) {
+ UChar32 c;
+ U16_NEXT(characters, i, length, c);
+ signed char signedByte = c;
+ if ((signedByte & 0xf7ff) == c)
+ bytes[resultLength++] = signedByte;
+ else {
+ // No way to encode this character with x-user-defined.
+ if (allowEntities) {
+ char entityBuffer[16];
+ sprintf(entityBuffer, "&#%u;", c);
+ size_t entityLength = strlen(entityBuffer);
+ result.grow(resultLength + entityLength + length - i);
+ bytes = result.data();
+ memcpy(bytes + resultLength, entityBuffer, entityLength);
+ resultLength += entityLength;
+ } else
+ bytes[resultLength++] = '?';
+ }
+ }
+
+ return CString(bytes, resultLength);
+ }
+
+ CString TextCodecUserDefined::encode(const UChar* characters, size_t length, bool allowEntities)
+ {
+ char* bytes;
+ CString string = CString::newUninitialized(length, bytes);
+
+ // Convert the string a fast way and simultaneously do an efficient check to see if it's all ASCII.
+ UChar ored = 0;
+ for (size_t i = 0; i < length; ++i) {
+ UChar c = characters[i];
+ bytes[i] = c;
+ ored |= c;
+ }
+
+ if (!(ored & 0xFF80))
+ return string;
+
+ // If it wasn't all ASCII, call the function that handles more-complex cases.
+ return encodeComplexUserDefined(characters, length, allowEntities);
+ }
+
+ } // namespace WebCore
diff --combined WebCore/platform/text/TextStream.cpp
index 0000000,b23e769..e2b998e
mode 000000,100644..100644
--- a/WebCore/platform/text/TextStream.cpp
+++ b/WebCore/platform/text/TextStream.cpp
@@@ -1,0 -1,170 +1,171 @@@
+ /*
+ * Copyright (C) 2004, 2008 Apple 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "TextStream.h"
+
+ #include "DeprecatedString.h"
+ #include "Logging.h"
+ #include "PlatformString.h"
+ #include <wtf/Vector.h>
++#include <cstdio>
+
+ namespace WebCore {
+
+ const size_t integerOrPointerAsStringBufferSize = 100; // large enough for any integer or pointer in string format, including trailing null character
+ const char* const precisionFormats[7] = { "%.0f", "%.1f", "%.2f", "%.3f", "%.4f", "%.5f", "%.6f"};
+ const int maxPrecision = 6; // must match size of precisionFormats
+ const int defaultPrecision = 6; // matches qt and sprintf(.., "%f", ...) behaviour
+
+ TextStream::TextStream(DeprecatedString* s)
+ : m_hasByteArray(false), m_string(s), m_precision(defaultPrecision)
+ {
+ }
+
+ TextStream& TextStream::operator<<(char c)
+ {
+ if (m_hasByteArray)
+ m_byteArray.append(c);
+
+ if (m_string)
+ m_string->append(DeprecatedChar(c));
+ return *this;
+ }
+
+ TextStream& TextStream::operator<<(short i)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%d", i);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(unsigned short i)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%u", i);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(int i)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%d", i);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(unsigned i)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%u", i);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(long i)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%ld", i);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(unsigned long i)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%lu", i);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(float f)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, precisionFormats[m_precision], f);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(double d)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, precisionFormats[m_precision], d);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(const char* s)
+ {
+ if (m_hasByteArray) {
+ unsigned length = strlen(s);
+ unsigned oldSize = m_byteArray.size();
+ m_byteArray.grow(oldSize + length);
+ memcpy(m_byteArray.data() + oldSize, s, length);
+ }
+ if (m_string)
+ m_string->append(s);
+ return *this;
+ }
+
+ TextStream& TextStream::operator<<(const DeprecatedString& s)
+ {
+ if (m_hasByteArray) {
+ unsigned length = s.length();
+ unsigned oldSize = m_byteArray.size();
+ m_byteArray.grow(oldSize + length);
+ memcpy(m_byteArray.data() + oldSize, s.latin1(), length);
+ }
+ if (m_string)
+ m_string->append(s);
+ return *this;
+ }
+
+ TextStream& TextStream::operator<<(const String& s)
+ {
+ return (*this) << s.deprecatedString();
+ }
+
+ TextStream& TextStream::operator<<(void* p)
+ {
+ char buffer[integerOrPointerAsStringBufferSize];
+ sprintf(buffer, "%p", p);
+ return *this << buffer;
+ }
+
+ TextStream& TextStream::operator<<(const TextStreamManipulator& m)
+ {
+ return m(*this);
+ }
+
+ int TextStream::precision(int p)
+ {
+ int oldPrecision = m_precision;
+
+ if (p >= 0 && p <= maxPrecision)
+ m_precision = p;
+
+ return oldPrecision;
+ }
+
+ TextStream &endl(TextStream& stream)
+ {
+ return stream << '\n';
+ }
+
+ }
diff --combined WebKit.pro
index 1673736,bc14feb..9af411c
--- a/WebKit.pro
+++ b/WebKit.pro
@@@ -1,10 -1,14 +1,13 @@@
TEMPLATE = subdirs
CONFIG += ordered
!gtk-port:CONFIG += qt-port
- qt-port:!win32-*:SUBDIRS += WebKit/qt/Plugins
+ qt-port {
+ lessThan(QT_MINOR_VERSION, 4) {
+ !win32-*:SUBDIRS += WebKit/qt/Plugins
+ }
+ }
SUBDIRS += \
- JavaScriptCore/pcre/dftables.pro \
- WebCore \
- JavaScriptCore/kjs/testkjs.pro
+ WebCore
qt-port {
SUBDIRS += WebKit/qt/QtLauncher
@@@ -13,4 -17,5 +16,5 @@@
}
gtk-port:SUBDIRS += \
- WebKitTools/GtkLauncher
+ WebKitTools/GtkLauncher \
+ WebKitTools/DumpRenderTree/gtk/DumpRenderTree.pro
diff --combined debian/changelog
index bdf36d3,97283ec..933c68c
--- a/debian/changelog
+++ b/debian/changelog
@@@ -1,35 -1,25 +1,57 @@@
+webkit (0~svn27674-4) unstable; urgency=low
+
+ * debian/rules: Revert change from 0~svn27674-3, which was obviously not
+ enough.
+ * WebKit.pro: Don't build testkjs, that provokes the s390 FTBFSes ; we don't
+ install it anyways. Closes: #466848.
+ * JavaScriptCore/kjs/interpreter.cpp, JavaScriptCore/wtf/ASCIICType.h,
+ WebCore/dom/Position.cpp, WebCore/editing/Selection.cpp,
+ WebCore/editing/SelectionController.cpp,
+ WebCore/editing/VisiblePosition.cpp,
+ WebCore/ksvg2/svg/SVGFontFaceElement.cpp,
+ WebCore/loader/FTPDirectoryParser.cpp,
+ WebCore/loader/icon/IconDatabase.cpp,
+ WebCore/platform/TextCodecLatin1.cpp,
+ WebCore/platform/TextCodecUserDefined.cpp,
+ WebCore/platform/TextStream.cpp,
+ WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp: Fix FTBFS with
+ gcc 4.3 due to missing includes. Closes: #455125.
+
+ -- Mike Hommey <glandium at debian.org> Thu, 21 Feb 2008 23:01:12 +0100
+
+webkit (0~svn27674-3) unstable; urgency=low
+
+ * debian/rules: Work around #466613 (FTBFS on s390) by building a little bit
+ less optimized (-O1). Thanks to Josselin Mouette.
+ * debian/control:
+ - Add Vcs-Browser and Vcs-Git fields, and turn Homepage indications in
+ descriptions into a control field.
+ - Bumped Standards-Version to 3.7.3.0. No changes.
+
+ -- Mike Hommey <glandium at debian.org> Wed, 20 Feb 2008 21:49:33 +0100
+
+ webkit (0~svn29752-1) experimental; urgency=low
+
+ * New upstream snapshot
+ * debian/copyright: Updated to fit additions/removals of files upstream.
+ * JavaScriptCore/wtf/TCSpinLock.h: Revert our work-around, now that a
+ proper patch has been applied upstream.
+ * WebCore/WebCore.pro: Don't use Qt version as SO version for QtWebKit.
+ * debian/control, debian/rules, debian/lib*0d.install: Bump SO version to
+ 1d because of ABI incompatible changes, and change package names
+ accordingly.
+ * debian/rules: Don't remove -lqtwebico from QtWebKit.pc, since it's not
+ here anymore.
+ * debian/rules, debian/lib*1d.install:
+ - Install new Gtk port's DumpRenderTree tool.
+ - Rename both port's DumpRenderTree tools to <port name>DumpRenderTree
+ to avoid conflicting names.
+ * debian/lib*1d.postrm, debian/lib*1d.preinst: Avoid conflicting files with
+ lib*0d packages (*Launcher programs) but allow to install both new and old
+ libraries by using diversions.
+
+ -- Mike Hommey <glandium at debian.org> Fri, 25 Jan 2008 00:31:51 +0100
+
webkit (0~svn27674-2) unstable; urgency=low
* JavaScriptCore/JavaScriptCore.pri: cherry-picked change from revision
@@@ -105,4 -95,3 +127,4 @@@ webkit (0~svn24735-1) unstable; urgency
* Initial release. (Closes: #428855)
-- Mike Hommey <glandium at debian.org> Wed, 15 Aug 2007 14:19:46 +0200
+
diff --combined debian/control
index 6fd0d21,1ab7a93..4a8f6f1
--- a/debian/control
+++ b/debian/control
@@@ -4,12 -4,9 +4,12 @@@ Section: we
Maintainer: Debian WebKit Maintainers <pkg-webkit-maintainers at lists.alioth.debian.org>
Uploaders: Mike Hommey <glandium at debian.org>
Build-Depends: debhelper (>= 5.0), libgtk2.0-dev, libqt4-dev (>= 4.3), libicu-dev, libxslt-dev, libcurl4-dev, libsqlite3-dev, gperf, bison, flex
-Standards-Version: 3.7.2.2
+Standards-Version: 3.7.3.0
+Homepage: http://webkit.org/
+Vcs-Browser: http://git.debian.org/?p=pkg-webkit/webkit.git
+Vcs-Git: git://git.debian.org/git/pkg-webkit/webkit.git
- Package: libqtwebkit0d
+ Package: libqtwebkit1d
Section: libs
Architecture: any
Depends: ${shlibs:Depends}
@@@ -22,12 -19,14 +22,12 @@@ Description: Web content engine librar
supports DOM, XMLHttpRequest, XSLT, CSS, Javascript/ECMAscript and more.
.
This is the library for embedding in Qt applications.
- .
- Homepage: http://webkit.org/
Package: libqtwebkit-dev
Section: libdevel
Priority: extra
Architecture: all
- Depends: libqtwebkit0d (>= ${source:Upstream-Version}), libqtwebkit0d (<< ${source:Version}.1~), libqt4-dev
+ Depends: libqtwebkit1d (>= ${source:Upstream-Version}), libqtwebkit1d (<< ${source:Version}.1~), libqt4-dev
Description: Web content engine library for Qt - Development files
WebKit is a web content engine, derived from KHTML and KJS from KDE, and
used primarily in Apple's Safari browser. It is made to be embedded in
@@@ -38,12 -37,14 +38,12 @@@
.
This package provides development files required to create Qt applications
embedding WebKit.
- .
- Homepage: http://webkit.org/
- Package: libqtwebkit0d-dbg
+ Package: libqtwebkit1d-dbg
Section: libdevel
Priority: extra
Architecture: any
- Depends: libqtwebkit0d (= ${binary:Version})
+ Depends: libqtwebkit1d (= ${binary:Version})
Description: Web content engine library for Qt - Debugging symbols
WebKit is a web content engine, derived from KHTML and KJS from KDE, and
used primarily in Apple's Safari browser. It is made to be embedded in
@@@ -53,8 -54,10 +53,8 @@@
supports DOM, XMLHttpRequest, XSLT, CSS, Javascript/ECMAscript and more.
.
This package provides the debugging symbols for the Webkit library for Qt.
- .
- Homepage: http://webkit.org/
- Package: libwebkitgtk0d
+ Package: libwebkitgtk1d
Section: libs
Architecture: any
Depends: ${shlibs:Depends}
@@@ -67,12 -70,14 +67,12 @@@ Description: Web content engine librar
supports DOM, XMLHttpRequest, XSLT, CSS, Javascript/ECMAscript and more.
.
This is the library for embedding in Gtk+ applications.
- .
- Homepage: http://webkit.org/
Package: libwebkitgtk-dev
Section: libdevel
Priority: extra
Architecture: all
- Depends: libwebkitgtk0d (>= ${source:Upstream-Version}), libwebkitgtk0d (<< ${source:Version}.1~), libglib2.0-dev, libgtk2.0-dev
+ Depends: libwebkitgtk1d (>= ${source:Upstream-Version}), libwebkitgtk1d (<< ${source:Version}.1~), libglib2.0-dev, libgtk2.0-dev
Conflicts: libwebkitgdk-dev
Description: Web content engine library for Gtk+ - Development files
WebKit is a web content engine, derived from KHTML and KJS from KDE, and
@@@ -84,12 -89,14 +84,12 @@@
.
This package provides development files required to create Gtk+ applications
embedding WebKit.
- .
- Homepage: http://webkit.org/
- Package: libwebkitgtk0d-dbg
+ Package: libwebkitgtk1d-dbg
Section: libdevel
Priority: extra
Architecture: any
- Depends: libwebkitgtk0d (= ${binary:Version})
+ Depends: libwebkitgtk1d (= ${binary:Version})
Description: Web content engine library for Gtk+ - Debugging symbols
WebKit is a web content engine, derived from KHTML and KJS from KDE, and
used primarily in Apple's Safari browser. It is made to be embedded in
@@@ -99,3 -106,5 +99,3 @@@
supports DOM, XMLHttpRequest, XSLT, CSS, Javascript/ECMAscript and more.
.
This package provides the debugging symbols for the Webkit library for Gtk+.
- .
- Homepage: http://webkit.org/
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list