#include "Internals.h"
#include <v8.h>
-#include "InspectorFrontendClientLocal.h"
#include "InternalProfilers.h"
#include "InternalRuntimeFlags.h"
#include "InternalSettings.h"
#include "core/fetch/ResourceFetcher.h"
#include "core/frame/DOMPoint.h"
#include "core/frame/DOMWindow.h"
+#include "core/frame/EventHandlerRegistry.h"
#include "core/frame/FrameView.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
using namespace HTMLNames;
-class InspectorFrontendChannelDummy : public InspectorFrontendChannel {
-public:
- explicit InspectorFrontendChannelDummy(Page*);
- virtual ~InspectorFrontendChannelDummy() { }
- virtual void sendMessageToFrontend(PassRefPtr<JSONObject> message) OVERRIDE;
- virtual void flush() OVERRIDE { }
-
-private:
- Page* m_frontendPage;
-};
-
-InspectorFrontendChannelDummy::InspectorFrontendChannelDummy(Page* page)
- : m_frontendPage(page)
-{
-}
-
-void InspectorFrontendChannelDummy::sendMessageToFrontend(PassRefPtr<JSONObject> message)
-{
- InspectorClient::doDispatchMessageOnFrontendPage(m_frontendPage, message->toJSONString());
-}
-
static bool markerTypesFrom(const String& markerType, DocumentMarker::MarkerTypes& result)
{
if (markerType.isEmpty() || equalIgnoringCase(markerType, "all"))
return 0;
}
-PassRefPtr<CSSComputedStyleDeclaration> Internals::computedStyleIncludingVisitedInfo(Node* node, ExceptionState& exceptionState) const
+PassRefPtrWillBeRawPtr<CSSComputedStyleDeclaration> Internals::computedStyleIncludingVisitedInfo(Node* node, ExceptionState& exceptionState) const
{
if (!node) {
exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::argumentNullOrIncorrectType(1, "Node"));
exceptionState.throwDOMException(InvalidAccessError, "No history item is available.");
return;
}
+ mainItem->clearDocumentState();
mainItem->setDocumentState(state);
}
return s_pagePopupDriver ? s_pagePopupDriver->pagePopupController() : 0;
}
-PassRefPtr<ClientRect> Internals::unscaledViewportRect(ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRect> Internals::unscaledViewportRect(ExceptionState& exceptionState)
{
Document* document = contextDocument();
if (!document || !document->view()) {
return ClientRect::create(document->view()->visibleContentRect());
}
-PassRefPtr<ClientRect> Internals::absoluteCaretBounds(ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRect> Internals::absoluteCaretBounds(ExceptionState& exceptionState)
{
Document* document = contextDocument();
if (!document || !document->frame()) {
return ClientRect::create(document->frame()->selection().absoluteCaretBounds());
}
-PassRefPtr<ClientRect> Internals::boundingBox(Element* element, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRect> Internals::boundingBox(Element* element, ExceptionState& exceptionState)
{
if (!element) {
exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::argumentNullOrIncorrectType(1, "Element"));
return ClientRect::create(renderer->absoluteBoundingBoxRectIgnoringTransforms());
}
-PassRefPtr<ClientRectList> Internals::inspectorHighlightRects(Document* document, ExceptionState& exceptionState)
-{
- if (!document || !document->page()) {
- exceptionState.throwDOMException(InvalidAccessError, document ? "The document's Page cannot be retrieved." : "No context document can be obtained.");
- return ClientRectList::create();
- }
-
- Highlight highlight;
- document->page()->inspectorController().getHighlight(&highlight);
- return ClientRectList::create(highlight.quads);
-}
-
unsigned Internals::markerCountForNode(Node* node, const String& markerType, ExceptionState& exceptionState)
{
if (!node) {
return markers[index];
}
-PassRefPtr<Range> Internals::markerRangeForNode(Node* node, const String& markerType, unsigned index, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<Range> Internals::markerRangeForNode(Node* node, const String& markerType, unsigned index, ExceptionState& exceptionState)
{
DocumentMarker* marker = markerAt(node, markerType, index, exceptionState);
if (!marker)
document->page()->mainFrame()->view()->setFrameRect(IntRect(IntPoint::zero(), initialViewportSize));
ViewportDescription description = page->viewportDescription();
- PageScaleConstraints constraints = description.resolve(initialViewportSize);
+ PageScaleConstraints constraints = description.resolve(initialViewportSize, Length());
constraints.fitToContentsWidth(constraints.layoutSize.width(), availableWidth);
frameView->scrollElementToRect(element, IntRect(x, y, w, h));
}
-PassRefPtr<Range> Internals::rangeFromLocationAndLength(Element* scope, int rangeLocation, int rangeLength, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<Range> Internals::rangeFromLocationAndLength(Element* scope, int rangeLocation, int rangeLength, ExceptionState& exceptionState)
{
if (!scope) {
exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::argumentNullOrIncorrectType(1, "Element"));
return targetNode;
}
-PassRefPtr<ClientRect> Internals::bestZoomableAreaForTouchPoint(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRect> Internals::bestZoomableAreaForTouchPoint(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
{
if (!document || !document->frame()) {
exceptionState.throwDOMException(InvalidAccessError, document ? "The document's frame cannot be retrieved." : "The document provided is invalid.");
return document->activeDOMObjectCount();
}
+static unsigned eventHandlerCount(Document& document, EventHandlerRegistry::EventHandlerClass handlerClass)
+{
+ if (!document.frameHost())
+ return 0;
+ EventHandlerRegistry* registry = &document.frameHost()->eventHandlerRegistry();
+ unsigned count = 0;
+ const EventTargetSet* targets = registry->eventHandlerTargets(handlerClass);
+ if (targets) {
+ for (EventTargetSet::const_iterator iter = targets->begin(); iter != targets->end(); ++iter)
+ count += iter->value;
+ }
+ return count;
+}
+
unsigned Internals::wheelEventHandlerCount(Document* document, ExceptionState& exceptionState)
{
if (!document) {
return WheelController::from(*document)->wheelEventHandlerCount();
}
+unsigned Internals::scrollEventHandlerCount(Document* document, ExceptionState& exceptionState)
+{
+ if (!document) {
+ exceptionState.throwDOMException(InvalidAccessError, "No context document is available.");
+ return 0;
+ }
+
+ return eventHandlerCount(*document, EventHandlerRegistry::ScrollEvent);
+}
+
unsigned Internals::touchEventHandlerCount(Document* document, ExceptionState& exceptionState)
{
if (!document) {
return count;
}
-static RenderLayer* findRenderLayerForGraphicsLayer(RenderLayer* searchRoot, GraphicsLayer* graphicsLayer, String* layerType)
+static RenderLayer* findRenderLayerForGraphicsLayer(RenderLayer* searchRoot, GraphicsLayer* graphicsLayer, IntSize* layerOffset, String* layerType)
{
- if (searchRoot->hasCompositedLayerMapping() && graphicsLayer == searchRoot->compositedLayerMapping()->mainGraphicsLayer())
+ *layerOffset = IntSize();
+ if (searchRoot->hasCompositedLayerMapping() && graphicsLayer == searchRoot->compositedLayerMapping()->mainGraphicsLayer()) {
+ CompositedLayerMappingPtr compositedLayerMapping = searchRoot->compositedLayerMapping();
+ LayoutSize offset = compositedLayerMapping->contentOffsetInCompositingLayer();
+ *layerOffset = IntSize(offset.width(), offset.height());
return searchRoot;
+ }
GraphicsLayer* layerForScrolling = searchRoot->scrollableArea() ? searchRoot->scrollableArea()->layerForScrolling() : 0;
if (graphicsLayer == layerForScrolling) {
return searchRoot;
}
+ if (searchRoot->compositingState() == PaintsIntoGroupedBacking) {
+ GraphicsLayer* squashingLayer = searchRoot->groupedMapping()->squashingLayer();
+ if (graphicsLayer == squashingLayer) {
+ *layerType ="squashing";
+ *layerOffset = -searchRoot->offsetFromSquashingLayerOrigin();
+ return searchRoot;
+ }
+ }
+
GraphicsLayer* layerForHorizontalScrollbar = searchRoot->scrollableArea() ? searchRoot->scrollableArea()->layerForHorizontalScrollbar() : 0;
if (graphicsLayer == layerForHorizontalScrollbar) {
*layerType = "horizontalScrollbar";
return searchRoot;
}
- for (RenderLayer* child = searchRoot->firstChild(); child; child = child->nextSibling()) {
- RenderLayer* foundLayer = findRenderLayerForGraphicsLayer(child, graphicsLayer, layerType);
+ // Search right to left to increase the chances that we'll choose the top-most layers in a
+ // grouped mapping for squashing.
+ for (RenderLayer* child = searchRoot->lastChild(); child; child = child->previousSibling()) {
+ RenderLayer* foundLayer = findRenderLayerForGraphicsLayer(child, graphicsLayer, layerOffset, layerType);
if (foundLayer)
return foundLayer;
}
if (!layerRects.isEmpty()) {
mergeRects(layerRects);
String layerType;
- RenderLayer* renderLayer = findRenderLayerForGraphicsLayer(compositor->rootRenderLayer(), graphicsLayer, &layerType);
+ IntSize layerOffset;
+ RenderLayer* renderLayer = findRenderLayerForGraphicsLayer(compositor->rootRenderLayer(), graphicsLayer, &layerOffset, &layerType);
Node* node = renderLayer ? renderLayer->renderer()->node() : 0;
for (size_t i = 0; i < layerRects.size(); ++i) {
- if (!layerRects[i].isEmpty())
- rects->append(node, layerType, ClientRect::create(layerRects[i]));
+ if (!layerRects[i].isEmpty()) {
+ rects->append(node, layerType, layerOffset.width(), layerOffset.height(), ClientRect::create(layerRects[i]));
+ }
}
}
return result;
}
-PassRefPtrWillBeRawPtr<DOMWindow> Internals::openDummyInspectorFrontend(const String& url)
-{
- Page* page = contextDocument()->frame()->page();
- ASSERT(page);
-
- DOMWindow* window = page->mainFrame()->domWindow();
- ASSERT(window);
-
- m_frontendWindow = window->open(url, "", "", window, window);
- ASSERT(m_frontendWindow);
-
- Page* frontendPage = m_frontendWindow->document()->page();
- ASSERT(frontendPage);
-
- OwnPtr<InspectorFrontendClientLocal> frontendClient = adoptPtr(new InspectorFrontendClientLocal(page->inspectorController(), frontendPage));
-
- frontendPage->inspectorController().setInspectorFrontendClient(frontendClient.release());
-
- m_frontendChannel = adoptPtr(new InspectorFrontendChannelDummy(frontendPage));
-
- page->inspectorController().connectFrontend(m_frontendChannel.get());
-
- return m_frontendWindow;
-}
-
-void Internals::closeDummyInspectorFrontend()
-{
- Page* page = contextDocument()->frame()->page();
- ASSERT(page);
- ASSERT(m_frontendWindow);
-
- page->inspectorController().disconnectFrontend();
-
- m_frontendChannel.release();
-
- m_frontendWindow->close(m_frontendWindow->executionContext());
- m_frontendWindow.release();
-}
-
Vector<unsigned long> Internals::setMemoryCacheCapacities(unsigned long minDeadBytes, unsigned long maxDeadBytes, unsigned long totalBytes)
{
Vector<unsigned long> result;
String Internals::elementLayerTreeAsText(Element* element, ExceptionState& exceptionState) const
{
- FrameView* frameView = element->document().view();
- frameView->updateLayoutAndStyleForPainting();
-
- return elementLayerTreeAsText(element, 0, exceptionState);
-}
-
-static PassRefPtr<NodeList> paintOrderList(Element* element, ExceptionState& exceptionState, RenderLayerStackingNode::PaintOrderListType type)
-{
if (!element) {
exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::argumentNullOrIncorrectType(1, "Element"));
- return nullptr;
- }
-
- element->document().updateLayout();
-
- RenderObject* renderer = element->renderer();
- if (!renderer || !renderer->isBox()) {
- exceptionState.throwDOMException(InvalidAccessError, renderer ? "The provided element's renderer is not a box." : "The provided element has no renderer.");
- return nullptr;
- }
-
- RenderLayer* layer = toRenderBox(renderer)->layer();
- if (!layer) {
- exceptionState.throwDOMException(InvalidAccessError, "No render layer can be obtained from the provided element.");
- return nullptr;
+ return String();
}
- Vector<RefPtr<Node> > nodes;
- layer->stackingNode()->computePaintOrderList(type, nodes);
- return StaticNodeList::adopt(nodes);
-}
-
-PassRefPtr<NodeList> Internals::paintOrderListBeforePromote(Element* element, ExceptionState& exceptionState)
-{
- return paintOrderList(element, exceptionState, RenderLayerStackingNode::BeforePromote);
-}
+ FrameView* frameView = element->document().view();
+ frameView->updateLayoutAndStyleForPainting();
-PassRefPtr<NodeList> Internals::paintOrderListAfterPromote(Element* element, ExceptionState& exceptionState)
-{
- return paintOrderList(element, exceptionState, RenderLayerStackingNode::AfterPromote);
+ return elementLayerTreeAsText(element, 0, exceptionState);
}
bool Internals::scrollsWithRespectTo(Element* element1, Element* element2, ExceptionState& exceptionState)
return 0;
}
- element->document().updateLayout();
+ element->document().view()->updateLayoutAndStyleForPainting();
RenderObject* renderer = element->renderer();
if (!renderer || !renderer->isBox()) {
return layer->isUnclippedDescendant();
}
-bool Internals::needsCompositedScrolling(Element* element, ExceptionState& exceptionState)
-{
- if (!element) {
- exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::argumentNullOrIncorrectType(1, "Element"));
- return 0;
- }
-
- element->document().updateLayout();
-
- RenderObject* renderer = element->renderer();
- if (!renderer || !renderer->isBox()) {
- exceptionState.throwDOMException(InvalidAccessError, renderer ? "The provided element's renderer is not a box." : "The provided element has no renderer.");
- return 0;
- }
-
- RenderLayer* layer = toRenderBox(renderer)->layer();
- if (!layer) {
- exceptionState.throwDOMException(InvalidAccessError, "No render layer can be obtained from the provided element.");
- return 0;
- }
-
- return layer->needsCompositedScrolling();
-}
-
String Internals::layerTreeAsText(Document* document, unsigned flags, ExceptionState& exceptionState) const
{
if (!document || !document->frame()) {
return document->frame()->trackedRepaintRectsAsText();
}
-PassRefPtr<ClientRectList> Internals::repaintRects(Element* element, ExceptionState& exceptionState) const
+PassRefPtrWillBeRawPtr<ClientRectList> Internals::repaintRects(Element* element, ExceptionState& exceptionState) const
{
if (!element) {
exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::argumentNullOrIncorrectType(1, "Element"));
return nullptr;
}
+ element->document().frame()->view()->updateLayoutAndStyleForPainting();
+
if (RenderLayer* layer = getRenderLayerForElement(element, exceptionState)) {
if (layer->compositingState() == PaintsIntoOwnBacking) {
OwnPtr<Vector<FloatRect> > rects = layer->collectTrackedRepaintRects();
return String();
}
- // Force a re-layout and a compositing update.
- document->updateLayout();
- RenderView* view = document->renderView();
- if (view->compositor())
- view->compositor()->updateCompositingLayers();
+ document->frame()->view()->updateLayoutAndStyleForPainting();
Page* page = document->page();
if (!page)
return page->mainThreadScrollingReasonsAsText();
}
-PassRefPtr<ClientRectList> Internals::nonFastScrollableRects(Document* document, ExceptionState& exceptionState) const
+PassRefPtrWillBeRawPtr<ClientRectList> Internals::nonFastScrollableRects(Document* document, ExceptionState& exceptionState) const
{
if (!document || !document->frame()) {
exceptionState.throwDOMException(InvalidAccessError, document ? "The document's frame cannot be retrieved." : "The document provided is invalid.");
Vector<String> Internals::getReferencedFilePaths() const
{
- frame()->loader().saveDocumentState();
- return FormController::getReferencedFilePaths(frame()->loader().currentItem()->documentState());
+ return frame()->loader().currentItem()->getReferencedFilePaths();
}
void Internals::startTrackingRepaints(Document* document, ExceptionState& exceptionState)
}
FrameView* frameView = document->view();
+ frameView->updateLayoutAndStyleForPainting();
frameView->setTracksRepaints(true);
}
}
FrameView* frameView = document->view();
+ frameView->updateLayoutAndStyleForPainting();
frameView->setTracksRepaints(false);
}
document->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasksSynchronously);
}
-PassRefPtr<ClientRectList> Internals::draggableRegions(Document* document, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRectList> Internals::draggableRegions(Document* document, ExceptionState& exceptionState)
{
return annotatedRegions(document, true, exceptionState);
}
-PassRefPtr<ClientRectList> Internals::nonDraggableRegions(Document* document, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRectList> Internals::nonDraggableRegions(Document* document, ExceptionState& exceptionState)
{
return annotatedRegions(document, false, exceptionState);
}
-PassRefPtr<ClientRectList> Internals::annotatedRegions(Document* document, bool draggable, ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRectList> Internals::annotatedRegions(Document* document, bool draggable, ExceptionState& exceptionState)
{
if (!document || !document->view()) {
exceptionState.throwDOMException(InvalidAccessError, document ? "The document's view cannot be retrieved." : "The document provided is invalid.");
frame()->loader().reload(endToEnd ? EndToEndReload : NormalReload);
}
-PassRefPtr<ClientRect> Internals::selectionBounds(ExceptionState& exceptionState)
+PassRefPtrWillBeRawPtr<ClientRect> Internals::selectionBounds(ExceptionState& exceptionState)
{
Document* document = contextDocument();
if (!document || !document->frame()) {
void Internals::forceCompositingUpdate(Document* document, ExceptionState& exceptionState)
{
+ // Hit when running content_shell with --expose-internals-for-testing.
+ DisableCompositingQueryAsserts disabler;
+
if (!document || !document->renderView()) {
exceptionState.throwDOMException(InvalidAccessError, document ? "The document's render view cannot be retrieved." : "The document provided is invalid.");
return;
}
- document->updateLayout();
-
- RenderView* view = document->renderView();
- if (view->compositor())
- view->compositor()->updateCompositingLayers();
+ document->frame()->view()->updateLayoutAndStyleForPainting();
}
bool Internals::isCompositorFramePending(Document* document, ExceptionState& exceptionState)
} // namespace
-ScriptPromise Internals::createPromise(ExecutionContext* context)
+ScriptPromise Internals::createPromise(ScriptState* scriptState)
{
- return ScriptPromiseResolver::create(context)->promise();
+ return ScriptPromiseResolver::create(scriptState)->promise();
}
-ScriptPromise Internals::createResolvedPromise(ExecutionContext* context, ScriptValue value)
+ScriptPromise Internals::createResolvedPromise(ScriptState* scriptState, ScriptValue value)
{
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(context);
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
resolver->resolve(value);
return promise;
}
-ScriptPromise Internals::createRejectedPromise(ExecutionContext* context, ScriptValue value)
+ScriptPromise Internals::createRejectedPromise(ScriptState* scriptState, ScriptValue value)
{
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(context);
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
resolver->reject(value);
return promise;
void Internals::trace(Visitor* visitor)
{
- visitor->trace(m_frontendWindow);
visitor->trace(m_runtimeFlags);
visitor->trace(m_profilers);
}
-void Internals::startSpeechInput(Element* element)
-{
-#if ENABLE(INPUT_SPEECH)
- HTMLInputElement* input = toHTMLInputElement(element);
- if (!input->isSpeechEnabled())
- return;
-
- InputFieldSpeechButtonElement* speechButton = toInputFieldSpeechButtonElement(input->userAgentShadowRoot()->getElementById(ShadowElementNames::speechButton()));
- if (speechButton)
- speechButton->startSpeechInput();
-#endif
-}
-
void Internals::setValueForUser(Element* element, const String& value)
{
toHTMLInputElement(element)->setValueForUser(value);