summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp')
-rw-r--r--Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp97
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