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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 #include "wtf/StdLibExtras.h" | 67 #include "wtf/StdLibExtras.h" |
68 | 68 |
69 using namespace std; | 69 using namespace std; |
70 | 70 |
71 namespace WebCore { | 71 namespace WebCore { |
72 | 72 |
73 using namespace HTMLNames; | 73 using namespace HTMLNames; |
74 | 74 |
75 static inline float parentPageZoomFactor(LocalFrame* frame) | 75 static inline float parentPageZoomFactor(LocalFrame* frame) |
76 { | 76 { |
77 LocalFrame* parent = frame->tree().parent(); | 77 Frame* parent = frame->tree().parent(); |
78 if (!parent) | 78 if (!parent || !parent->isLocalFrame()) |
79 return 1; | 79 return 1; |
80 return parent->pageZoomFactor(); | 80 return toLocalFrame(parent)->pageZoomFactor(); |
81 } | 81 } |
82 | 82 |
83 static inline float parentTextZoomFactor(LocalFrame* frame) | 83 static inline float parentTextZoomFactor(LocalFrame* frame) |
84 { | 84 { |
85 LocalFrame* parent = frame->tree().parent(); | 85 Frame* parent = frame->tree().parent(); |
86 if (!parent) | 86 if (!parent || !parent->isLocalFrame()) |
87 return 1; | 87 return 1; |
88 return parent->textZoomFactor(); | 88 return toLocalFrame(parent)->textZoomFactor(); |
89 } | 89 } |
90 | 90 |
91 inline LocalFrame::LocalFrame(FrameLoaderClient* client, FrameHost* host, FrameO
wner* owner) | 91 inline LocalFrame::LocalFrame(FrameLoaderClient* client, FrameHost* host, FrameO
wner* owner) |
92 : Frame(client, host, owner) | 92 : Frame(client, host, owner) |
93 , m_loader(this) | 93 , m_loader(this) |
94 , m_navigationScheduler(this) | 94 , m_navigationScheduler(this) |
95 , m_script(adoptPtr(new ScriptController(this))) | 95 , m_script(adoptPtr(new ScriptController(this))) |
96 , m_editor(Editor::create(*this)) | 96 , m_editor(Editor::create(*this)) |
97 , m_spellChecker(SpellChecker::create(*this)) | 97 , m_spellChecker(SpellChecker::create(*this)) |
98 , m_selection(FrameSelection::create(this)) | 98 , m_selection(FrameSelection::create(this)) |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 if (page()->visibilityState() != PageVisibilityStateVisible) | 171 if (page()->visibilityState() != PageVisibilityStateVisible) |
172 return; | 172 return; |
173 | 173 |
174 DOMWindow* window = domWindow(); | 174 DOMWindow* window = domWindow(); |
175 if (!window) | 175 if (!window) |
176 return; | 176 return; |
177 window->dispatchEvent(Event::create(EventTypeNames::orientationchange)); | 177 window->dispatchEvent(Event::create(EventTypeNames::orientationchange)); |
178 | 178 |
179 // Notify subframes. | 179 // Notify subframes. |
180 Vector<RefPtr<LocalFrame> > childFrames; | 180 Vector<RefPtr<LocalFrame> > childFrames; |
181 for (LocalFrame* child = tree().firstChild(); child; child = child->tree().n
extSibling()) | 181 for (Frame* child = tree().firstChild(); child; child = child->tree().nextSi
bling()) { |
182 childFrames.append(child); | 182 if (child->isLocalFrame()) |
| 183 childFrames.append(toLocalFrame(child)); |
| 184 } |
183 | 185 |
184 for (size_t i = 0; i < childFrames.size(); ++i) | 186 for (size_t i = 0; i < childFrames.size(); ++i) |
185 childFrames[i]->sendOrientationChangeEvent(); | 187 childFrames[i]->sendOrientationChangeEvent(); |
186 } | 188 } |
187 | 189 |
188 void LocalFrame::setPrinting(bool printing, const FloatSize& pageSize, const Flo
atSize& originalPageSize, float maximumShrinkRatio) | 190 void LocalFrame::setPrinting(bool printing, const FloatSize& pageSize, const Flo
atSize& originalPageSize, float maximumShrinkRatio) |
189 { | 191 { |
190 // In setting printing, we should not validate resources already cached for
the document. | 192 // In setting printing, we should not validate resources already cached for
the document. |
191 // See https://bugs.webkit.org/show_bug.cgi?id=43704 | 193 // See https://bugs.webkit.org/show_bug.cgi?id=43704 |
192 ResourceCacheValidationSuppressor validationSuppressor(document()->fetcher()
); | 194 ResourceCacheValidationSuppressor validationSuppressor(document()->fetcher()
); |
193 | 195 |
194 document()->setPrinting(printing); | 196 document()->setPrinting(printing); |
195 view()->adjustMediaTypeForPrinting(printing); | 197 view()->adjustMediaTypeForPrinting(printing); |
196 | 198 |
197 document()->styleResolverChanged(); | 199 document()->styleResolverChanged(); |
198 if (shouldUsePrintingLayout()) { | 200 if (shouldUsePrintingLayout()) { |
199 view()->forceLayoutForPagination(pageSize, originalPageSize, maximumShri
nkRatio); | 201 view()->forceLayoutForPagination(pageSize, originalPageSize, maximumShri
nkRatio); |
200 } else { | 202 } else { |
201 view()->forceLayout(); | 203 view()->forceLayout(); |
202 view()->adjustViewSize(); | 204 view()->adjustViewSize(); |
203 } | 205 } |
204 | 206 |
205 // Subframes of the one we're printing don't lay out to the page size. | 207 // Subframes of the one we're printing don't lay out to the page size. |
206 for (RefPtr<LocalFrame> child = tree().firstChild(); child; child = child->t
ree().nextSibling()) | 208 for (RefPtr<Frame> child = tree().firstChild(); child; child = child->tree()
.nextSibling()) { |
207 child->setPrinting(printing, FloatSize(), FloatSize(), 0); | 209 if (child->isLocalFrame()) |
| 210 toLocalFrame(child.get())->setPrinting(printing, FloatSize(), FloatS
ize(), 0); |
| 211 } |
208 } | 212 } |
209 | 213 |
210 bool LocalFrame::shouldUsePrintingLayout() const | 214 bool LocalFrame::shouldUsePrintingLayout() const |
211 { | 215 { |
212 // Only top frame being printed should be fit to page size. | 216 // Only top frame being printed should be fit to page size. |
213 // Subframes should be constrained by parents only. | 217 // Subframes should be constrained by parents only. |
214 return document()->printing() && (!tree().parent() || !tree().parent()->docu
ment()->printing()); | 218 return document()->printing() && (!tree().parent() || !tree().parent()->isLo
calFrame() || !toLocalFrame(tree().parent())->document()->printing()); |
215 } | 219 } |
216 | 220 |
217 FloatSize LocalFrame::resizePageRectsKeepingRatio(const FloatSize& originalSize,
const FloatSize& expectedSize) | 221 FloatSize LocalFrame::resizePageRectsKeepingRatio(const FloatSize& originalSize,
const FloatSize& expectedSize) |
218 { | 222 { |
219 FloatSize resultSize; | 223 FloatSize resultSize; |
220 if (!contentRenderer()) | 224 if (!contentRenderer()) |
221 return FloatSize(); | 225 return FloatSize(); |
222 | 226 |
223 if (contentRenderer()->style()->isHorizontalWritingMode()) { | 227 if (contentRenderer()->style()->isHorizontalWritingMode()) { |
224 ASSERT(fabs(originalSize.width()) > numeric_limits<float>::epsilon()); | 228 ASSERT(fabs(originalSize.width()) > numeric_limits<float>::epsilon()); |
(...skipping 16 matching lines...) Expand all Loading... |
241 script().clearWindowShell(); | 245 script().clearWindowShell(); |
242 Frame::setDOMWindow(domWindow); | 246 Frame::setDOMWindow(domWindow); |
243 } | 247 } |
244 | 248 |
245 void LocalFrame::didChangeVisibilityState() | 249 void LocalFrame::didChangeVisibilityState() |
246 { | 250 { |
247 if (document()) | 251 if (document()) |
248 document()->didChangeVisibilityState(); | 252 document()->didChangeVisibilityState(); |
249 | 253 |
250 Vector<RefPtr<LocalFrame> > childFrames; | 254 Vector<RefPtr<LocalFrame> > childFrames; |
251 for (LocalFrame* child = tree().firstChild(); child; child = child->tree().n
extSibling()) | 255 for (Frame* child = tree().firstChild(); child; child = child->tree().nextSi
bling()) { |
252 childFrames.append(child); | 256 if (child->isLocalFrame()) |
| 257 childFrames.append(toLocalFrame(child)); |
| 258 } |
253 | 259 |
254 for (size_t i = 0; i < childFrames.size(); ++i) | 260 for (size_t i = 0; i < childFrames.size(); ++i) |
255 childFrames[i]->didChangeVisibilityState(); | 261 childFrames[i]->didChangeVisibilityState(); |
256 } | 262 } |
257 | 263 |
258 void LocalFrame::willDetachFrameHost() | 264 void LocalFrame::willDetachFrameHost() |
259 { | 265 { |
260 // We should never be detatching the page during a Layout. | 266 // We should never be detatching the page during a Layout. |
261 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout()); | 267 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout()); |
262 | 268 |
263 if (LocalFrame* parent = tree().parent()) | 269 Frame* parent = tree().parent(); |
264 parent->loader().checkLoadComplete(); | 270 if (parent && parent->isLocalFrame()) |
| 271 toLocalFrame(parent)->loader().checkLoadComplete(); |
265 | 272 |
266 Frame::willDetachFrameHost(); | 273 Frame::willDetachFrameHost(); |
267 script().clearScriptObjects(); | 274 script().clearScriptObjects(); |
268 | 275 |
269 if (page() && page()->scrollingCoordinator() && m_view) | 276 if (page() && page()->scrollingCoordinator() && m_view) |
270 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); | 277 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); |
271 } | 278 } |
272 | 279 |
273 void LocalFrame::detachFromFrameHost() | 280 void LocalFrame::detachFromFrameHost() |
274 { | 281 { |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
419 if (o->needsLayout()) | 426 if (o->needsLayout()) |
420 ++needsLayoutObjects; | 427 ++needsLayoutObjects; |
421 } | 428 } |
422 } | 429 } |
423 | 430 |
424 String LocalFrame::layerTreeAsText(LayerTreeFlags flags) const | 431 String LocalFrame::layerTreeAsText(LayerTreeFlags flags) const |
425 { | 432 { |
426 TextStream textStream; | 433 TextStream textStream; |
427 textStream << localLayerTreeAsText(flags); | 434 textStream << localLayerTreeAsText(flags); |
428 | 435 |
429 for (LocalFrame* child = tree().firstChild(); child; child = child->tree().t
raverseNext(this)) { | 436 for (Frame* child = tree().firstChild(); child; child = child->tree().traver
seNext(this)) { |
430 String childLayerTree = child->localLayerTreeAsText(flags); | 437 if (!child->isLocalFrame()) |
| 438 continue; |
| 439 String childLayerTree = toLocalFrame(child)->localLayerTreeAsText(flags)
; |
431 if (!childLayerTree.length()) | 440 if (!childLayerTree.length()) |
432 continue; | 441 continue; |
433 | 442 |
434 textStream << "\n\n--------\nFrame: '"; | 443 textStream << "\n\n--------\nFrame: '"; |
435 textStream << child->tree().uniqueName(); | 444 textStream << child->tree().uniqueName(); |
436 textStream << "'\n--------\n"; | 445 textStream << "'\n--------\n"; |
437 textStream << childLayerTree; | 446 textStream << childLayerTree; |
438 } | 447 } |
439 | 448 |
440 return textStream.release(); | 449 return textStream.release(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 // Update the scroll position when doing a full page zoom, so the co
ntent stays in relatively the same position. | 499 // Update the scroll position when doing a full page zoom, so the co
ntent stays in relatively the same position. |
491 LayoutPoint scrollPosition = view->scrollPosition(); | 500 LayoutPoint scrollPosition = view->scrollPosition(); |
492 float percentDifference = (pageZoomFactor / m_pageZoomFactor); | 501 float percentDifference = (pageZoomFactor / m_pageZoomFactor); |
493 view->setScrollPosition(IntPoint(scrollPosition.x() * percentDiffere
nce, scrollPosition.y() * percentDifference)); | 502 view->setScrollPosition(IntPoint(scrollPosition.x() * percentDiffere
nce, scrollPosition.y() * percentDifference)); |
494 } | 503 } |
495 } | 504 } |
496 | 505 |
497 m_pageZoomFactor = pageZoomFactor; | 506 m_pageZoomFactor = pageZoomFactor; |
498 m_textZoomFactor = textZoomFactor; | 507 m_textZoomFactor = textZoomFactor; |
499 | 508 |
500 for (RefPtr<LocalFrame> child = tree().firstChild(); child; child = child->t
ree().nextSibling()) | 509 for (RefPtr<Frame> child = tree().firstChild(); child; child = child->tree()
.nextSibling()) { |
501 child->setPageAndTextZoomFactors(m_pageZoomFactor, m_textZoomFactor); | 510 if (child->isLocalFrame()) |
| 511 toLocalFrame(child.get())->setPageAndTextZoomFactors(m_pageZoomFacto
r, m_textZoomFactor); |
| 512 } |
502 | 513 |
503 document->setNeedsStyleRecalc(SubtreeStyleChange); | 514 document->setNeedsStyleRecalc(SubtreeStyleChange); |
504 document->updateLayoutIgnorePendingStylesheets(); | 515 document->updateLayoutIgnorePendingStylesheets(); |
505 } | 516 } |
506 | 517 |
507 void LocalFrame::deviceOrPageScaleFactorChanged() | 518 void LocalFrame::deviceOrPageScaleFactorChanged() |
508 { | 519 { |
509 document()->mediaQueryAffectingValueChanged(); | 520 document()->mediaQueryAffectingValueChanged(); |
510 for (RefPtr<LocalFrame> child = tree().firstChild(); child; child = child->t
ree().nextSibling()) | 521 for (RefPtr<Frame> child = tree().firstChild(); child; child = child->tree()
.nextSibling()) { |
511 child->deviceOrPageScaleFactorChanged(); | 522 if (child->isLocalFrame()) |
| 523 toLocalFrame(child.get())->deviceOrPageScaleFactorChanged(); |
| 524 } |
512 } | 525 } |
513 | 526 |
514 void LocalFrame::notifyChromeClientWheelEventHandlerCountChanged() const | 527 void LocalFrame::notifyChromeClientWheelEventHandlerCountChanged() const |
515 { | 528 { |
516 // FIXME: No-one is using this information, so remove this code. | 529 // FIXME: No-one is using this information, so remove this code. |
517 // Ensure that this method is being called on the main frame of the page. | 530 // Ensure that this method is being called on the main frame of the page. |
518 ASSERT(isMainFrame()); | 531 ASSERT(isMainFrame()); |
519 | 532 |
520 EventHandlerRegistry& registry = m_host->eventHandlerRegistry(); | 533 EventHandlerRegistry& registry = m_host->eventHandlerRegistry(); |
521 unsigned count = 0; | 534 unsigned count = 0; |
522 if (const EventTargetSet* targets = registry.eventHandlerTargets(EventHandle
rRegistry::WheelEvent)) { | 535 if (const EventTargetSet* targets = registry.eventHandlerTargets(EventHandle
rRegistry::WheelEvent)) { |
523 for (EventTargetSet::const_iterator iter = targets->begin(); iter != tar
gets->end(); ++iter) | 536 for (EventTargetSet::const_iterator iter = targets->begin(); iter != tar
gets->end(); ++iter) |
524 count += iter->value; | 537 count += iter->value; |
525 } | 538 } |
526 | 539 |
527 m_host->chrome().client().numWheelEventHandlersChanged(count); | 540 m_host->chrome().client().numWheelEventHandlersChanged(count); |
528 } | 541 } |
529 | 542 |
530 bool LocalFrame::isURLAllowed(const KURL& url) const | 543 bool LocalFrame::isURLAllowed(const KURL& url) const |
531 { | 544 { |
532 // We allow one level of self-reference because some sites depend on that, | 545 // We allow one level of self-reference because some sites depend on that, |
533 // but we don't allow more than one. | 546 // but we don't allow more than one. |
534 if (page()->subframeCount() >= Page::maxNumberOfFrames) | 547 if (page()->subframeCount() >= Page::maxNumberOfFrames) |
535 return false; | 548 return false; |
536 bool foundSelfReference = false; | 549 bool foundSelfReference = false; |
537 for (const LocalFrame* frame = this; frame; frame = frame->tree().parent())
{ | 550 for (const Frame* frame = this; frame; frame = frame->tree().parent()) { |
538 if (equalIgnoringFragmentIdentifier(frame->document()->url(), url)) { | 551 if (!frame->isLocalFrame()) |
| 552 continue; |
| 553 if (equalIgnoringFragmentIdentifier(toLocalFrame(frame)->document()->url
(), url)) { |
539 if (foundSelfReference) | 554 if (foundSelfReference) |
540 return false; | 555 return false; |
541 foundSelfReference = true; | 556 foundSelfReference = true; |
542 } | 557 } |
543 } | 558 } |
544 return true; | 559 return true; |
545 } | 560 } |
546 | 561 |
547 struct ScopedFramePaintingState { | 562 struct ScopedFramePaintingState { |
548 ScopedFramePaintingState(LocalFrame* frame, Node* node) | 563 ScopedFramePaintingState(LocalFrame* frame, Node* node) |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 if (Document* doc = document()) | 667 if (Document* doc = document()) |
653 doc->topDocument().clearAXObjectCache(); | 668 doc->topDocument().clearAXObjectCache(); |
654 } | 669 } |
655 Frame::disconnectOwnerElement(); | 670 Frame::disconnectOwnerElement(); |
656 } | 671 } |
657 | 672 |
658 LocalFrame* LocalFrame::localFrameRoot() | 673 LocalFrame* LocalFrame::localFrameRoot() |
659 { | 674 { |
660 LocalFrame* curFrame = this; | 675 LocalFrame* curFrame = this; |
661 while (curFrame && curFrame->tree().parent() && curFrame->tree().parent()->i
sLocalFrame()) | 676 while (curFrame && curFrame->tree().parent() && curFrame->tree().parent()->i
sLocalFrame()) |
662 curFrame = curFrame->tree().parent(); | 677 curFrame = toLocalFrame(curFrame->tree().parent()); |
663 | 678 |
664 return curFrame; | 679 return curFrame; |
665 } | 680 } |
666 | 681 |
667 } // namespace WebCore | 682 } // namespace WebCore |
OLD | NEW |