diff options
Diffstat (limited to 'WebCore/platform')
-rw-r--r-- | WebCore/platform/android/FileChooserAndroid.cpp | 16 | ||||
-rw-r--r-- | WebCore/platform/android/FileSystemAndroid.cpp | 11 | ||||
-rw-r--r-- | WebCore/platform/android/LocalizedStringsAndroid.cpp | 4 | ||||
-rw-r--r-- | WebCore/platform/android/PlatformBridge.h | 4 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp | 28 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/ImageBufferAndroid.cpp | 28 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/ImageSourceAndroid.cpp | 2 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/LayerAndroid.cpp | 54 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/LayerAndroid.h | 16 | ||||
-rw-r--r-- | WebCore/platform/posix/FileSystemPOSIX.cpp | 2 |
10 files changed, 89 insertions, 76 deletions
diff --git a/WebCore/platform/android/FileChooserAndroid.cpp b/WebCore/platform/android/FileChooserAndroid.cpp index 1f8200f..f2ad3b9 100644 --- a/WebCore/platform/android/FileChooserAndroid.cpp +++ b/WebCore/platform/android/FileChooserAndroid.cpp @@ -25,22 +25,20 @@ #include "config.h" #include "FileChooser.h" +#include "FileSystem.h" #include "Font.h" +#include "LocalizedStrings.h" +#include "StringTruncator.h" namespace WebCore { String FileChooser::basenameForWidth(const Font& font, int width) const { if (!m_filenames.size()) - return String(); - // FIXME: This could be a lot faster, but assuming the data will not - // often be much longer than the provided width, this may be fast enough. - // If this does not need to be threadsafe, we can use crossThreadString(). - // See http://trac.webkit.org/changeset/49160. - String output = m_filenames[0].threadsafeCopy(); - while (font.width(TextRun(output.impl())) > width && output.length() > 4) - output = output.replace(0, 4, String("...")); - return output; + return fileButtonNoFileSelectedLabel(); + + String output = pathGetFileName(m_filenames[0]); + return StringTruncator::centerTruncate(output, static_cast<float>(width), font, false); } } // namespace WebCore diff --git a/WebCore/platform/android/FileSystemAndroid.cpp b/WebCore/platform/android/FileSystemAndroid.cpp index 3d841d7..cf9830e 100644 --- a/WebCore/platform/android/FileSystemAndroid.cpp +++ b/WebCore/platform/android/FileSystemAndroid.cpp @@ -28,6 +28,7 @@ #include "config.h" #include "FileSystem.h" +#include "PlatformBridge.h" #include "StringBuilder.h" #include "cutils/log.h" #include <dirent.h> @@ -106,4 +107,14 @@ Vector<String> listDirectory(const String& path, const String& filter) return entries; } +String pathGetFileName(const String& path) +{ + // If the path is a content:// URI then ask Java to resolve it for us. + if (path.startsWith("content://")) + return PlatformBridge::resolveFileNameForContentUri(path); + else + return path.substring(path.reverseFind('/') + 1); +} + + } // namespace WebCore diff --git a/WebCore/platform/android/LocalizedStringsAndroid.cpp b/WebCore/platform/android/LocalizedStringsAndroid.cpp index e0db88d..5ca7fa2 100644 --- a/WebCore/platform/android/LocalizedStringsAndroid.cpp +++ b/WebCore/platform/android/LocalizedStringsAndroid.cpp @@ -48,8 +48,8 @@ String fileButtonChooseFileLabel() String fileButtonNoFileSelectedLabel() { - notImplemented(); - return String(); + return *(PlatformBridge::globalLocalizedName( + PlatformBridge::FileUploadNoFileChosenLabel)); } String contextMenuItemTagInspectElement() diff --git a/WebCore/platform/android/PlatformBridge.h b/WebCore/platform/android/PlatformBridge.h index ad181e6..33f8697 100644 --- a/WebCore/platform/android/PlatformBridge.h +++ b/WebCore/platform/android/PlatformBridge.h @@ -119,7 +119,8 @@ public: DrawableDir, FileUploadLabel, ResetLabel, - SubmitLabel + SubmitLabel, + FileUploadNoFileChosenLabel }; static String* globalLocalizedName(rawResId resId); @@ -137,6 +138,7 @@ public: static bool isWebViewPaused(const FrameView*); static bool canScroll(const FrameView*); + static String resolveFileNameForContentUri(const String&); }; } diff --git a/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp b/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp index 0d22719..c3df943 100644 --- a/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp +++ b/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp @@ -229,30 +229,39 @@ void GraphicsLayerAndroid::updateFixedPosition() // If we are a fixed position layer, just set it if (view->isPositioned() && view->style()->position() == FixedPosition) { + // We need to get the passed CSS properties for the element SkLength left, top, right, bottom; left = convertLength(view->style()->left()); top = convertLength(view->style()->top()); right = convertLength(view->style()->right()); bottom = convertLength(view->style()->bottom()); - // We need to pass the size of the element to compute the final fixed - // position -- we can't use the layer's size as it could possibly differs. - // We also have to use the visible overflow and not just the size, - // as some child elements could be overflowing. - int w = view->rightVisibleOverflow() - view->leftVisibleOverflow(); - int h = view->bottomVisibleOverflow() - view->topVisibleOverflow(); + // We also need to get the margin... SkLength marginLeft, marginTop, marginRight, marginBottom; marginLeft = convertLength(view->style()->marginLeft()); marginTop = convertLength(view->style()->marginTop()); marginRight = convertLength(view->style()->marginRight()); marginBottom = convertLength(view->style()->marginBottom()); + // The layer can be bigger than the element we want to draw; + // not only that, the layout rect of the element might also be + // different from the visible rect of that element (i.e. the element + // has a CSS shadow property -- the shadow is "outside" the element). + // We thus need to: + // 1/ get the size of the element (w,h), using the layoutOverflow rect + // 2/ pass the current offset of the painting relative to the layer + int w = view->rightLayoutOverflow() - view->leftLayoutOverflow(); + int h = view->bottomLayoutOverflow() - view->topLayoutOverflow(); + int paintingOffsetX = - offsetFromRenderer().width(); + int paintingOffsetY = - offsetFromRenderer().height(); + + SkRect viewRect; + viewRect.set(paintingOffsetX, paintingOffsetY, paintingOffsetX + w, paintingOffsetY + h); + m_contentLayer->setFixedPosition(left, top, right, bottom, marginLeft, marginTop, marginRight, marginBottom, - offsetFromRenderer().width(), - offsetFromRenderer().height(), - w, h); + viewRect); } } @@ -283,6 +292,7 @@ void GraphicsLayerAndroid::setSize(const FloatSize& size) MLOG("(%x) setSize (%.2f,%.2f)", this, size.width(), size.height()); GraphicsLayer::setSize(size); m_contentLayer->setSize(size.width(), size.height()); + updateFixedPosition(); askForSync(); } } diff --git a/WebCore/platform/graphics/android/ImageBufferAndroid.cpp b/WebCore/platform/graphics/android/ImageBufferAndroid.cpp index 6efccfe..92c585f 100644 --- a/WebCore/platform/graphics/android/ImageBufferAndroid.cpp +++ b/WebCore/platform/graphics/android/ImageBufferAndroid.cpp @@ -24,11 +24,11 @@ */ #include "config.h" -#include "BitmapImage.h" #include "ImageBuffer.h" -#include "ImageData.h" -#include "NotImplemented.h" +#include "Base64.h" +#include "BitmapImage.h" +#include "ImageData.h" #include "android_graphics.h" #include "GraphicsContext.h" #include "PlatformGraphicsContext.h" @@ -36,6 +36,8 @@ #include "SkCanvas.h" #include "SkColorPriv.h" #include "SkDevice.h" +#include "SkImageEncoder.h" +#include "SkStream.h" #include "SkUnPreMultiply.h" using namespace std; @@ -208,10 +210,22 @@ void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sou String ImageBuffer::toDataURL(const String&) const -{ - // leaving this unimplemented, until I understand what its for (and what it - // really is). - return "data:,"; // I think this means we couldn't make the data url +{ + // Encode the image into a vector. + SkDynamicMemoryWStream pngStream; + const SkBitmap& dst = android_gc2canvas(context())->getDevice()->accessBitmap(true); + SkImageEncoder::EncodeStream(&pngStream, dst, SkImageEncoder::kPNG_Type, 100); + + // Convert it into base64. + Vector<char> pngEncodedData; + pngEncodedData.append(pngStream.getStream(), pngStream.getOffset()); + Vector<char> base64EncodedData; + base64Encode(pngEncodedData, base64EncodedData); + // Append with a \0 so that it's a valid string. + base64EncodedData.append('\0'); + + // And the resulting string. + return String::format("data:image/png;base64,%s", base64EncodedData.data()); } } diff --git a/WebCore/platform/graphics/android/ImageSourceAndroid.cpp b/WebCore/platform/graphics/android/ImageSourceAndroid.cpp index 914a9d6..c0ef611 100644 --- a/WebCore/platform/graphics/android/ImageSourceAndroid.cpp +++ b/WebCore/platform/graphics/android/ImageSourceAndroid.cpp @@ -303,7 +303,7 @@ void ImageSource::setData(SharedBuffer* data, bool allDataReceived) } PrivateAndroidImageSourceRec* decoder = m_decoder.m_image; - if (allDataReceived && !decoder->fAllDataReceived) { + if (allDataReceived && decoder && !decoder->fAllDataReceived) { decoder->fAllDataReceived = true; SkBitmap* bm = &decoder->bitmap(); diff --git a/WebCore/platform/graphics/android/LayerAndroid.cpp b/WebCore/platform/graphics/android/LayerAndroid.cpp index 2f10d33..5aaa243 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -87,9 +87,7 @@ LayerAndroid::LayerAndroid(const LayerAndroid& layer) : SkLayer(layer), m_fixedMarginTop = layer.m_fixedMarginTop; m_fixedMarginRight = layer.m_fixedMarginRight; m_fixedMarginBottom = layer.m_fixedMarginBottom; - m_fixedOffset = layer.m_fixedOffset; - m_fixedWidth = layer.m_fixedWidth; - m_fixedHeight = layer.m_fixedHeight; + m_fixedRect = layer.m_fixedRect; m_recordingPicture = layer.m_recordingPicture; SkSafeRef(m_recordingPicture); @@ -256,20 +254,6 @@ const LayerAndroid* LayerAndroid::find(int x, int y) const /////////////////////////////////////////////////////////////////////////////// -// The Layer bounds and the renderview bounds are not always indentical. -// We need to compute the intersection to correctly compute the -// positiong... -static SkRect computeLayerRect(LayerAndroid* layer) { - SkRect layerRect, viewRect; - SkScalar fX, fY; - fX = layer->getOffset().fX; - fY = layer->getOffset().fY; - layerRect.set(0, 0, layer->getSize().width(), layer->getSize().height()); - viewRect.set(-fX, -fY, -fX + layer->getFixedWidth(), -fY + layer->getFixedHeight()); - layerRect.intersect(viewRect); - return layerRect; -} - void LayerAndroid::updateFixedLayersPositions(const SkRect& viewport) { if (m_isFixed) { @@ -280,23 +264,21 @@ void LayerAndroid::updateFixedLayersPositions(const SkRect& viewport) float x = dx; float y = dy; - SkRect layerRect = computeLayerRect(this); - // Not defined corresponds to 'auto'; - // so if right is auto, and left is auto, the w3c says we should set - // left to zero (in left-to-right layout). So basically, if right is not - // defined, we always apply auto. - if (m_fixedRight.defined()) - x += w - m_fixedMarginRight.calcFloatValue(w) - m_fixedRight.calcFloatValue(w) - layerRect.width(); + // If both left and right are auto, the w3c says we should set left + // to zero (in left-to-right layout). So we use left if it's defined + // or if right isn't defined. + if (m_fixedLeft.defined() || !m_fixedRight.defined()) + x += m_fixedMarginLeft.calcFloatValue(w) + m_fixedLeft.calcFloatValue(w) - m_fixedRect.fLeft; else - x += m_fixedMarginLeft.calcFloatValue(w) + m_fixedLeft.calcFloatValue(w) - layerRect.fLeft; + x += w - m_fixedMarginRight.calcFloatValue(w) - m_fixedRight.calcFloatValue(w) - m_fixedRect.fRight; // Following the same reason as above, if bottom isn't defined, we apply // top regardless of it being defined or not. - if (m_fixedBottom.defined()) - y += h - m_fixedMarginBottom.calcFloatValue(h) - m_fixedBottom.calcFloatValue(h) - layerRect.fTop - layerRect.height(); + if (m_fixedTop.defined() || !m_fixedBottom.defined()) + y += m_fixedMarginTop.calcFloatValue(h) + m_fixedTop.calcFloatValue(h) - m_fixedRect.fTop; else - y += m_fixedMarginTop.calcFloatValue(h) + m_fixedTop.calcFloatValue(h) - layerRect.fTop; + y += h - m_fixedMarginBottom.calcFloatValue(h) - m_fixedBottom.calcFloatValue(h) - m_fixedRect.fBottom; this->setPosition(x, y); } @@ -375,10 +357,9 @@ void LayerAndroid::onDraw(SkCanvas* canvas, SkScalar opacity) { canvas->drawLine(w, 0, 0, 0, paint); if (m_isFixed) { - SkRect layerRect = computeLayerRect(this); SkPaint paint; - paint.setARGB(128, 0, 0, 255); - canvas->drawRect(layerRect, paint); + paint.setARGB(80, 255, 0, 0); + canvas->drawRect(m_fixedRect, paint); } #endif } @@ -513,6 +494,13 @@ void writeSize(FILE* file, int indentLevel, const char* str, SkSize size) fprintf(file, "%s = { w = %.3f; h = %.3f; };\n", str, size.width(), size.height()); } +void writeRect(FILE* file, int indentLevel, const char* str, SkRect rect) +{ + writeIndent(file, indentLevel); + fprintf(file, "%s = { x = %.3f; y = %.3f; w = %.3f; h = %.3f; };\n", + str, rect.fLeft, rect.fTop, rect.width(), rect.height()); +} + void writeLength(FILE* file, int indentLevel, const char* str, SkLength length) { if (!length.defined()) return; @@ -549,9 +537,7 @@ void LayerAndroid::dumpLayers(FILE* file, int indentLevel) const writeLength(file, indentLevel + 1, "fixedMarginTop", m_fixedMarginTop); writeLength(file, indentLevel + 1, "fixedMarginRight", m_fixedMarginRight); writeLength(file, indentLevel + 1, "fixedMarginBottom", m_fixedMarginBottom); - writePoint(file, indentLevel + 1, "fixedOffset", m_fixedOffset); - writeIntVal(file, indentLevel + 1, "fixedWidth", m_fixedWidth); - writeIntVal(file, indentLevel + 1, "fixedHeight", m_fixedHeight); + writeRect(file, indentLevel + 1, "fixedRect", m_fixedRect); } if (m_recordingPicture) { diff --git a/WebCore/platform/graphics/android/LayerAndroid.h b/WebCore/platform/graphics/android/LayerAndroid.h index 2b106d1..b6b6f70 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.h +++ b/WebCore/platform/graphics/android/LayerAndroid.h @@ -104,10 +104,7 @@ public: SkLength marginTop, // CSS margin-top property SkLength marginRight, // CSS margin-right property SkLength marginBottom, // CSS margin-bottom property - int offsetX, // X Offset from the renderer - int offsetY, // Y Offset from the renderer - int width, // visible overflow width - int height) { // visible overflow height + SkRect viewRect) { // view rect, can be smaller than the layer's m_fixedLeft = left; m_fixedTop = top; m_fixedRight = right; @@ -116,9 +113,7 @@ public: m_fixedMarginTop = marginTop; m_fixedMarginRight = marginRight; m_fixedMarginBottom = marginBottom; - m_fixedOffset.set(offsetX, offsetY); - m_fixedWidth = width; - m_fixedHeight = height; + m_fixedRect = viewRect; m_isFixed = true; setInheritFromRootTransform(true); } @@ -171,9 +166,6 @@ public: void setExtra(DrawExtra* extra); // does not assign ownership int uniqueId() const { return m_uniqueId; } bool isFixed() { return m_isFixed; } - const SkPoint& getOffset() const { return m_fixedOffset; } - int getFixedWidth() { return m_fixedWidth; } - int getFixedHeight() { return m_fixedHeight; } /** This sets a content image -- calling it means we will use the image directly when drawing the layer instead of using @@ -208,9 +200,7 @@ private: SkLength m_fixedMarginTop; SkLength m_fixedMarginRight; SkLength m_fixedMarginBottom; - SkPoint m_fixedOffset; - int m_fixedWidth; - int m_fixedHeight; + SkRect m_fixedRect; SkPoint m_translation; SkPoint m_scale; diff --git a/WebCore/platform/posix/FileSystemPOSIX.cpp b/WebCore/platform/posix/FileSystemPOSIX.cpp index ac8c7fa..b7fcd71 100644 --- a/WebCore/platform/posix/FileSystemPOSIX.cpp +++ b/WebCore/platform/posix/FileSystemPOSIX.cpp @@ -213,10 +213,12 @@ bool makeAllDirectories(const String& path) return true; } +#if !PLATFORM(ANDROID) String pathGetFileName(const String& path) { return path.substring(path.reverseFind('/') + 1); } +#endif String directoryName(const String& path) { |