diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp')
-rw-r--r-- | Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp | 97 |
1 files changed, 89 insertions, 8 deletions
diff --git a/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp b/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp index 9b947d103..1a34a9144 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp +++ b/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Apple Inc. All rights reserved. + * Copyright (C) 2010, 2015-2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,9 +26,22 @@ #include "config.h" #include "InjectedBundleRangeHandle.h" +#include "InjectedBundleNodeHandle.h" +#include "ShareableBitmap.h" +#include "WebImage.h" #include <JavaScriptCore/APICast.h> +#include <JavaScriptCore/HeapInlines.h> +#include <WebCore/Document.h> +#include <WebCore/FloatRect.h> +#include <WebCore/Frame.h> +#include <WebCore/FrameSelection.h> +#include <WebCore/FrameView.h> +#include <WebCore/GraphicsContext.h> +#include <WebCore/IntRect.h> #include <WebCore/JSRange.h> +#include <WebCore/Page.h> #include <WebCore/Range.h> +#include <WebCore/VisibleSelection.h> #include <wtf/HashMap.h> #include <wtf/NeverDestroyed.h> @@ -44,9 +57,9 @@ static DOMHandleCache& domHandleCache() return cache; } -PassRefPtr<InjectedBundleRangeHandle> InjectedBundleRangeHandle::getOrCreate(JSContextRef, JSObjectRef object) +PassRefPtr<InjectedBundleRangeHandle> InjectedBundleRangeHandle::getOrCreate(JSContextRef context, JSObjectRef object) { - Range* range = toRange(toJS(object)); + Range* range = JSRange::toWrapped(toJS(context)->vm(), toJS(object)); return getOrCreate(range); } @@ -59,14 +72,14 @@ PassRefPtr<InjectedBundleRangeHandle> InjectedBundleRangeHandle::getOrCreate(Ran if (!result.isNewEntry) return PassRefPtr<InjectedBundleRangeHandle>(result.iterator->value); - RefPtr<InjectedBundleRangeHandle> rangeHandle = InjectedBundleRangeHandle::create(range); - result.iterator->value = rangeHandle.get(); - return rangeHandle.release(); + auto rangeHandle = InjectedBundleRangeHandle::create(range); + result.iterator->value = rangeHandle.ptr(); + return WTFMove(rangeHandle); } -PassRefPtr<InjectedBundleRangeHandle> InjectedBundleRangeHandle::create(Range* range) +Ref<InjectedBundleRangeHandle> InjectedBundleRangeHandle::create(Range* range) { - return adoptRef(new InjectedBundleRangeHandle(range)); + return adoptRef(*new InjectedBundleRangeHandle(range)); } InjectedBundleRangeHandle::InjectedBundleRangeHandle(Range* range) @@ -84,4 +97,72 @@ Range* InjectedBundleRangeHandle::coreRange() const return m_range.get(); } +Ref<InjectedBundleNodeHandle> InjectedBundleRangeHandle::document() +{ + return InjectedBundleNodeHandle::getOrCreate(m_range->ownerDocument()); +} + +WebCore::IntRect InjectedBundleRangeHandle::boundingRectInWindowCoordinates() const +{ + FloatRect boundingRect = m_range->absoluteBoundingRect(); + Frame* frame = m_range->ownerDocument().frame(); + return frame->view()->contentsToWindow(enclosingIntRect(boundingRect)); +} + +PassRefPtr<WebImage> InjectedBundleRangeHandle::renderedImage(SnapshotOptions options) +{ + Document& ownerDocument = m_range->ownerDocument(); + Frame* frame = ownerDocument.frame(); + if (!frame) + return nullptr; + + FrameView* frameView = frame->view(); + if (!frameView) + return nullptr; + + Ref<Frame> protector(*frame); + + VisibleSelection oldSelection = frame->selection().selection(); + frame->selection().setSelection(VisibleSelection(*m_range)); + + float scaleFactor = (options & SnapshotOptionsExcludeDeviceScaleFactor) ? 1 : frame->page()->deviceScaleFactor(); + IntRect paintRect = enclosingIntRect(m_range->absoluteBoundingRect()); + IntSize backingStoreSize = paintRect.size(); + backingStoreSize.scale(scaleFactor); + + RefPtr<ShareableBitmap> backingStore = ShareableBitmap::createShareable(backingStoreSize, ShareableBitmap::SupportsAlpha); + if (!backingStore) + return nullptr; + + auto graphicsContext = backingStore->createGraphicsContext(); + graphicsContext->scale(scaleFactor); + + paintRect.move(frameView->frameRect().x(), frameView->frameRect().y()); + paintRect.moveBy(-frameView->scrollPosition()); + + graphicsContext->translate(-paintRect.x(), -paintRect.y()); + + PaintBehavior oldPaintBehavior = frameView->paintBehavior(); + PaintBehavior paintBehavior = oldPaintBehavior | PaintBehaviorSelectionOnly | PaintBehaviorFlattenCompositingLayers; + if (options & SnapshotOptionsForceBlackText) + paintBehavior |= PaintBehaviorForceBlackText; + if (options & SnapshotOptionsForceWhiteText) + paintBehavior |= PaintBehaviorForceWhiteText; + + frameView->setPaintBehavior(paintBehavior); + ownerDocument.updateLayout(); + + frameView->paint(*graphicsContext, paintRect); + frameView->setPaintBehavior(oldPaintBehavior); + + frame->selection().setSelection(oldSelection); + + return WebImage::create(backingStore.releaseNonNull()); +} + +String InjectedBundleRangeHandle::text() const +{ + return m_range->text(); +} + } // namespace WebKit |