| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
| 3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
| 4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
| 5 * 2000 Simon Hausmann <hausmann@kde.org> | 5 * 2000 Simon Hausmann <hausmann@kde.org> |
| 6 * 2000 Stefan Schimanski <1Stein@gmx.de> | 6 * 2000 Stefan Schimanski <1Stein@gmx.de> |
| 7 * 2001 George Staikos <staikos@kde.org> | 7 * 2001 George Staikos <staikos@kde.org> |
| 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
| 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> | 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> |
| 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 #include "core/dom/WheelController.h" | 36 #include "core/dom/WheelController.h" |
| 37 #include "core/editing/Editor.h" | 37 #include "core/editing/Editor.h" |
| 38 #include "core/editing/FrameSelection.h" | 38 #include "core/editing/FrameSelection.h" |
| 39 #include "core/editing/InputMethodController.h" | 39 #include "core/editing/InputMethodController.h" |
| 40 #include "core/editing/SpellChecker.h" | 40 #include "core/editing/SpellChecker.h" |
| 41 #include "core/editing/htmlediting.h" | 41 #include "core/editing/htmlediting.h" |
| 42 #include "core/editing/markup.h" | 42 #include "core/editing/markup.h" |
| 43 #include "core/events/Event.h" | 43 #include "core/events/Event.h" |
| 44 #include "core/fetch/ResourceFetcher.h" | 44 #include "core/fetch/ResourceFetcher.h" |
| 45 #include "core/frame/DOMWindow.h" | 45 #include "core/frame/DOMWindow.h" |
| 46 #include "core/frame/FrameDestructionObserver.h" | |
| 47 #include "core/frame/FrameHost.h" | 46 #include "core/frame/FrameHost.h" |
| 48 #include "core/frame/FrameView.h" | 47 #include "core/frame/FrameView.h" |
| 49 #include "core/frame/Settings.h" | 48 #include "core/frame/Settings.h" |
| 50 #include "core/html/HTMLFrameElementBase.h" | 49 #include "core/html/HTMLFrameElementBase.h" |
| 51 #include "core/inspector/InspectorInstrumentation.h" | 50 #include "core/inspector/InspectorInstrumentation.h" |
| 52 #include "core/loader/EmptyClients.h" | |
| 53 #include "core/loader/FrameLoaderClient.h" | 51 #include "core/loader/FrameLoaderClient.h" |
| 54 #include "core/page/Chrome.h" | 52 #include "core/page/Chrome.h" |
| 55 #include "core/page/ChromeClient.h" | |
| 56 #include "core/page/EventHandler.h" | 53 #include "core/page/EventHandler.h" |
| 57 #include "core/page/FocusController.h" | 54 #include "core/page/FocusController.h" |
| 58 #include "core/page/Page.h" | |
| 59 #include "core/page/scrolling/ScrollingCoordinator.h" | 55 #include "core/page/scrolling/ScrollingCoordinator.h" |
| 60 #include "core/rendering/HitTestResult.h" | 56 #include "core/rendering/HitTestResult.h" |
| 61 #include "core/rendering/RenderLayer.h" | 57 #include "core/rendering/RenderLayer.h" |
| 62 #include "core/rendering/RenderPart.h" | 58 #include "core/rendering/RenderPart.h" |
| 63 #include "core/rendering/RenderView.h" | 59 #include "core/rendering/RenderView.h" |
| 64 #include "core/rendering/compositing/RenderLayerCompositor.h" | 60 #include "core/rendering/compositing/RenderLayerCompositor.h" |
| 65 #include "core/svg/SVGDocument.h" | 61 #include "core/svg/SVGDocument.h" |
| 66 #include "platform/DragImage.h" | 62 #include "platform/DragImage.h" |
| 67 #include "platform/graphics/GraphicsContext.h" | 63 #include "platform/graphics/GraphicsContext.h" |
| 68 #include "platform/graphics/ImageBuffer.h" | 64 #include "platform/graphics/ImageBuffer.h" |
| 69 #include "public/platform/WebLayer.h" | |
| 70 #include "wtf/PassOwnPtr.h" | 65 #include "wtf/PassOwnPtr.h" |
| 71 #include "wtf/RefCountedLeakCounter.h" | |
| 72 #include "wtf/StdLibExtras.h" | 66 #include "wtf/StdLibExtras.h" |
| 73 | 67 |
| 74 using namespace std; | 68 using namespace std; |
| 75 | 69 |
| 76 namespace WebCore { | 70 namespace WebCore { |
| 77 | 71 |
| 78 using namespace HTMLNames; | 72 using namespace HTMLNames; |
| 79 | 73 |
| 80 namespace { | |
| 81 | |
| 82 int64_t generateFrameID() | |
| 83 { | |
| 84 // Initialize to the current time to reduce the likelihood of generating | |
| 85 // identifiers that overlap with those from past/future browser sessions. | |
| 86 static int64_t next = static_cast<int64_t>(currentTime() * 1000000.0); | |
| 87 return ++next; | |
| 88 } | |
| 89 | |
| 90 } // namespace | |
| 91 | |
| 92 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, frameCounter, ("LocalFrame"
)); | |
| 93 | |
| 94 static inline float parentPageZoomFactor(LocalFrame* frame) | 74 static inline float parentPageZoomFactor(LocalFrame* frame) |
| 95 { | 75 { |
| 96 LocalFrame* parent = frame->tree().parent(); | 76 LocalFrame* parent = frame->tree().parent(); |
| 97 if (!parent) | 77 if (!parent) |
| 98 return 1; | 78 return 1; |
| 99 return parent->pageZoomFactor(); | 79 return parent->pageZoomFactor(); |
| 100 } | 80 } |
| 101 | 81 |
| 102 static inline float parentTextZoomFactor(LocalFrame* frame) | 82 static inline float parentTextZoomFactor(LocalFrame* frame) |
| 103 { | 83 { |
| 104 LocalFrame* parent = frame->tree().parent(); | 84 LocalFrame* parent = frame->tree().parent(); |
| 105 if (!parent) | 85 if (!parent) |
| 106 return 1; | 86 return 1; |
| 107 return parent->textZoomFactor(); | 87 return parent->textZoomFactor(); |
| 108 } | 88 } |
| 109 | 89 |
| 110 inline LocalFrame::LocalFrame(PassRefPtr<FrameInit> frameInit) | 90 inline LocalFrame::LocalFrame(PassRefPtr<FrameInit> frameInit) |
| 111 : m_frameID(generateFrameID()) | 91 : Frame(frameInit) |
| 112 , m_host(frameInit->frameHost()) | |
| 113 , m_treeNode(this) | 92 , m_treeNode(this) |
| 114 , m_loader(this, frameInit->frameLoaderClient()) | 93 , m_loader(this, m_frameInit->frameLoaderClient()) |
| 115 , m_navigationScheduler(this) | 94 , m_navigationScheduler(this) |
| 116 , m_script(adoptPtr(new ScriptController(this))) | 95 , m_script(adoptPtr(new ScriptController(this))) |
| 117 , m_editor(Editor::create(*this)) | 96 , m_editor(Editor::create(*this)) |
| 118 , m_spellChecker(SpellChecker::create(*this)) | 97 , m_spellChecker(SpellChecker::create(*this)) |
| 119 , m_selection(adoptPtr(new FrameSelection(this))) | 98 , m_selection(adoptPtr(new FrameSelection(this))) |
| 120 , m_eventHandler(adoptPtr(new EventHandler(this))) | 99 , m_eventHandler(adoptPtr(new EventHandler(this))) |
| 121 , m_inputMethodController(InputMethodController::create(*this)) | 100 , m_inputMethodController(InputMethodController::create(*this)) |
| 122 , m_frameInit(frameInit) | |
| 123 , m_pageZoomFactor(parentPageZoomFactor(this)) | 101 , m_pageZoomFactor(parentPageZoomFactor(this)) |
| 124 , m_textZoomFactor(parentTextZoomFactor(this)) | 102 , m_textZoomFactor(parentTextZoomFactor(this)) |
| 125 , m_orientation(0) | 103 , m_orientation(0) |
| 126 , m_inViewSourceMode(false) | 104 , m_inViewSourceMode(false) |
| 127 , m_remotePlatformLayer(0) | |
| 128 { | 105 { |
| 129 ASSERT(page()); | |
| 130 | |
| 131 if (ownerElement()) { | 106 if (ownerElement()) { |
| 132 page()->incrementSubframeCount(); | 107 page()->incrementSubframeCount(); |
| 133 ownerElement()->setContentFrame(*this); | 108 ownerElement()->setContentFrame(*this); |
| 134 } | 109 } |
| 135 | |
| 136 #ifndef NDEBUG | |
| 137 frameCounter.increment(); | |
| 138 #endif | |
| 139 } | 110 } |
| 140 | 111 |
| 141 PassRefPtr<LocalFrame> LocalFrame::create(PassRefPtr<FrameInit> frameInit) | 112 PassRefPtr<LocalFrame> LocalFrame::create(PassRefPtr<FrameInit> frameInit) |
| 142 { | 113 { |
| 143 RefPtr<LocalFrame> frame = adoptRef(new LocalFrame(frameInit)); | 114 RefPtr<LocalFrame> frame = adoptRef(new LocalFrame(frameInit)); |
| 144 if (!frame->ownerElement()) | 115 if (!frame->ownerElement()) |
| 145 frame->page()->setMainFrame(frame); | 116 frame->page()->setMainFrame(frame); |
| 146 InspectorInstrumentation::frameAttachedToParent(frame.get()); | 117 InspectorInstrumentation::frameAttachedToParent(frame.get()); |
| 147 return frame.release(); | 118 return frame.release(); |
| 148 } | 119 } |
| 149 | 120 |
| 150 LocalFrame::~LocalFrame() | 121 LocalFrame::~LocalFrame() |
| 151 { | 122 { |
| 152 setView(nullptr); | 123 setView(nullptr); |
| 153 loader().clear(); | 124 loader().clear(); |
| 154 setDOMWindow(nullptr); | 125 setDOMWindow(nullptr); |
| 155 | 126 |
| 156 // FIXME: We should not be doing all this work inside the destructor | |
| 157 | |
| 158 #ifndef NDEBUG | |
| 159 frameCounter.decrement(); | |
| 160 #endif | |
| 161 | |
| 162 disconnectOwnerElement(); | 127 disconnectOwnerElement(); |
| 163 | |
| 164 HashSet<FrameDestructionObserver*>::iterator stop = m_destructionObservers.e
nd(); | |
| 165 for (HashSet<FrameDestructionObserver*>::iterator it = m_destructionObserver
s.begin(); it != stop; ++it) | |
| 166 (*it)->frameDestroyed(); | |
| 167 } | 128 } |
| 168 | 129 |
| 169 bool LocalFrame::inScope(TreeScope* scope) const | 130 bool LocalFrame::inScope(TreeScope* scope) const |
| 170 { | 131 { |
| 171 ASSERT(scope); | 132 ASSERT(scope); |
| 172 Document* doc = document(); | 133 Document* doc = document(); |
| 173 if (!doc) | 134 if (!doc) |
| 174 return false; | 135 return false; |
| 175 HTMLFrameOwnerElement* owner = doc->ownerElement(); | 136 HTMLFrameOwnerElement* owner = doc->ownerElement(); |
| 176 if (!owner) | 137 if (!owner) |
| 177 return false; | 138 return false; |
| 178 return owner->treeScope() == scope; | 139 return owner->treeScope() == scope; |
| 179 } | 140 } |
| 180 | 141 |
| 181 void LocalFrame::addDestructionObserver(FrameDestructionObserver* observer) | |
| 182 { | |
| 183 m_destructionObservers.add(observer); | |
| 184 } | |
| 185 | |
| 186 void LocalFrame::removeDestructionObserver(FrameDestructionObserver* observer) | |
| 187 { | |
| 188 m_destructionObservers.remove(observer); | |
| 189 } | |
| 190 | |
| 191 void LocalFrame::setView(PassRefPtr<FrameView> view) | 142 void LocalFrame::setView(PassRefPtr<FrameView> view) |
| 192 { | 143 { |
| 193 // We the custom scroll bars as early as possible to prevent m_doc->detach() | 144 // We the custom scroll bars as early as possible to prevent m_doc->detach() |
| 194 // from messing with the view such that its scroll bars won't be torn down. | 145 // from messing with the view such that its scroll bars won't be torn down. |
| 195 // FIXME: We should revisit this. | 146 // FIXME: We should revisit this. |
| 196 if (m_view) | 147 if (m_view) |
| 197 m_view->prepareForDetach(); | 148 m_view->prepareForDetach(); |
| 198 | 149 |
| 199 // Prepare for destruction now, so any unload event handlers get run and the
DOMWindow is | 150 // Prepare for destruction now, so any unload event handlers get run and the
DOMWindow is |
| 200 // notified. If we wait until the view is destroyed, then things won't be ho
oked up enough for | 151 // notified. If we wait until the view is destroyed, then things won't be ho
oked up enough for |
| (...skipping 14 matching lines...) Expand all Loading... |
| 215 void LocalFrame::sendOrientationChangeEvent(int orientation) | 166 void LocalFrame::sendOrientationChangeEvent(int orientation) |
| 216 { | 167 { |
| 217 if (!RuntimeEnabledFeatures::orientationEventEnabled()) | 168 if (!RuntimeEnabledFeatures::orientationEventEnabled()) |
| 218 return; | 169 return; |
| 219 | 170 |
| 220 m_orientation = orientation; | 171 m_orientation = orientation; |
| 221 if (DOMWindow* window = domWindow()) | 172 if (DOMWindow* window = domWindow()) |
| 222 window->dispatchEvent(Event::create(EventTypeNames::orientationchange)); | 173 window->dispatchEvent(Event::create(EventTypeNames::orientationchange)); |
| 223 } | 174 } |
| 224 | 175 |
| 225 FrameHost* LocalFrame::host() const | |
| 226 { | |
| 227 return m_host; | |
| 228 } | |
| 229 | |
| 230 Page* LocalFrame::page() const | |
| 231 { | |
| 232 if (m_host) | |
| 233 return &m_host->page(); | |
| 234 return 0; | |
| 235 } | |
| 236 | |
| 237 Settings* LocalFrame::settings() const | |
| 238 { | |
| 239 if (m_host) | |
| 240 return &m_host->settings(); | |
| 241 return 0; | |
| 242 } | |
| 243 | |
| 244 void LocalFrame::setPrinting(bool printing, const FloatSize& pageSize, const Flo
atSize& originalPageSize, float maximumShrinkRatio) | 176 void LocalFrame::setPrinting(bool printing, const FloatSize& pageSize, const Flo
atSize& originalPageSize, float maximumShrinkRatio) |
| 245 { | 177 { |
| 246 // In setting printing, we should not validate resources already cached for
the document. | 178 // In setting printing, we should not validate resources already cached for
the document. |
| 247 // See https://bugs.webkit.org/show_bug.cgi?id=43704 | 179 // See https://bugs.webkit.org/show_bug.cgi?id=43704 |
| 248 ResourceCacheValidationSuppressor validationSuppressor(document()->fetcher()
); | 180 ResourceCacheValidationSuppressor validationSuppressor(document()->fetcher()
); |
| 249 | 181 |
| 250 document()->setPrinting(printing); | 182 document()->setPrinting(printing); |
| 251 view()->adjustMediaTypeForPrinting(printing); | 183 view()->adjustMediaTypeForPrinting(printing); |
| 252 | 184 |
| 253 document()->styleResolverChanged(RecalcStyleImmediately); | 185 document()->styleResolverChanged(RecalcStyleImmediately); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 float ratio = originalSize.width() / originalSize.height(); | 218 float ratio = originalSize.width() / originalSize.height(); |
| 287 resultSize.setHeight(floorf(expectedSize.height())); | 219 resultSize.setHeight(floorf(expectedSize.height())); |
| 288 resultSize.setWidth(floorf(resultSize.height() * ratio)); | 220 resultSize.setWidth(floorf(resultSize.height() * ratio)); |
| 289 } | 221 } |
| 290 return resultSize; | 222 return resultSize; |
| 291 } | 223 } |
| 292 | 224 |
| 293 void LocalFrame::setDOMWindow(PassRefPtr<DOMWindow> domWindow) | 225 void LocalFrame::setDOMWindow(PassRefPtr<DOMWindow> domWindow) |
| 294 { | 226 { |
| 295 InspectorInstrumentation::frameWindowDiscarded(this, m_domWindow.get()); | 227 InspectorInstrumentation::frameWindowDiscarded(this, m_domWindow.get()); |
| 296 if (m_domWindow) | |
| 297 m_domWindow->reset(); | |
| 298 if (domWindow) | 228 if (domWindow) |
| 299 script().clearWindowShell(); | 229 script().clearWindowShell(); |
| 300 m_domWindow = domWindow; | 230 Frame::setDOMWindow(domWindow); |
| 301 } | |
| 302 | |
| 303 static ChromeClient& emptyChromeClient() | |
| 304 { | |
| 305 DEFINE_STATIC_LOCAL(EmptyChromeClient, client, ()); | |
| 306 return client; | |
| 307 } | |
| 308 | |
| 309 ChromeClient& LocalFrame::chromeClient() const | |
| 310 { | |
| 311 if (Page* page = this->page()) | |
| 312 return page->chrome().client(); | |
| 313 return emptyChromeClient(); | |
| 314 } | |
| 315 | |
| 316 Document* LocalFrame::document() const | |
| 317 { | |
| 318 return m_domWindow ? m_domWindow->document() : 0; | |
| 319 } | |
| 320 | |
| 321 RenderView* LocalFrame::contentRenderer() const | |
| 322 { | |
| 323 return document() ? document()->renderView() : 0; | |
| 324 } | 231 } |
| 325 | 232 |
| 326 RenderPart* LocalFrame::ownerRenderer() const | 233 RenderPart* LocalFrame::ownerRenderer() const |
| 327 { | 234 { |
| 328 if (!ownerElement()) | 235 if (!ownerElement()) |
| 329 return 0; | 236 return 0; |
| 330 RenderObject* object = ownerElement()->renderer(); | 237 RenderObject* object = ownerElement()->renderer(); |
| 331 if (!object) | 238 if (!object) |
| 332 return 0; | 239 return 0; |
| 333 // FIXME: If <object> is ever fixed to disassociate itself from frames | 240 // FIXME: If <object> is ever fixed to disassociate itself from frames |
| (...skipping 19 matching lines...) Expand all Loading... |
| 353 } | 260 } |
| 354 | 261 |
| 355 void LocalFrame::willDetachFrameHost() | 262 void LocalFrame::willDetachFrameHost() |
| 356 { | 263 { |
| 357 // We should never be detatching the page during a Layout. | 264 // We should never be detatching the page during a Layout. |
| 358 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout()); | 265 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout()); |
| 359 | 266 |
| 360 if (LocalFrame* parent = tree().parent()) | 267 if (LocalFrame* parent = tree().parent()) |
| 361 parent->loader().checkLoadComplete(); | 268 parent->loader().checkLoadComplete(); |
| 362 | 269 |
| 363 HashSet<FrameDestructionObserver*>::iterator stop = m_destructionObservers.e
nd(); | 270 Frame::willDetachFrameHost(); |
| 364 for (HashSet<FrameDestructionObserver*>::iterator it = m_destructionObserver
s.begin(); it != stop; ++it) | 271 script().clearScriptObjects(); |
| 365 (*it)->willDetachFrameHost(); | |
| 366 | |
| 367 // FIXME: Page should take care of updating focus/scrolling instead of Local
Frame. | |
| 368 // FIXME: It's unclear as to why this is called more than once, but it is, | |
| 369 // so page() could be NULL. | |
| 370 if (page() && page()->focusController().focusedFrame() == this) | |
| 371 page()->focusController().setFocusedFrame(nullptr); | |
| 372 | 272 |
| 373 if (page() && page()->scrollingCoordinator() && m_view) | 273 if (page() && page()->scrollingCoordinator() && m_view) |
| 374 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); | 274 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); |
| 375 | |
| 376 script().clearScriptObjects(); | |
| 377 } | 275 } |
| 378 | 276 |
| 379 void LocalFrame::detachFromFrameHost() | 277 void LocalFrame::detachFromFrameHost() |
| 380 { | 278 { |
| 381 // We should never be detatching the page during a Layout. | 279 // We should never be detatching the page during a Layout. |
| 382 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout()); | 280 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout()); |
| 383 m_host = 0; | 281 Frame::detachFromFrameHost(); |
| 384 } | 282 } |
| 385 | 283 |
| 386 void LocalFrame::disconnectOwnerElement() | 284 void LocalFrame::disconnectOwnerElement() |
| 387 { | 285 { |
| 388 if (ownerElement()) { | 286 if (ownerElement()) { |
| 389 if (Document* doc = document()) | 287 if (Document* doc = document()) |
| 390 doc->topDocument().clearAXObjectCache(); | 288 doc->topDocument().clearAXObjectCache(); |
| 391 ownerElement()->clearContentFrame(); | 289 ownerElement()->clearContentFrame(); |
| 392 if (page()) | 290 if (page()) |
| 393 page()->decrementSubframeCount(); | 291 page()->decrementSubframeCount(); |
| 394 } | 292 } |
| 395 m_frameInit->setOwnerElement(0); | 293 m_frameInit->setOwnerElement(0); |
| 396 } | 294 } |
| 397 | 295 |
| 398 bool LocalFrame::isMainFrame() const | |
| 399 { | |
| 400 Page* page = this->page(); | |
| 401 return page && this == page->mainFrame(); | |
| 402 } | |
| 403 | |
| 404 String LocalFrame::documentTypeString() const | 296 String LocalFrame::documentTypeString() const |
| 405 { | 297 { |
| 406 if (DocumentType* doctype = document()->doctype()) | 298 if (DocumentType* doctype = document()->doctype()) |
| 407 return createMarkup(doctype); | 299 return createMarkup(doctype); |
| 408 | 300 |
| 409 return String(); | 301 return String(); |
| 410 } | 302 } |
| 411 | 303 |
| 412 String LocalFrame::selectedText() const | 304 String LocalFrame::selectedText() const |
| 413 { | 305 { |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 { | 632 { |
| 741 if (!m_host) | 633 if (!m_host) |
| 742 return 0; | 634 return 0; |
| 743 | 635 |
| 744 double ratio = m_host->deviceScaleFactor(); | 636 double ratio = m_host->deviceScaleFactor(); |
| 745 ratio *= pageZoomFactor(); | 637 ratio *= pageZoomFactor(); |
| 746 return ratio; | 638 return ratio; |
| 747 } | 639 } |
| 748 | 640 |
| 749 } // namespace WebCore | 641 } // namespace WebCore |
| OLD | NEW |