From e09144d9ae2fbebaa5c6a2eeb7975a3a75ddbf0b Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 24 Apr 2009 12:37:49 +0200 Subject: Updated WebKit from /home/shausman/src/webkit/trunk to origin/qtwebkit-4.5 ( d5ea85e03f22fb6fb87275774a2c53031941017e ) Changes in WebKit since the last update: ++ b/JavaScriptCore/ChangeLog 2009-01-22 Oliver Hunt Reviewed by Geoff Garen. (r39682-r39736) JSFunFuzz: crash on "(function(){({ x2: x }), })()" Automatic semicolon insertion was resulting in this being accepted in the initial nodeless parsing, but subsequent reparsing for code generation would fail, leading to a crash. The solution is to ensure that reparsing a function performs parsing in the same state as the initial parse. We do this by modifying the saved source ranges to include rather than exclude the opening and closing braces. * bytecode/CodeBlock.cpp: (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): add an assertion for successful recompile * parser/Lexer.h: (JSC::Lexer::sourceCode): include rather than exclude braces. * parser/Nodes.h: (JSC::FunctionBodyNode::toSourceString): No need to append braces anymore. 2009-01-21 Alexey Proskuryakov Suggested by Oliver Hunt. Reviewed by Oliver Hunt. https://bugs.webkit.org/show_bug.cgi?id=23456 Function argument names leak * parser/Nodes.cpp: (JSC::FunctionBodyNode::~FunctionBodyNode): Destruct parameter names. 2009-01-22 Beth Dakin Reviewed by Sam Weinig. Fix for https://bugs.webkit.org/show_bug.cgi?id=23461 LayoutTests/ fast/js/numeric-conversion.html is broken, and corresponding The basic problem here is that parseInt(Infinity) should be NaN, but we were returning 0. NaN matches Safari 3.2.1 and Firefox. * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncParseInt): 2009-01-13 Beth Dakin Reviewed by Darin Adler and Oliver Hunt. REGRESSION: Business widget's front side fails to render correctly when flipping widget The problem here is that parseInt was parsing NaN as 0. This patch corrects that by parsing NaN as NaN. This matches our old behavior and Firefox. * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncParseInt): ++ b/LayoutTests/ChangeLog 2009-01-22 Oliver Hunt Reviewed by Geoff Garen. (r39682-r39736) JSFunFuzz: crash on "(function(){({ x2: x }), })()" Add additional reparsing tests. * fast/js/reparsing-semicolon-insertion-expected.txt: * fast/js/resources/reparsing-semicolon-insertion.js: (commaParenTest): (commaParenThrowTest): 2009-01-22 Beth Dakin Reviewed by Sam Weinig. Fix for https://bugs.webkit.org/show_bug.cgi?id=23461 LayoutTests/ fast/js/numeric-conversion.html is broken, and corresponding The basic problem here is that parseInt(Infinity) should be NaN, but we were returning 0. NaN matches Safari 3.2.1 and Firefox. * fast/js/numeric-conversion-expected.txt: * fast/js/resources/numeric-conversion.js: 2009-01-13 Beth Dakin Reviewed by Darin Adler and Oliver Hunt. Updated test and results for REGRESSION: Business widget's front side fails to render correctly when flipping widget parseInt(NaN) should be NaN. * fast/js/numeric-conversion-expected.txt: * fast/js/resources/numeric-conversion.js: ++ b/WebCore/ChangeLog 2009-03-13 Adam Bergkvist Reviewed by Alexey Proskuryakov. https://bugs.webkit.org/show_bug.cgi?id=24349 [QT] HTTP status text is never set Set HTTP status text to the reason phrase attribute of QNetworkReply. * platform/network/qt/QNetworkReplyHandler.cpp: (WebCore::QNetworkReplyHandler::sendResponseIfNeeded): 2009-03-02 Dirk Schulze Reviewed by Holger Freyther. Added putImageData to Qt. Discussed with Ariya Hidayat. [Qt] lacks putImageData support in Canvas https://bugs.webkit.org/show_bug.cgi?id=22186 * platform/graphics/qt/ImageBufferQt.cpp: (WebCore::ImageBuffer::putImageData): 2009-03-01 Larry Ewing Reviewed by Alexey Proskuryakov. https://bugs.webkit.org/show_bug.cgi?id=24080 NPN_GetValue casting to the wrong type and writing outside bounds Make sure to cast the value to the correct type so that only memory owned by the value is written to. * plugins/gtk/PluginViewGtk.cpp (PluginView::getValueStatic): * plugins/qt/PluginViewQt.cpp (PluginView::getValueStatic): * plugins/mac/PluginViewMac.cpp (PluginView::getValueStatic): (PluginView::getValue): 2009-02-27 Adam Treat Reviewed by Eric Seidel. https://bugs.webkit.org/show_bug.cgi?id=24229 If an image has no alpha channel there is no reason to use SourceOver. * platform/graphics/qt/ImageQt.cpp: (WebCore::Image::drawPattern): (WebCore::BitmapImage::draw): 2009-02-27 Zack Rusin Reviewed by Nikolas Zimmermann. Qt: be more reasonable about scrolled lines cMouseWheelPixelsPerLineStep is currently a constant set to 13.3. it doesn't match our metrics meaning that Qt scrolls by ~2 lines by default which is quite irritating. so lets scroll vertically by the Qt set number of lines * Qt default single step scroll * platform/qt/WheelEventQt.cpp: 2009-02-25 Dirk Schulze Reviewed by Oliver Hunt. Ported arcTo to Qt. Qt has no native support for arcTo. This changes calculate the behavior of arcTo and draws it with lineTo and arc. [QT] implement Canvas arcTo https://bugs.webkit.org/show_bug.cgi?id=23873 * platform/graphics/qt/PathQt.cpp: (WebCore::Path::addArcTo): 2009-03-12 Adam Treat Reviewed by Oliver Hunt. https://bugs.webkit.org/show_bug.cgi?id=24498 Fix the Qt port to use the same algorithm for drawing dashed and dotted borders as the other ports. This makes the Qt port pixel-for-pixel perfect compared to border drawing with Apple's canonical mac port and much closer to konqueror and firefox behavior. * platform/graphics/qt/GraphicsContextQt.cpp: (WebCore::GraphicsContext::drawLine): 2009-03-09 Adam Treat Reviewed by George Staikos. https://bugs.webkit.org/show_bug.cgi?id=24463 WebCore::qstring is detaching and copying twice for every single WebCore::TextRun that is processed and drawn. This elevates this method to one of the top-ten most expensive methods in all of QtWebKit according to profiling. This changes the method so that QString only detaches when absolutely necessary. * platform/graphics/qt/FontQt.cpp: (WebCore::qstring): (WebCore::fixSpacing): (WebCore::Font::drawComplexText): (WebCore::Font::floatWidthForComplexText): (WebCore::Font::offsetForPositionForComplexText): (WebCore::Font::selectionRectForComplexText): ++ b/WebKit/qt/ChangeLog 2009-03-02 Benjamin C Meyer Reviewed by George Staikos. https://bugs.webkit.org/show_bug.cgi?id=21230 On X11 match the behavior of Firefox and also copy the url to the clipboard selection when the action Copy Link Location is executed. * Api/qwebpage.cpp: (QWebPage::triggerAction): --- src/3rdparty/webkit/JavaScriptCore/ChangeLog | 57 +++++++++++ .../webkit/JavaScriptCore/bytecode/CodeBlock.cpp | 1 + src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h | 2 +- .../webkit/JavaScriptCore/parser/Nodes.cpp | 2 + src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h | 2 +- .../runtime/JSGlobalObjectFunctions.cpp | 8 +- src/3rdparty/webkit/VERSION | 2 +- src/3rdparty/webkit/WebCore/ChangeLog | 108 +++++++++++++++++++++ .../webkit/WebCore/platform/graphics/qt/FontQt.cpp | 33 ++++--- .../platform/graphics/qt/GraphicsContextQt.cpp | 78 ++++++++++++++- .../WebCore/platform/graphics/qt/ImageBufferQt.cpp | 59 +++++++++-- .../WebCore/platform/graphics/qt/ImageQt.cpp | 5 + .../webkit/WebCore/platform/graphics/qt/PathQt.cpp | 74 +++++++++++++- .../platform/network/qt/QNetworkReplyHandler.cpp | 4 +- .../webkit/WebCore/platform/qt/WheelEventQt.cpp | 13 ++- .../webkit/WebCore/plugins/mac/PluginViewMac.cpp | 6 +- .../webkit/WebCore/plugins/qt/PluginViewQt.cpp | 6 +- src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp | 9 +- src/3rdparty/webkit/WebKit/qt/ChangeLog | 11 +++ 19 files changed, 438 insertions(+), 42 deletions(-) diff --git a/src/3rdparty/webkit/JavaScriptCore/ChangeLog b/src/3rdparty/webkit/JavaScriptCore/ChangeLog index fe85bb9..3321570 100644 --- a/src/3rdparty/webkit/JavaScriptCore/ChangeLog +++ b/src/3rdparty/webkit/JavaScriptCore/ChangeLog @@ -1,3 +1,60 @@ +2009-01-22 Oliver Hunt + + Reviewed by Geoff Garen. + + (r39682-r39736) JSFunFuzz: crash on "(function(){({ x2: x }), })()" + + + Automatic semicolon insertion was resulting in this being accepted in the initial + nodeless parsing, but subsequent reparsing for code generation would fail, leading + to a crash. The solution is to ensure that reparsing a function performs parsing + in the same state as the initial parse. We do this by modifying the saved source + ranges to include rather than exclude the opening and closing braces. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::reparseForExceptionInfoIfNecessary): add an assertion for successful recompile + * parser/Lexer.h: + (JSC::Lexer::sourceCode): include rather than exclude braces. + * parser/Nodes.h: + (JSC::FunctionBodyNode::toSourceString): No need to append braces anymore. + +2009-01-21 Alexey Proskuryakov + + Suggested by Oliver Hunt. Reviewed by Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=23456 + Function argument names leak + + * parser/Nodes.cpp: (JSC::FunctionBodyNode::~FunctionBodyNode): Destruct parameter names. + +2009-01-22 Beth Dakin + + Reviewed by Sam Weinig. + + Fix for https://bugs.webkit.org/show_bug.cgi?id=23461 LayoutTests/ + fast/js/numeric-conversion.html is broken, and corresponding + + + The basic problem here is that parseInt(Infinity) should be NaN, + but we were returning 0. NaN matches Safari 3.2.1 and Firefox. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + +2009-01-13 Beth Dakin + + Reviewed by Darin Adler and Oliver Hunt. + + REGRESSION: Business widget's front side + fails to render correctly when flipping widget + + The problem here is that parseInt was parsing NaN as 0. This patch + corrects that by parsing NaN as NaN. This matches our old behavior + and Firefox. + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncParseInt): + 2009-02-13 Adam Treat Reviewed by George Staikos. diff --git a/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp b/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp index 91fb1c0..9207c8a 100644 --- a/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp +++ b/src/3rdparty/webkit/JavaScriptCore/bytecode/CodeBlock.cpp @@ -1397,6 +1397,7 @@ void CodeBlock::reparseForExceptionInfoIfNecessary(CallFrame* callFrame) case FunctionCode: { FunctionBodyNode* ownerFunctionBodyNode = static_cast(m_ownerNode); RefPtr newFunctionBody = m_globalData->parser->reparse(m_globalData, ownerFunctionBodyNode); + ASSERT(newFunctionBody); newFunctionBody->finishParsing(ownerFunctionBodyNode->copyParameters(), ownerFunctionBodyNode->parameterCount()); CodeBlock& newCodeBlock = newFunctionBody->bytecodeForExceptionInfoReparse(scopeChain); ASSERT(newCodeBlock.m_exceptionInfo); diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h b/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h index cb553af..afcf09f 100644 --- a/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h +++ b/src/3rdparty/webkit/JavaScriptCore/parser/Lexer.h @@ -88,7 +88,7 @@ namespace JSC { bool sawError() const { return m_error; } void clear(); - SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace + 1, closeBrace, firstLine); } + SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace, closeBrace + 1, firstLine); } private: friend class JSGlobalData; diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp index bdc5d2f..201af28 100644 --- a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp +++ b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.cpp @@ -2552,6 +2552,8 @@ FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* chi FunctionBodyNode::~FunctionBodyNode() { ASSERT(!m_refCount); + for (size_t i = 0; i < m_parameterCount; ++i) + m_parameters[i].~Identifier(); fastFree(m_parameters); } diff --git a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h index f8512f7..20885c3 100644 --- a/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h +++ b/src/3rdparty/webkit/JavaScriptCore/parser/Nodes.h @@ -2205,7 +2205,7 @@ namespace JSC { void finishParsing(const SourceCode&, ParameterNode*); void finishParsing(Identifier* parameters, size_t parameterCount); - UString toSourceString() const JSC_FAST_CALL { return UString("{") + source().toString() + UString("}"); } + UString toSourceString() const JSC_FAST_CALL { return source().toString(); } // These objects are ref/deref'd a lot in the scope chain, so this is a faster ref/deref. // If the virtual machine changes so this doesn't happen as much we can change back. diff --git a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp index f12d2f3..ecdddcf 100644 --- a/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp +++ b/src/3rdparty/webkit/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp @@ -302,9 +302,11 @@ JSValuePtr globalFuncParseInt(ExecState* exec, JSObject*, JSValuePtr, const ArgL if (JSImmediate::isImmediate(value)) return value; double d = value->uncheckedGetNumber(); - if (!isfinite(d)) - return JSImmediate::zeroImmediate(); - return jsNumber(exec, floor(d)); + if (isfinite(d)) + return jsNumber(exec, floor(d)); + if (isnan(d) || isinf(d)) + return jsNaN(&exec->globalData()); + return JSImmediate::zeroImmediate(); } return jsNumber(exec, parseInt(value->toString(exec), radix)); diff --git a/src/3rdparty/webkit/VERSION b/src/3rdparty/webkit/VERSION index bfaefa2..60c9ba7 100644 --- a/src/3rdparty/webkit/VERSION +++ b/src/3rdparty/webkit/VERSION @@ -8,4 +8,4 @@ The commit imported was from the and has the sha1 checksum - 450331808bfe11b1472c213a8cb311190355c2de + d5ea85e03f22fb6fb87275774a2c53031941017e diff --git a/src/3rdparty/webkit/WebCore/ChangeLog b/src/3rdparty/webkit/WebCore/ChangeLog index 9be6e72..00bd427 100644 --- a/src/3rdparty/webkit/WebCore/ChangeLog +++ b/src/3rdparty/webkit/WebCore/ChangeLog @@ -1,3 +1,111 @@ +2009-03-13 Adam Bergkvist + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=24349 + [QT] HTTP status text is never set + + Set HTTP status text to the reason phrase attribute of QNetworkReply. + + * platform/network/qt/QNetworkReplyHandler.cpp: + (WebCore::QNetworkReplyHandler::sendResponseIfNeeded): + +2009-03-02 Dirk Schulze + + Reviewed by Holger Freyther. + + Added putImageData to Qt. Discussed with Ariya Hidayat. + + [Qt] lacks putImageData support in Canvas + https://bugs.webkit.org/show_bug.cgi?id=22186 + + * platform/graphics/qt/ImageBufferQt.cpp: + (WebCore::ImageBuffer::putImageData): + +2009-03-01 Larry Ewing + + Reviewed by Alexey Proskuryakov. + + https://bugs.webkit.org/show_bug.cgi?id=24080 + NPN_GetValue casting to the wrong type and writing outside bounds + + Make sure to cast the value to the correct type so that only + memory owned by the value is written to. + + * plugins/gtk/PluginViewGtk.cpp (PluginView::getValueStatic): + * plugins/qt/PluginViewQt.cpp (PluginView::getValueStatic): + * plugins/mac/PluginViewMac.cpp (PluginView::getValueStatic): + (PluginView::getValue): + +2009-02-27 Adam Treat + + Reviewed by Eric Seidel. + + https://bugs.webkit.org/show_bug.cgi?id=24229 + If an image has no alpha channel there is no reason to use SourceOver. + + * platform/graphics/qt/ImageQt.cpp: + (WebCore::Image::drawPattern): + (WebCore::BitmapImage::draw): + +2009-02-27 Zack Rusin + + Reviewed by Nikolas Zimmermann. + + Qt: be more reasonable about scrolled lines + + cMouseWheelPixelsPerLineStep is currently a constant set to 13.3. it doesn't + match our metrics meaning that Qt scrolls by ~2 lines by default which is quite + irritating. so lets scroll vertically by the Qt set number of lines * Qt default + single step scroll + + * platform/qt/WheelEventQt.cpp: + +2009-02-25 Dirk Schulze + + Reviewed by Oliver Hunt. + + Ported arcTo to Qt. Qt has no native support for arcTo. This changes + calculate the behavior of arcTo and draws it with lineTo and arc. + + [QT] implement Canvas arcTo + https://bugs.webkit.org/show_bug.cgi?id=23873 + + * platform/graphics/qt/PathQt.cpp: + (WebCore::Path::addArcTo): + +2009-03-12 Adam Treat + + Reviewed by Oliver Hunt. + + https://bugs.webkit.org/show_bug.cgi?id=24498 + Fix the Qt port to use the same algorithm for drawing dashed and dotted + borders as the other ports. This makes the Qt port pixel-for-pixel perfect + compared to border drawing with Apple's canonical mac port and much closer + to konqueror and firefox behavior. + + * platform/graphics/qt/GraphicsContextQt.cpp: + (WebCore::GraphicsContext::drawLine): + +2009-03-09 Adam Treat + + Reviewed by George Staikos. + + https://bugs.webkit.org/show_bug.cgi?id=24463 + WebCore::qstring is detaching and copying twice for every single + WebCore::TextRun that is processed and drawn. This elevates this method + to one of the top-ten most expensive methods in all of QtWebKit according + to profiling. This changes the method so that QString only detaches + when absolutely necessary. + + * platform/graphics/qt/FontQt.cpp: + (WebCore::qstring): + (WebCore::fixSpacing): + (WebCore::Font::drawComplexText): + (WebCore::Font::floatWidthForComplexText): + (WebCore::Font::offsetForPositionForComplexText): + (WebCore::Font::selectionRectForComplexText): + 2009-02-04 Simon Hausmann Unreviewed Qt build fix. diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp index deeea99..4e78083 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp @@ -37,20 +37,27 @@ #if QT_VERSION >= 0x040400 namespace WebCore { -static QString qstring(const TextRun& run) +static const QString qstring(const TextRun& run) { - QString string((QChar *)run.characters(), run.length()); - QChar *uc = string.data(); + //We don't detach + return QString::fromRawData((const QChar *)run.characters(), run.length()); +} + +static const QString fixSpacing(const QString &string) +{ + //Only detach if we're actually changing something + QString possiblyDetached = string; for (int i = 0; i < string.length(); ++i) { - if (Font::treatAsSpace(uc[i].unicode())) - uc[i] = 0x20; - else if (Font::treatAsZeroWidthSpace(uc[i].unicode())) - uc[i] = 0x200c; + const QChar c = string.at(i); + if (c.unicode() != 0x20 && Font::treatAsSpace(c.unicode())) { + possiblyDetached[i] = 0x20; //detach + } else if (c.unicode() != 0x200c && Font::treatAsZeroWidthSpace(c.unicode())) { + possiblyDetached[i] = 0x200c; //detach + } } - return string; + return possiblyDetached; } - static QTextLine setupLayout(QTextLayout* layout, const TextRun& style) { int flags = style.rtl() ? Qt::TextForceRightToLeft : Qt::TextForceLeftToRight; @@ -75,7 +82,7 @@ void Font::drawComplexText(GraphicsContext* ctx, const TextRun& run, const Float Color color = ctx->fillColor(); p->setPen(QColor(color)); - QString string = qstring(run); + const QString string = fixSpacing(qstring(run)); // text shadow IntSize shadowSize; @@ -144,7 +151,7 @@ float Font::floatWidthForComplexText(const TextRun& run) const { if (!run.length()) return 0; - QString string = qstring(run); + const QString string = fixSpacing(qstring(run)); QTextLayout layout(string, font()); QTextLine line = setupLayout(&layout, run); int w = int(line.naturalTextWidth()); @@ -157,7 +164,7 @@ float Font::floatWidthForComplexText(const TextRun& run) const int Font::offsetForPositionForComplexText(const TextRun& run, int position, bool includePartialGlyphs) const { - QString string = qstring(run); + const QString string = fixSpacing(qstring(run)); QTextLayout layout(string, font()); QTextLine line = setupLayout(&layout, run); return line.xToCursor(position); @@ -165,7 +172,7 @@ int Font::offsetForPositionForComplexText(const TextRun& run, int position, bool FloatRect Font::selectionRectForComplexText(const TextRun& run, const IntPoint& pt, int h, int from, int to) const { - QString string = qstring(run); + const QString string = fixSpacing(qstring(run)); QTextLayout layout(string, font()); QTextLine line = setupLayout(&layout, run); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp index 936c1ea..6c90ea3 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp @@ -470,13 +470,21 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) if (paintingDisabled()) return; + StrokeStyle style = strokeStyle(); + Color color = strokeColor(); + if (style == NoStroke || !color.alpha()) + return; + + float width = strokeThickness(); + FloatPoint p1 = point1; FloatPoint p2 = point2; + bool isVerticalLine = (p1.x() == p2.x()); QPainter *p = m_data->p(); const bool antiAlias = p->testRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::Antialiasing, m_data->antiAliasingForRectsAndLines); - adjustLineToPixelBoundaries(p1, p2, strokeThickness(), strokeStyle()); + adjustLineToPixelBoundaries(p1, p2, width, style); IntSize shadowSize; int shadowBlur; @@ -489,8 +497,76 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) p->restore(); } + int patWidth = 0; + switch (style) { + case NoStroke: + case SolidStroke: + break; + case DottedStroke: + patWidth = (int)width; + break; + case DashedStroke: + patWidth = 3 * (int)width; + break; + } + + if (patWidth) { + p->save(); + + // Do a rect fill of our endpoints. This ensures we always have the + // appearance of being a border. We then draw the actual dotted/dashed line. + if (isVerticalLine) { + p->fillRect(FloatRect(p1.x() - width / 2, p1.y() - width, width, width), color); + p->fillRect(FloatRect(p2.x() - width / 2, p2.y(), width, width), color); + } else { + p->fillRect(FloatRect(p1.x() - width, p1.y() - width / 2, width, width), color); + p->fillRect(FloatRect(p2.x(), p2.y() - width / 2, width, width), color); + } + + // Example: 80 pixels with a width of 30 pixels. + // Remainder is 20. The maximum pixels of line we could paint + // will be 50 pixels. + int distance = (isVerticalLine ? (point2.y() - point1.y()) : (point2.x() - point1.x())) - 2*(int)width; + int remainder = distance % patWidth; + int coverage = distance - remainder; + int numSegments = coverage / patWidth; + + float patternOffset = 0.0f; + // Special case 1px dotted borders for speed. + if (patWidth == 1) + patternOffset = 1.0f; + else { + bool evenNumberOfSegments = numSegments % 2 == 0; + if (remainder) + evenNumberOfSegments = !evenNumberOfSegments; + if (evenNumberOfSegments) { + if (remainder) { + patternOffset += patWidth - remainder; + patternOffset += remainder / 2; + } else + patternOffset = patWidth / 2; + } else { + if (remainder) + patternOffset = (patWidth - remainder)/2; + } + } + + QVector dashes; + dashes << qreal(patWidth) / width << qreal(patWidth) / width; + + QPen pen = p->pen(); + pen.setWidthF(width); + pen.setCapStyle(Qt::FlatCap); + pen.setDashPattern(dashes); + pen.setDashOffset(patternOffset / width); + p->setPen(pen); + } + p->drawLine(p1, p2); + if (patWidth) + p->restore(); + p->setRenderHint(QPainter::Antialiasing, antiAlias); } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp index d1009b5..29a02d4 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2006 Nikolas Zimmermann * Copyright (C) 2008 Holger Hans Peter Freyther + * Copyright (C) 2009 Dirk Schulze * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,7 +32,6 @@ #include "GraphicsContext.h" #include "ImageData.h" #include "MIMETypeRegistry.h" -#include "NotImplemented.h" #include "StillImageQt.h" #include @@ -111,9 +111,7 @@ PassRefPtr ImageBuffer::getImageData(const IntRect& rect) const endy = m_size.height(); int numRows = endy - originy; - QImage image = m_data.m_pixmap.toImage(); - if (image.format() != QImage::Format_ARGB32) - image = image.convertToFormat(QImage::Format_ARGB32); + QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); ASSERT(!image.isNull()); unsigned destBytesPerRow = 4 * rect.width(); @@ -134,9 +132,58 @@ PassRefPtr ImageBuffer::getImageData(const IntRect& rect) const return result; } -void ImageBuffer::putImageData(ImageData*, const IntRect&, const IntPoint&) +void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) { - notImplemented(); + ASSERT(sourceRect.width() > 0); + ASSERT(sourceRect.height() > 0); + + int originx = sourceRect.x(); + int destx = destPoint.x() + sourceRect.x(); + ASSERT(destx >= 0); + ASSERT(destx < m_size.width()); + ASSERT(originx >= 0); + ASSERT(originx <= sourceRect.right()); + + int endx = destPoint.x() + sourceRect.right(); + ASSERT(endx <= m_size.width()); + + int numColumns = endx - destx; + + int originy = sourceRect.y(); + int desty = destPoint.y() + sourceRect.y(); + ASSERT(desty >= 0); + ASSERT(desty < m_size.height()); + ASSERT(originy >= 0); + ASSERT(originy <= sourceRect.bottom()); + + int endy = destPoint.y() + sourceRect.bottom(); + ASSERT(endy <= m_size.height()); + int numRows = endy - desty; + + unsigned srcBytesPerRow = 4 * source->width(); + + bool isPainting = m_data.m_painter->isActive(); + if (isPainting) + m_data.m_painter->end(); + + QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); + ASSERT(!image.isNull()); + + unsigned char* srcRows = source->data()->data() + originy * srcBytesPerRow + originx * 4; + for (int y = 0; y < numRows; ++y) { + quint32* scanLine = reinterpret_cast(image.scanLine(y + desty)); + for (int x = 0; x < numColumns; x++) { + int basex = x * 4; + scanLine[x + destx] = reinterpret_cast(srcRows + basex)[0]; + } + + srcRows += srcBytesPerRow; + } + + m_data.m_pixmap = QPixmap::fromImage(image); + + if (isPainting) + m_data.m_painter->begin(&m_data.m_pixmap); } // We get a mimeType here but QImageWriter does not support mimetypes but diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp index be7d1e0..e266c07 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp @@ -109,6 +109,8 @@ void Image::drawPattern(GraphicsContext* ctxt, const FloatRect& tileRect, const ctxt->save(); ctxt->setCompositeOperation(op); QPainter* p = ctxt->platformContext(); + if (!pixmap.hasAlpha() && p->compositionMode() == QPainter::CompositionMode_SourceOver) + p->setCompositionMode(QPainter::CompositionMode_Source); p->setBrushOrigin(phase); p->fillRect(destRect, b); ctxt->restore(); @@ -146,6 +148,9 @@ void BitmapImage::draw(GraphicsContext* ctxt, const FloatRect& dst, QPainter* painter(ctxt->platformContext()); + if (!image->hasAlpha() && painter->compositionMode() == QPainter::CompositionMode_SourceOver) + painter->setCompositionMode(QPainter::CompositionMode_Source); + // Test using example site at // http://www.meyerweb.com/eric/css/edge/complexspiral/demo.html painter->drawPixmap(dst, *image, src); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp index 90b342e..e68be2b 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp @@ -1,6 +1,7 @@ /* - * Copyright (C) 2006 Zack Rusin - * 2006 Rob Buis + * Copyright (C) 2006 Zack Rusin + * 2006 Rob Buis + * 2009 Dirk Schulze * * All rights reserved. * @@ -139,9 +140,72 @@ void Path::addBezierCurveTo(const FloatPoint& cp1, const FloatPoint& cp2, const void Path::addArcTo(const FloatPoint& p1, const FloatPoint& p2, float radius) { - //FIXME: busted - qWarning("arcTo is busted"); - m_path->arcTo(p1.x(), p1.y(), p2.x(), p2.y(), radius, 90); + FloatPoint p0(m_path->currentPosition()); + + if ((p1.x() == p0.x() && p1.y() == p0.y()) || (p1.x() == p2.x() && p1.y() == p2.y()) || radius == 0.f) { + m_path->lineTo(p1); + return; + } + + FloatPoint p1p0((p0.x() - p1.x()),(p0.y() - p1.y())); + FloatPoint p1p2((p2.x() - p1.x()),(p2.y() - p1.y())); + float p1p0_length = sqrtf(p1p0.x() * p1p0.x() + p1p0.y() * p1p0.y()); + float p1p2_length = sqrtf(p1p2.x() * p1p2.x() + p1p2.y() * p1p2.y()); + + double cos_phi = (p1p0.x() * p1p2.x() + p1p0.y() * p1p2.y()) / (p1p0_length * p1p2_length); + // all points on a line logic + if (cos_phi == -1) { + m_path->lineTo(p1); + return; + } + if (cos_phi == 1) { + // add infinite far away point + unsigned int max_length = 65535; + double factor_max = max_length / p1p0_length; + FloatPoint ep((p0.x() + factor_max * p1p0.x()), (p0.y() + factor_max * p1p0.y())); + m_path->lineTo(ep); + return; + } + + float tangent = radius / tan(acos(cos_phi) / 2); + float factor_p1p0 = tangent / p1p0_length; + FloatPoint t_p1p0((p1.x() + factor_p1p0 * p1p0.x()), (p1.y() + factor_p1p0 * p1p0.y())); + + FloatPoint orth_p1p0(p1p0.y(), -p1p0.x()); + float orth_p1p0_length = sqrt(orth_p1p0.x() * orth_p1p0.x() + orth_p1p0.y() * orth_p1p0.y()); + float factor_ra = radius / orth_p1p0_length; + + // angle between orth_p1p0 and p1p2 to get the right vector orthographic to p1p0 + double cos_alpha = (orth_p1p0.x() * p1p2.x() + orth_p1p0.y() * p1p2.y()) / (orth_p1p0_length * p1p2_length); + if (cos_alpha < 0.f) + orth_p1p0 = FloatPoint(-orth_p1p0.x(), -orth_p1p0.y()); + + FloatPoint p((t_p1p0.x() + factor_ra * orth_p1p0.x()), (t_p1p0.y() + factor_ra * orth_p1p0.y())); + + // calculate angles for addArc + orth_p1p0 = FloatPoint(-orth_p1p0.x(), -orth_p1p0.y()); + float sa = acos(orth_p1p0.x() / orth_p1p0_length); + if (orth_p1p0.y() < 0.f) + sa = 2 * piDouble - sa; + + // anticlockwise logic + bool anticlockwise = false; + + float factor_p1p2 = tangent / p1p2_length; + FloatPoint t_p1p2((p1.x() + factor_p1p2 * p1p2.x()), (p1.y() + factor_p1p2 * p1p2.y())); + FloatPoint orth_p1p2((t_p1p2.x() - p.x()),(t_p1p2.y() - p.y())); + float orth_p1p2_length = sqrtf(orth_p1p2.x() * orth_p1p2.x() + orth_p1p2.y() * orth_p1p2.y()); + float ea = acos(orth_p1p2.x() / orth_p1p2_length); + if (orth_p1p2.y() < 0) + ea = 2 * piDouble - ea; + if ((sa > ea) && ((sa - ea) < piDouble)) + anticlockwise = true; + if ((sa < ea) && ((ea - sa) > piDouble)) + anticlockwise = true; + + m_path->lineTo(t_p1p0); + + addArc(p, radius, sa, ea, anticlockwise); } void Path::closeSubpath() diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp index 2de2125..2c730a6 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp @@ -269,8 +269,10 @@ void QNetworkReplyHandler::sendResponseIfNeeded() const bool isLocalFileReply = (m_reply->url().scheme() == QLatin1String("file")); int statusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - if (!isLocalFileReply) + if (!isLocalFileReply) { response.setHTTPStatusCode(statusCode); + response.setHTTPStatusText(m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray().constData()); + } else if (m_reply->error() == QNetworkReply::ContentNotFoundError) response.setHTTPStatusCode(404); diff --git a/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp index cc8acd2..b25ae7a 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp @@ -21,7 +21,9 @@ #include "PlatformWheelEvent.h" #include "PlatformMouseEvent.h" +#include "Scrollbar.h" +#include #include namespace WebCore { @@ -54,9 +56,14 @@ PlatformWheelEvent::PlatformWheelEvent(QWheelEvent* e) m_deltaY = (e->delta() / 120); } - // FIXME: retrieve the user setting for the number of lines to scroll on each wheel event - m_deltaX *= horizontalLineMultiplier(); - m_deltaY *= verticalLineMultiplier(); + m_deltaX *= QApplication::wheelScrollLines(); + // use the same single scroll step as QTextEdit (in + // QTextEditPrivate::init [h,v]bar->setSingleStep ) + // and divide by the default WebKit scroll step to + // get the Qt mouse wheel scroll behavior + static const float cDefaultQtScrollStep = 20.f; + m_deltaY *= QApplication::wheelScrollLines() * + (cDefaultQtScrollStep / cMouseWheelPixelsPerLineStep); } #endif // QT_NO_WHEELEVENT diff --git a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp index 1d7d570..3229922 100644 --- a/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp +++ b/src/3rdparty/webkit/WebCore/plugins/mac/PluginViewMac.cpp @@ -220,11 +220,11 @@ NPError PluginView::getValueStatic(NPNVariable variable, void* value) switch (variable) { case NPNVToolkit: - *((uint32 *)value) = 0; + *static_cast(value) = 0; return NPERR_NO_ERROR; case NPNVjavascriptEnabledBool: - *((uint32 *)value) = true; + *static_cast(value) = true; return NPERR_NO_ERROR; default: @@ -275,7 +275,7 @@ NPError PluginView::getValue(NPNVariable variable, void* value) } case NPNVsupportsCoreGraphicsBool: - *((uint32 *)value) = true; + *static_cast(value) = true; return NPERR_NO_ERROR; default: diff --git a/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp b/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp index 5aa8933..c8dd0e5 100644 --- a/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp +++ b/src/3rdparty/webkit/WebCore/plugins/qt/PluginViewQt.cpp @@ -301,15 +301,15 @@ NPError PluginView::getValueStatic(NPNVariable variable, void* value) { switch (variable) { case NPNVToolkit: - *((uint32 *)value) = 0; + *static_cast(value) = 0; return NPERR_NO_ERROR; case NPNVSupportsXEmbedBool: - *((uint32 *)value) = true; + *static_cast(value) = true; return NPERR_NO_ERROR; case NPNVjavascriptEnabledBool: - *((uint32 *)value) = true; + *static_cast(value) = true; return NPERR_NO_ERROR; default: diff --git a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp index e17306d..c55b780 100644 --- a/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp +++ b/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp @@ -1450,9 +1450,16 @@ void QWebPage::triggerAction(WebAction action, bool checked) openNewWindow(url, frame); break; } - case CopyLinkToClipboard: + case CopyLinkToClipboard: { +#if defined(Q_WS_X11) + bool oldSelectionMode = Pasteboard::generalPasteboard()->isSelectionMode(); + Pasteboard::generalPasteboard()->setSelectionMode(true); + editor->copyURL(d->hitTestResult.linkUrl(), d->hitTestResult.linkText()); + Pasteboard::generalPasteboard()->setSelectionMode(oldSelectionMode); +#endif editor->copyURL(d->hitTestResult.linkUrl(), d->hitTestResult.linkText()); break; + } case OpenImageInNewWindow: openNewWindow(d->hitTestResult.imageUrl(), frame); break; diff --git a/src/3rdparty/webkit/WebKit/qt/ChangeLog b/src/3rdparty/webkit/WebKit/qt/ChangeLog index 5a23200..e6c16ec 100644 --- a/src/3rdparty/webkit/WebKit/qt/ChangeLog +++ b/src/3rdparty/webkit/WebKit/qt/ChangeLog @@ -1,3 +1,14 @@ +2009-03-02 Benjamin C Meyer + + Reviewed by George Staikos. + + https://bugs.webkit.org/show_bug.cgi?id=21230 + On X11 match the behavior of Firefox and also copy the url to the + clipboard selection when the action Copy Link Location is executed. + + * Api/qwebpage.cpp: + (QWebPage::triggerAction): + 2009-03-07 Adam Treat Reviewed by Cameron Zwarich. -- cgit v0.12