#include "core/dom/PseudoElement.h"
#include "core/inspector/InspectorClient.h"
#include "core/inspector/InspectorOverlayHost.h"
-#include "core/loader/DocumentLoader.h"
#include "core/loader/EmptyClients.h"
+#include "core/loader/FrameLoadRequest.h"
#include "core/page/Chrome.h"
#include "core/page/EventHandler.h"
#include "core/frame/Frame.h"
#include "core/frame/FrameView.h"
#include "core/page/Page.h"
-#include "core/page/Settings.h"
-#include "core/platform/graphics/GraphicsContextStateSaver.h"
+#include "core/frame/Settings.h"
#include "core/rendering/RenderBoxModelObject.h"
#include "core/rendering/RenderInline.h"
#include "core/rendering/RenderObject.h"
#include "core/rendering/style/RenderStyleConstants.h"
#include "platform/JSONValues.h"
#include "platform/PlatformMouseEvent.h"
+#include "platform/graphics/GraphicsContextStateSaver.h"
#include "wtf/text/StringBuilder.h"
namespace WebCore {
namespace {
-class InspectorOverlayChromeClient: public EmptyChromeClient {
+class InspectorOverlayChromeClient FINAL: public EmptyChromeClient {
public:
InspectorOverlayChromeClient(ChromeClient& client, InspectorOverlay* overlay)
: m_client(client)
, m_overlay(overlay)
{ }
- virtual void setCursor(const Cursor& cursor)
+ virtual void setCursor(const Cursor& cursor) OVERRIDE
{
m_client.setCursor(cursor);
}
- virtual void setToolTip(const String& tooltip, TextDirection direction)
+ virtual void setToolTip(const String& tooltip, TextDirection direction) OVERRIDE
{
m_client.setToolTip(tooltip, direction);
}
- virtual void invalidateRootView(const IntRect& rect)
+ virtual void invalidateContentsAndRootView(const IntRect&) OVERRIDE
{
m_overlay->invalidate();
}
- virtual void invalidateContentsAndRootView(const IntRect& rect)
- {
- m_overlay->invalidate();
- }
-
- virtual void invalidateContentsForSlowScroll(const IntRect& rect)
+ virtual void invalidateContentsForSlowScroll(const IntRect&) OVERRIDE
{
m_overlay->invalidate();
}
, m_drawViewSize(false)
, m_drawViewSizeWithGrid(false)
, m_timer(this, &InspectorOverlay::onTimer)
+ , m_activeProfilerCount(0)
{
}
return overlayPage()->mainFrame()->eventHandler().handleTouchEvent(event);
}
+bool InspectorOverlay::handleKeyboardEvent(const PlatformKeyboardEvent& event)
+{
+ if (isEmpty())
+ return false;
+
+ return overlayPage()->mainFrame()->eventHandler().keyEvent(event);
+}
+
void InspectorOverlay::drawOutline(GraphicsContext* context, const LayoutRect& rect, const Color& color)
{
FloatRect outlineRect = rect;
bool InspectorOverlay::isEmpty()
{
+ if (m_activeProfilerCount)
+ return true;
bool hasAlwaysVisibleElements = m_highlightNode || m_eventTargetNode || m_highlightQuad || !m_size.isEmpty() || m_drawViewSize;
bool hasInvisibleInInspectModeElements = !m_pausedInDebuggerMessage.isNull();
return !(hasAlwaysVisibleElements || (hasInvisibleInInspectModeElements && !m_inspectModeEnabled));
if (!view)
return;
IntRect viewRect = view->visibleContentRect();
- FrameView* overlayView = overlayPage()->mainFrame()->view();
// Include scrollbars to avoid masking them by the gutter.
IntSize frameViewFullSize = view->visibleContentRect(ScrollableArea::IncludeScrollbars).size();
IntSize size = m_size.isEmpty() ? frameViewFullSize : m_size;
size.scale(m_page->pageScaleFactor());
- overlayView->resize(size);
+ overlayPage()->mainFrame()->view()->resize(size);
// Clear canvas and paint things.
reset(size, m_size.isEmpty() ? IntSize() : frameViewFullSize, viewRect.x(), viewRect.y());
drawViewSize();
// Position DOM elements.
- overlayPage()->mainFrame()->document()->recalcStyle(Force);
- if (overlayView->needsLayout())
- overlayView->layout();
+ overlayPage()->mainFrame()->document()->setNeedsStyleRecalc(SubtreeStyleChange);
+ overlayPage()->mainFrame()->document()->updateLayout();
// Kick paint.
m_client->highlight();
m_overlayChromeClient = adoptPtr(new InspectorOverlayChromeClient(m_page->chrome().client(), this));
pageClients.chromeClient = m_overlayChromeClient.get();
m_overlayPage = adoptPtr(new Page(pageClients));
- m_overlayPage->setGroupType(Page::InspectorPageGroup);
Settings& settings = m_page->settings();
Settings& overlaySettings = m_overlayPage->settings();
- overlaySettings.setStandardFontFamily(settings.standardFontFamily());
- overlaySettings.setSerifFontFamily(settings.serifFontFamily());
- overlaySettings.setSansSerifFontFamily(settings.sansSerifFontFamily());
- overlaySettings.setCursiveFontFamily(settings.cursiveFontFamily());
- overlaySettings.setFantasyFontFamily(settings.fantasyFontFamily());
- overlaySettings.setPictographFontFamily(settings.pictographFontFamily());
+ overlaySettings.genericFontFamilySettings().setStandard(settings.genericFontFamilySettings().standard());
+ overlaySettings.genericFontFamilySettings().setSerif(settings.genericFontFamilySettings().serif());
+ overlaySettings.genericFontFamilySettings().setSansSerif(settings.genericFontFamilySettings().sansSerif());
+ overlaySettings.genericFontFamilySettings().setCursive(settings.genericFontFamilySettings().cursive());
+ overlaySettings.genericFontFamilySettings().setFantasy(settings.genericFontFamilySettings().fantasy());
+ overlaySettings.genericFontFamilySettings().setPictograph(settings.genericFontFamilySettings().pictograph());
overlaySettings.setMinimumFontSize(settings.minimumFontSize());
overlaySettings.setMinimumLogicalFontSize(settings.minimumLogicalFontSize());
overlaySettings.setMediaEnabled(false);
overlaySettings.setPluginsEnabled(false);
overlaySettings.setLoadsImagesAutomatically(true);
- RefPtr<Frame> frame = Frame::create(FrameInit::create(0, m_overlayPage.get(), dummyFrameLoaderClient));
+ RefPtr<Frame> frame = Frame::create(FrameInit::create(0, &m_overlayPage->frameHost(), dummyFrameLoaderClient));
frame->setView(FrameView::create(frame.get()));
frame->init();
FrameLoader& loader = frame->loader();
frame->view()->setCanHaveScrollbars(false);
frame->view()->setTransparent(true);
- ASSERT(loader.activeDocumentLoader());
- DocumentWriter* writer = loader.activeDocumentLoader()->beginWriting("text/html", "UTF-8");
- writer->addData(reinterpret_cast<const char*>(InspectorOverlayPage_html), sizeof(InspectorOverlayPage_html));
- loader.activeDocumentLoader()->endWriting(writer);
+
+ RefPtr<SharedBuffer> data = SharedBuffer::create(reinterpret_cast<const char*>(InspectorOverlayPage_html), sizeof(InspectorOverlayPage_html));
+ loader.load(FrameLoadRequest(0, blankURL(), SubstituteData(data, "text/html", "UTF-8", KURL(), ForceSynchronousLoad)));
v8::Isolate* isolate = toIsolate(frame.get());
v8::HandleScope handleScope(isolate);
- v8::Handle<v8::Context> frameContext = frame->script().currentWorldContext();
+ v8::Handle<v8::Context> frameContext = toV8Context(isolate, frame.get(), DOMWrapperWorld::mainWorld());
+ ASSERT(!frameContext.IsEmpty());
v8::Context::Scope contextScope(frameContext);
v8::Handle<v8::Value> overlayHostObj = toV8(m_overlayHost.get(), v8::Handle<v8::Object>(), isolate);
v8::Handle<v8::Object> global = frameContext->Global();
- global->Set(v8::String::New("InspectorOverlayHost"), overlayHostObj);
+ global->Set(v8::String::NewFromUtf8(isolate, "InspectorOverlayHost"), overlayHostObj);
#if OS(WIN)
evaluateInOverlay("setPlatform", "windows");
void InspectorOverlay::freePage()
{
- m_overlayPage.clear();
+ if (m_overlayPage) {
+ // FIXME: This logic is duplicated in SVGImage and WebViewImpl. Perhaps it can be combined
+ // into Page's destructor.
+ m_overlayPage->mainFrame()->loader().frameDetached();
+ m_overlayPage.clear();
+ }
m_overlayChromeClient.clear();
m_timer.stop();
}
+void InspectorOverlay::startedRecordingProfile()
+{
+ if (!m_activeProfilerCount++)
+ freePage();
+}
+
} // namespace WebCore