Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: Source/WebCore/page/DOMWindow.cpp

Issue 8256010: Merge 97353 - DOMWindow subobjects can be re-created after navigation (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/874/
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/WebCore/page/DOMWindow.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved.
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 : m_shouldPrintWhenFinishedLoading(false) 398 : m_shouldPrintWhenFinishedLoading(false)
399 , m_frame(frame) 399 , m_frame(frame)
400 { 400 {
401 } 401 }
402 402
403 DOMWindow::~DOMWindow() 403 DOMWindow::~DOMWindow()
404 { 404 {
405 if (m_frame) 405 if (m_frame)
406 m_frame->clearFormerDOMWindow(this); 406 m_frame->clearFormerDOMWindow(this);
407 407
408 ASSERT(!m_screen);
409 ASSERT(!m_selection);
410 ASSERT(!m_history);
411 ASSERT(!m_crypto);
412 ASSERT(!m_locationbar);
413 ASSERT(!m_menubar);
414 ASSERT(!m_personalbar);
415 ASSERT(!m_scrollbars);
416 ASSERT(!m_statusbar);
417 ASSERT(!m_toolbar);
418 ASSERT(!m_console);
419 ASSERT(!m_navigator);
420 #if ENABLE(WEB_TIMING)
421 ASSERT(!m_performance);
422 #endif
423 ASSERT(!m_location);
424 ASSERT(!m_media);
425 #if ENABLE(DOM_STORAGE)
426 ASSERT(!m_sessionStorage);
427 ASSERT(!m_localStorage);
428 #endif
429 ASSERT(!m_applicationCache);
430 #if ENABLE(NOTIFICATIONS)
431 ASSERT(!m_notifications);
432 #endif
433 #if ENABLE(INDEXED_DATABASE)
434 ASSERT(!m_idbFactory);
435 #endif
436 #if ENABLE(BLOB)
437 ASSERT(!m_domURL);
438 #endif
439 #if ENABLE(QUOTA)
440 ASSERT(!m_storageInfo);
441 #endif
442
443 // This clear should be unnessary given the ASSERTs above, but we don't
444 // want any of these objects to hang around after we've been destroyed.
445 clear();
446
408 removeAllUnloadEventListeners(this); 447 removeAllUnloadEventListeners(this);
409 removeAllBeforeUnloadEventListeners(this); 448 removeAllBeforeUnloadEventListeners(this);
410 } 449 }
411 450
412 ScriptExecutionContext* DOMWindow::scriptExecutionContext() const 451 ScriptExecutionContext* DOMWindow::scriptExecutionContext() const
413 { 452 {
414 return document(); 453 return document();
415 } 454 }
416 455
417 PassRefPtr<MediaQueryList> DOMWindow::matchMedia(const String& media) 456 PassRefPtr<MediaQueryList> DOMWindow::matchMedia(const String& media)
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 549
511 #if ENABLE(NOTIFICATIONS) 550 #if ENABLE(NOTIFICATIONS)
512 if (m_notifications) 551 if (m_notifications)
513 m_notifications->disconnectFrame(); 552 m_notifications->disconnectFrame();
514 m_notifications = 0; 553 m_notifications = 0;
515 #endif 554 #endif
516 555
517 #if ENABLE(INDEXED_DATABASE) 556 #if ENABLE(INDEXED_DATABASE)
518 m_idbFactory = 0; 557 m_idbFactory = 0;
519 #endif 558 #endif
559
560 #if ENABLE(BLOB)
561 m_domURL = 0;
562 #endif
563
564 #if ENABLE(QUOTA)
565 m_storageInfo = 0;
566 #endif
567 }
568
569 bool DOMWindow::isCurrentlyDisplayedInFrame() const
570 {
571 return m_frame && m_frame->domWindow() == this;
520 } 572 }
521 573
522 #if ENABLE(ORIENTATION_EVENTS) 574 #if ENABLE(ORIENTATION_EVENTS)
523 int DOMWindow::orientation() const 575 int DOMWindow::orientation() const
524 { 576 {
525 if (!m_frame) 577 if (!m_frame)
526 return 0; 578 return 0;
527 579
528 return m_frame->orientation(); 580 return m_frame->orientation();
529 } 581 }
530 #endif 582 #endif
531 583
532 Screen* DOMWindow::screen() const 584 Screen* DOMWindow::screen() const
533 { 585 {
534 if (!m_screen) 586 if (!m_screen && isCurrentlyDisplayedInFrame())
535 m_screen = Screen::create(m_frame); 587 m_screen = Screen::create(m_frame);
536 return m_screen.get(); 588 return m_screen.get();
537 } 589 }
538 590
539 History* DOMWindow::history() const 591 History* DOMWindow::history() const
540 { 592 {
541 if (!m_history) 593 if (!m_history && isCurrentlyDisplayedInFrame())
542 m_history = History::create(m_frame); 594 m_history = History::create(m_frame);
543 return m_history.get(); 595 return m_history.get();
544 } 596 }
545 597
546 Crypto* DOMWindow::crypto() const 598 Crypto* DOMWindow::crypto() const
547 { 599 {
548 if (!m_crypto) 600 if (!m_crypto && isCurrentlyDisplayedInFrame())
549 m_crypto = Crypto::create(); 601 m_crypto = Crypto::create();
550 return m_crypto.get(); 602 return m_crypto.get();
551 } 603 }
552 604
553 BarInfo* DOMWindow::locationbar() const 605 BarInfo* DOMWindow::locationbar() const
554 { 606 {
555 if (!m_locationbar) 607 if (!m_locationbar && isCurrentlyDisplayedInFrame())
556 m_locationbar = BarInfo::create(m_frame, BarInfo::Locationbar); 608 m_locationbar = BarInfo::create(m_frame, BarInfo::Locationbar);
557 return m_locationbar.get(); 609 return m_locationbar.get();
558 } 610 }
559 611
560 BarInfo* DOMWindow::menubar() const 612 BarInfo* DOMWindow::menubar() const
561 { 613 {
562 if (!m_menubar) 614 if (!m_menubar && isCurrentlyDisplayedInFrame())
563 m_menubar = BarInfo::create(m_frame, BarInfo::Menubar); 615 m_menubar = BarInfo::create(m_frame, BarInfo::Menubar);
564 return m_menubar.get(); 616 return m_menubar.get();
565 } 617 }
566 618
567 BarInfo* DOMWindow::personalbar() const 619 BarInfo* DOMWindow::personalbar() const
568 { 620 {
569 if (!m_personalbar) 621 if (!m_personalbar && isCurrentlyDisplayedInFrame())
570 m_personalbar = BarInfo::create(m_frame, BarInfo::Personalbar); 622 m_personalbar = BarInfo::create(m_frame, BarInfo::Personalbar);
571 return m_personalbar.get(); 623 return m_personalbar.get();
572 } 624 }
573 625
574 BarInfo* DOMWindow::scrollbars() const 626 BarInfo* DOMWindow::scrollbars() const
575 { 627 {
576 if (!m_scrollbars) 628 if (!m_scrollbars && isCurrentlyDisplayedInFrame())
577 m_scrollbars = BarInfo::create(m_frame, BarInfo::Scrollbars); 629 m_scrollbars = BarInfo::create(m_frame, BarInfo::Scrollbars);
578 return m_scrollbars.get(); 630 return m_scrollbars.get();
579 } 631 }
580 632
581 BarInfo* DOMWindow::statusbar() const 633 BarInfo* DOMWindow::statusbar() const
582 { 634 {
583 if (!m_statusbar) 635 if (!m_statusbar && isCurrentlyDisplayedInFrame())
584 m_statusbar = BarInfo::create(m_frame, BarInfo::Statusbar); 636 m_statusbar = BarInfo::create(m_frame, BarInfo::Statusbar);
585 return m_statusbar.get(); 637 return m_statusbar.get();
586 } 638 }
587 639
588 BarInfo* DOMWindow::toolbar() const 640 BarInfo* DOMWindow::toolbar() const
589 { 641 {
590 if (!m_toolbar) 642 if (!m_toolbar && isCurrentlyDisplayedInFrame())
591 m_toolbar = BarInfo::create(m_frame, BarInfo::Toolbar); 643 m_toolbar = BarInfo::create(m_frame, BarInfo::Toolbar);
592 return m_toolbar.get(); 644 return m_toolbar.get();
593 } 645 }
594 646
595 Console* DOMWindow::console() const 647 Console* DOMWindow::console() const
596 { 648 {
597 if (!m_console) 649 if (!m_console && isCurrentlyDisplayedInFrame())
598 m_console = Console::create(m_frame); 650 m_console = Console::create(m_frame);
599 return m_console.get(); 651 return m_console.get();
600 } 652 }
601 653
602 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 654 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
603 DOMApplicationCache* DOMWindow::applicationCache() const 655 DOMApplicationCache* DOMWindow::applicationCache() const
604 { 656 {
605 if (!m_applicationCache) 657 if (!m_applicationCache && isCurrentlyDisplayedInFrame())
606 m_applicationCache = DOMApplicationCache::create(m_frame); 658 m_applicationCache = DOMApplicationCache::create(m_frame);
607 return m_applicationCache.get(); 659 return m_applicationCache.get();
608 } 660 }
609 #endif 661 #endif
610 662
611 Navigator* DOMWindow::navigator() const 663 Navigator* DOMWindow::navigator() const
612 { 664 {
613 if (!m_navigator) 665 if (!m_navigator && isCurrentlyDisplayedInFrame())
614 m_navigator = Navigator::create(m_frame); 666 m_navigator = Navigator::create(m_frame);
615 return m_navigator.get(); 667 return m_navigator.get();
616 } 668 }
617 669
618 #if ENABLE(WEB_TIMING) 670 #if ENABLE(WEB_TIMING)
619 Performance* DOMWindow::performance() const 671 Performance* DOMWindow::performance() const
620 { 672 {
621 if (!m_performance) 673 if (!m_performance && isCurrentlyDisplayedInFrame())
622 m_performance = Performance::create(m_frame); 674 m_performance = Performance::create(m_frame);
623 return m_performance.get(); 675 return m_performance.get();
624 } 676 }
625 #endif 677 #endif
626 678
627 Location* DOMWindow::location() const 679 Location* DOMWindow::location() const
628 { 680 {
629 if (!m_location) 681 if (!m_location && isCurrentlyDisplayedInFrame())
630 m_location = Location::create(m_frame); 682 m_location = Location::create(m_frame);
631 return m_location.get(); 683 return m_location.get();
632 } 684 }
633 685
634 #if ENABLE(DOM_STORAGE) 686 #if ENABLE(DOM_STORAGE)
635 Storage* DOMWindow::sessionStorage(ExceptionCode& ec) const 687 Storage* DOMWindow::sessionStorage(ExceptionCode& ec) const
636 { 688 {
637 if (m_sessionStorage) 689 if (m_sessionStorage || !isCurrentlyDisplayedInFrame())
638 return m_sessionStorage.get(); 690 return m_sessionStorage.get();
639 691
640 Document* document = this->document(); 692 Document* document = this->document();
641 if (!document) 693 if (!document)
642 return 0; 694 return 0;
643 695
644 if (!document->securityOrigin()->canAccessLocalStorage()) { 696 if (!document->securityOrigin()->canAccessLocalStorage()) {
645 ec = SECURITY_ERR; 697 ec = SECURITY_ERR;
646 return 0; 698 return 0;
647 } 699 }
648 700
649 Page* page = document->page(); 701 Page* page = document->page();
650 if (!page) 702 if (!page)
651 return 0; 703 return 0;
652 704
653 RefPtr<StorageArea> storageArea = page->sessionStorage()->storageArea(docume nt->securityOrigin()); 705 RefPtr<StorageArea> storageArea = page->sessionStorage()->storageArea(docume nt->securityOrigin());
654 InspectorInstrumentation::didUseDOMStorage(page, storageArea.get(), false, m _frame); 706 InspectorInstrumentation::didUseDOMStorage(page, storageArea.get(), false, m _frame);
655 707
656 m_sessionStorage = Storage::create(m_frame, storageArea.release()); 708 m_sessionStorage = Storage::create(m_frame, storageArea.release());
657 return m_sessionStorage.get(); 709 return m_sessionStorage.get();
658 } 710 }
659 711
660 Storage* DOMWindow::localStorage(ExceptionCode& ec) const 712 Storage* DOMWindow::localStorage(ExceptionCode& ec) const
661 { 713 {
662 if (m_localStorage) 714 if (m_localStorage || !isCurrentlyDisplayedInFrame())
663 return m_localStorage.get(); 715 return m_localStorage.get();
664 716
665 Document* document = this->document(); 717 Document* document = this->document();
666 if (!document) 718 if (!document)
667 return 0; 719 return 0;
668 720
669 if (!document->securityOrigin()->canAccessLocalStorage()) { 721 if (!document->securityOrigin()->canAccessLocalStorage()) {
670 ec = SECURITY_ERR; 722 ec = SECURITY_ERR;
671 return 0; 723 return 0;
672 } 724 }
673 725
674 Page* page = document->page(); 726 Page* page = document->page();
675 if (!page) 727 if (!page)
676 return 0; 728 return 0;
677 729
678 if (!page->settings()->localStorageEnabled()) 730 if (!page->settings()->localStorageEnabled())
679 return 0; 731 return 0;
680 732
681 RefPtr<StorageArea> storageArea = page->group().localStorage()->storageArea( document->securityOrigin()); 733 RefPtr<StorageArea> storageArea = page->group().localStorage()->storageArea( document->securityOrigin());
682 InspectorInstrumentation::didUseDOMStorage(page, storageArea.get(), true, m_ frame); 734 InspectorInstrumentation::didUseDOMStorage(page, storageArea.get(), true, m_ frame);
683 735
684 m_localStorage = Storage::create(m_frame, storageArea.release()); 736 m_localStorage = Storage::create(m_frame, storageArea.release());
685 return m_localStorage.get(); 737 return m_localStorage.get();
686 } 738 }
687 #endif 739 #endif
688 740
689 #if ENABLE(NOTIFICATIONS) 741 #if ENABLE(NOTIFICATIONS)
690 NotificationCenter* DOMWindow::webkitNotifications() const 742 NotificationCenter* DOMWindow::webkitNotifications() const
691 { 743 {
692 if (m_notifications) 744 if (m_notifications || !isCurrentlyDisplayedInFrame())
693 return m_notifications.get(); 745 return m_notifications.get();
694 746
695 Document* document = this->document(); 747 Document* document = this->document();
696 if (!document) 748 if (!document)
697 return 0; 749 return 0;
698 750
699 Page* page = document->page(); 751 Page* page = document->page();
700 if (!page) 752 if (!page)
701 return 0; 753 return 0;
702 754
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 if (!document) 786 if (!document)
735 return 0; 787 return 0;
736 788
737 Page* page = document->page(); 789 Page* page = document->page();
738 if (!page) 790 if (!page)
739 return 0; 791 return 0;
740 792
741 if (!document->securityOrigin()->canAccessDatabase()) 793 if (!document->securityOrigin()->canAccessDatabase())
742 return 0; 794 return 0;
743 795
744 if (!m_idbFactory) 796 if (!m_idbFactory && isCurrentlyDisplayedInFrame())
745 m_idbFactory = IDBFactory::create(page->group().idbFactory()); 797 m_idbFactory = IDBFactory::create(page->group().idbFactory());
746 return m_idbFactory.get(); 798 return m_idbFactory.get();
747 } 799 }
748 #endif 800 #endif
749 801
750 #if ENABLE(FILE_SYSTEM) 802 #if ENABLE(FILE_SYSTEM)
751 void DOMWindow::webkitRequestFileSystem(int type, long long size, PassRefPtr<Fil eSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 803 void DOMWindow::webkitRequestFileSystem(int type, long long size, PassRefPtr<Fil eSystemCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
752 { 804 {
805 if (!isCurrentlyDisplayedInFrame())
806 return;
807
753 Document* document = this->document(); 808 Document* document = this->document();
754 if (!document) 809 if (!document)
755 return; 810 return;
756 811
757 if (!AsyncFileSystem::isAvailable() || !document->securityOrigin()->canAcces sFileSystem()) { 812 if (!AsyncFileSystem::isAvailable() || !document->securityOrigin()->canAcces sFileSystem()) {
758 DOMFileSystem::scheduleCallback(document, errorCallback, FileError::crea te(FileError::SECURITY_ERR)); 813 DOMFileSystem::scheduleCallback(document, errorCallback, FileError::crea te(FileError::SECURITY_ERR));
759 return; 814 return;
760 } 815 }
761 816
762 AsyncFileSystem::Type fileSystemType = static_cast<AsyncFileSystem::Type>(ty pe); 817 AsyncFileSystem::Type fileSystemType = static_cast<AsyncFileSystem::Type>(ty pe);
763 if (fileSystemType != AsyncFileSystem::Temporary && fileSystemType != AsyncF ileSystem::Persistent && fileSystemType != AsyncFileSystem::External) { 818 if (fileSystemType != AsyncFileSystem::Temporary && fileSystemType != AsyncF ileSystem::Persistent && fileSystemType != AsyncFileSystem::External) {
764 DOMFileSystem::scheduleCallback(document, errorCallback, FileError::crea te(FileError::INVALID_MODIFICATION_ERR)); 819 DOMFileSystem::scheduleCallback(document, errorCallback, FileError::crea te(FileError::INVALID_MODIFICATION_ERR));
765 return; 820 return;
766 } 821 }
767 822
768 LocalFileSystem::localFileSystem().requestFileSystem(document, fileSystemTyp e, size, FileSystemCallbacks::create(successCallback, errorCallback, document), false); 823 LocalFileSystem::localFileSystem().requestFileSystem(document, fileSystemTyp e, size, FileSystemCallbacks::create(successCallback, errorCallback, document), false);
769 } 824 }
770 825
771 void DOMWindow::webkitResolveLocalFileSystemURL(const String& url, PassRefPtr<En tryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback) 826 void DOMWindow::webkitResolveLocalFileSystemURL(const String& url, PassRefPtr<En tryCallback> successCallback, PassRefPtr<ErrorCallback> errorCallback)
772 { 827 {
828 if (!isCurrentlyDisplayedInFrame())
829 return;
830
773 Document* document = this->document(); 831 Document* document = this->document();
774 if (!document) 832 if (!document)
775 return; 833 return;
776 834
777 SecurityOrigin* securityOrigin = document->securityOrigin(); 835 SecurityOrigin* securityOrigin = document->securityOrigin();
778 KURL completedURL = document->completeURL(url); 836 KURL completedURL = document->completeURL(url);
779 if (!AsyncFileSystem::isAvailable() || !securityOrigin->canAccessFileSystem( ) || !securityOrigin->canRequest(completedURL)) { 837 if (!AsyncFileSystem::isAvailable() || !securityOrigin->canAccessFileSystem( ) || !securityOrigin->canRequest(completedURL)) {
780 DOMFileSystem::scheduleCallback(document, errorCallback, FileError::crea te(FileError::SECURITY_ERR)); 838 DOMFileSystem::scheduleCallback(document, errorCallback, FileError::crea te(FileError::SECURITY_ERR));
781 return; 839 return;
782 } 840 }
(...skipping 18 matching lines...) Expand all
801 void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, MessagePo rt* port, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec) 859 void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, MessagePo rt* port, const String& targetOrigin, DOMWindow* source, ExceptionCode& ec)
802 { 860 {
803 MessagePortArray ports; 861 MessagePortArray ports;
804 if (port) 862 if (port)
805 ports.append(port); 863 ports.append(port);
806 postMessage(message, &ports, targetOrigin, source, ec); 864 postMessage(message, &ports, targetOrigin, source, ec);
807 } 865 }
808 866
809 void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, const Mes sagePortArray* ports, const String& targetOrigin, DOMWindow* source, ExceptionCo de& ec) 867 void DOMWindow::postMessage(PassRefPtr<SerializedScriptValue> message, const Mes sagePortArray* ports, const String& targetOrigin, DOMWindow* source, ExceptionCo de& ec)
810 { 868 {
811 if (!m_frame) 869 if (!isCurrentlyDisplayedInFrame())
812 return; 870 return;
813 871
814 // Compute the target origin. We need to do this synchronously in order 872 // Compute the target origin. We need to do this synchronously in order
815 // to generate the SYNTAX_ERR exception correctly. 873 // to generate the SYNTAX_ERR exception correctly.
816 RefPtr<SecurityOrigin> target; 874 RefPtr<SecurityOrigin> target;
817 if (targetOrigin != "*") { 875 if (targetOrigin != "*") {
818 target = SecurityOrigin::createFromString(targetOrigin); 876 target = SecurityOrigin::createFromString(targetOrigin);
819 if (target->isEmpty()) { 877 if (target->isEmpty()) {
820 ec = SYNTAX_ERR; 878 ec = SYNTAX_ERR;
821 return; 879 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageL evel, message, 0, String()); 911 console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageL evel, message, 0, String());
854 return; 912 return;
855 } 913 }
856 } 914 }
857 915
858 dispatchEvent(timer->event(document())); 916 dispatchEvent(timer->event(document()));
859 } 917 }
860 918
861 DOMSelection* DOMWindow::getSelection() 919 DOMSelection* DOMWindow::getSelection()
862 { 920 {
863 if (!m_selection) 921 if (!m_selection && isCurrentlyDisplayedInFrame())
864 m_selection = DOMSelection::create(m_frame); 922 m_selection = DOMSelection::create(m_frame);
865 return m_selection.get(); 923 return m_selection.get();
866 } 924 }
867 925
868 Element* DOMWindow::frameElement() const 926 Element* DOMWindow::frameElement() const
869 { 927 {
870 if (!m_frame) 928 if (!m_frame)
871 return 0; 929 return 0;
872 930
873 return m_frame->ownerElement(); 931 return m_frame->ownerElement();
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 if (!base64Decode(encodedString, out, FailOnInvalidCharacter)) { 1099 if (!base64Decode(encodedString, out, FailOnInvalidCharacter)) {
1042 ec = INVALID_CHARACTER_ERR; 1100 ec = INVALID_CHARACTER_ERR;
1043 return String(); 1101 return String();
1044 } 1102 }
1045 1103
1046 return String(out.data(), out.size()); 1104 return String(out.data(), out.size());
1047 } 1105 }
1048 1106
1049 bool DOMWindow::find(const String& string, bool caseSensitive, bool backwards, b ool wrap, bool /*wholeWord*/, bool /*searchInFrames*/, bool /*showDialog*/) cons t 1107 bool DOMWindow::find(const String& string, bool caseSensitive, bool backwards, b ool wrap, bool /*wholeWord*/, bool /*searchInFrames*/, bool /*showDialog*/) cons t
1050 { 1108 {
1051 if (!m_frame) 1109 if (!isCurrentlyDisplayedInFrame())
1052 return false; 1110 return false;
1053 1111
1054 // FIXME (13016): Support wholeWord, searchInFrames and showDialog 1112 // FIXME (13016): Support wholeWord, searchInFrames and showDialog
1055 return m_frame->editor()->findString(string, !backwards, caseSensitive, wrap , false); 1113 return m_frame->editor()->findString(string, !backwards, caseSensitive, wrap , false);
1056 } 1114 }
1057 1115
1058 bool DOMWindow::offscreenBuffering() const 1116 bool DOMWindow::offscreenBuffering() const
1059 { 1117 {
1060 return true; 1118 return true;
1061 } 1119 }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 return static_cast<int>(view->scrollY() / m_frame->pageZoomFactor()); 1218 return static_cast<int>(view->scrollY() / m_frame->pageZoomFactor());
1161 } 1219 }
1162 1220
1163 bool DOMWindow::closed() const 1221 bool DOMWindow::closed() const
1164 { 1222 {
1165 return !m_frame; 1223 return !m_frame;
1166 } 1224 }
1167 1225
1168 unsigned DOMWindow::length() const 1226 unsigned DOMWindow::length() const
1169 { 1227 {
1170 if (!m_frame) 1228 if (!isCurrentlyDisplayedInFrame())
1171 return 0; 1229 return 0;
1172 1230
1173 return m_frame->tree()->childCount(); 1231 return m_frame->tree()->childCount();
1174 } 1232 }
1175 1233
1176 String DOMWindow::name() const 1234 String DOMWindow::name() const
1177 { 1235 {
1178 if (!m_frame) 1236 if (!m_frame)
1179 return String(); 1237 return String();
1180 1238
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 1316
1259 Page* page = m_frame->page(); 1317 Page* page = m_frame->page();
1260 if (!page) 1318 if (!page)
1261 return 0; 1319 return 0;
1262 1320
1263 return m_frame->tree()->top(true)->domWindow(); 1321 return m_frame->tree()->top(true)->domWindow();
1264 } 1322 }
1265 1323
1266 Document* DOMWindow::document() const 1324 Document* DOMWindow::document() const
1267 { 1325 {
1268 // FIXME: This function shouldn't need a frame to work. 1326 if (!isCurrentlyDisplayedInFrame())
1269 if (!m_frame)
1270 return 0; 1327 return 0;
1271 1328
1272 // The m_frame pointer is not zeroed out when the window is put into b/f cac he, so it can hold an unrelated document/window pair. 1329 // FIXME: This function shouldn't need a frame to work.
1273 // FIXME: We should always zero out the frame pointer on navigation to avoid accidentally accessing the new frame content.
1274 if (m_frame->domWindow() != this)
1275 return 0;
1276
1277 ASSERT(m_frame->document()); 1330 ASSERT(m_frame->document());
1278 return m_frame->document(); 1331 return m_frame->document();
1279 } 1332 }
1280 1333
1281 PassRefPtr<StyleMedia> DOMWindow::styleMedia() const 1334 PassRefPtr<StyleMedia> DOMWindow::styleMedia() const
1282 { 1335 {
1283 if (!m_media) 1336 if (!m_media && isCurrentlyDisplayedInFrame())
1284 m_media = StyleMedia::create(m_frame); 1337 m_media = StyleMedia::create(m_frame);
1285 return m_media.get(); 1338 return m_media.get();
1286 } 1339 }
1287 1340
1288 PassRefPtr<CSSStyleDeclaration> DOMWindow::getComputedStyle(Element* elt, const String& pseudoElt) const 1341 PassRefPtr<CSSStyleDeclaration> DOMWindow::getComputedStyle(Element* elt, const String& pseudoElt) const
1289 { 1342 {
1290 if (!elt) 1343 if (!elt)
1291 return 0; 1344 return 0;
1292 1345
1293 return computedStyle(elt, false, pseudoElt); 1346 return computedStyle(elt, false, pseudoElt);
1294 } 1347 }
1295 1348
1296 PassRefPtr<CSSRuleList> DOMWindow::getMatchedCSSRules(Element* element, const St ring&, bool authorOnly) const 1349 PassRefPtr<CSSRuleList> DOMWindow::getMatchedCSSRules(Element* element, const St ring&, bool authorOnly) const
1297 { 1350 {
1298 if (!m_frame) 1351 if (!isCurrentlyDisplayedInFrame())
1299 return 0; 1352 return 0;
1300 1353
1301 unsigned rulesToInclude = CSSStyleSelector::AuthorCSSRules; 1354 unsigned rulesToInclude = CSSStyleSelector::AuthorCSSRules;
1302 if (!authorOnly) 1355 if (!authorOnly)
1303 rulesToInclude |= CSSStyleSelector::UAAndUserCSSRules; 1356 rulesToInclude |= CSSStyleSelector::UAAndUserCSSRules;
1304 if (Settings* settings = m_frame->settings()) { 1357 if (Settings* settings = m_frame->settings()) {
1305 if (settings->crossOriginCheckInGetMatchedCSSRulesDisabled()) 1358 if (settings->crossOriginCheckInGetMatchedCSSRulesDisabled())
1306 rulesToInclude |= CSSStyleSelector::CrossOriginCSSRules; 1359 rulesToInclude |= CSSStyleSelector::CrossOriginCSSRules;
1307 } 1360 }
1308 1361
1309 return m_frame->document()->styleSelector()->styleRulesForElement(element, r ulesToInclude); 1362 return m_frame->document()->styleSelector()->styleRulesForElement(element, r ulesToInclude);
1310 } 1363 }
1311 1364
1312 PassRefPtr<WebKitPoint> DOMWindow::webkitConvertPointFromNodeToPage(Node* node, const WebKitPoint* p) const 1365 PassRefPtr<WebKitPoint> DOMWindow::webkitConvertPointFromNodeToPage(Node* node, const WebKitPoint* p) const
1313 { 1366 {
1314 if (!node || !p) 1367 if (!node || !p)
1315 return 0; 1368 return 0;
1316 1369
1317 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 1370 if (!document())
1371 return 0;
1372
1373 document()->updateLayoutIgnorePendingStylesheets();
1318 1374
1319 FloatPoint pagePoint(p->x(), p->y()); 1375 FloatPoint pagePoint(p->x(), p->y());
1320 pagePoint = node->convertToPage(pagePoint); 1376 pagePoint = node->convertToPage(pagePoint);
1321 return WebKitPoint::create(pagePoint.x(), pagePoint.y()); 1377 return WebKitPoint::create(pagePoint.x(), pagePoint.y());
1322 } 1378 }
1323 1379
1324 PassRefPtr<WebKitPoint> DOMWindow::webkitConvertPointFromPageToNode(Node* node, const WebKitPoint* p) const 1380 PassRefPtr<WebKitPoint> DOMWindow::webkitConvertPointFromPageToNode(Node* node, const WebKitPoint* p) const
1325 { 1381 {
1326 if (!node || !p) 1382 if (!node || !p)
1327 return 0; 1383 return 0;
1328 1384
1329 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 1385 if (!document())
1386 return 0;
1387
1388 document()->updateLayoutIgnorePendingStylesheets();
1330 1389
1331 FloatPoint nodePoint(p->x(), p->y()); 1390 FloatPoint nodePoint(p->x(), p->y());
1332 nodePoint = node->convertFromPage(nodePoint); 1391 nodePoint = node->convertFromPage(nodePoint);
1333 return WebKitPoint::create(nodePoint.x(), nodePoint.y()); 1392 return WebKitPoint::create(nodePoint.x(), nodePoint.y());
1334 } 1393 }
1335 1394
1336 double DOMWindow::devicePixelRatio() const 1395 double DOMWindow::devicePixelRatio() const
1337 { 1396 {
1338 if (!m_frame) 1397 if (!m_frame)
1339 return 0.0; 1398 return 0.0;
1340 1399
1341 Page* page = m_frame->page(); 1400 Page* page = m_frame->page();
1342 if (!page) 1401 if (!page)
1343 return 0.0; 1402 return 0.0;
1344 1403
1345 return page->deviceScaleFactor(); 1404 return page->deviceScaleFactor();
1346 } 1405 }
1347 1406
1348 #if ENABLE(DATABASE) 1407 #if ENABLE(DATABASE)
1349 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& v ersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<Datab aseCallback> creationCallback, ExceptionCode& ec) 1408 PassRefPtr<Database> DOMWindow::openDatabase(const String& name, const String& v ersion, const String& displayName, unsigned long estimatedSize, PassRefPtr<Datab aseCallback> creationCallback, ExceptionCode& ec)
1350 { 1409 {
1410 if (!isCurrentlyDisplayedInFrame())
1411 return 0;
1412
1351 RefPtr<Database> database = 0; 1413 RefPtr<Database> database = 0;
1352 if (m_frame && AbstractDatabase::isAvailable() && m_frame->document()->secur ityOrigin()->canAccessDatabase()) 1414 if (m_frame && AbstractDatabase::isAvailable() && m_frame->document()->secur ityOrigin()->canAccessDatabase())
1353 database = Database::openDatabase(m_frame->document(), name, version, di splayName, estimatedSize, creationCallback, ec); 1415 database = Database::openDatabase(m_frame->document(), name, version, di splayName, estimatedSize, creationCallback, ec);
1354 1416
1355 if (!database && !ec) 1417 if (!database && !ec)
1356 ec = SECURITY_ERR; 1418 ec = SECURITY_ERR;
1357 1419
1358 return database; 1420 return database;
1359 } 1421 }
1360 #endif 1422 #endif
1361 1423
1362 void DOMWindow::scrollBy(int x, int y) const 1424 void DOMWindow::scrollBy(int x, int y) const
1363 { 1425 {
1364 if (!m_frame) 1426 if (!isCurrentlyDisplayedInFrame())
1365 return; 1427 return;
1366 1428
1367 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 1429 document()->updateLayoutIgnorePendingStylesheets();
1368 1430
1369 FrameView* view = m_frame->view(); 1431 FrameView* view = m_frame->view();
1370 if (!view) 1432 if (!view)
1371 return; 1433 return;
1372 1434
1373 view->scrollBy(IntSize(x, y)); 1435 view->scrollBy(IntSize(x, y));
1374 } 1436 }
1375 1437
1376 void DOMWindow::scrollTo(int x, int y) const 1438 void DOMWindow::scrollTo(int x, int y) const
1377 { 1439 {
1378 if (!m_frame) 1440 if (!isCurrentlyDisplayedInFrame())
1379 return; 1441 return;
1380 1442
1381 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 1443 document()->updateLayoutIgnorePendingStylesheets();
1382 1444
1383 RefPtr<FrameView> view = m_frame->view(); 1445 RefPtr<FrameView> view = m_frame->view();
1384 if (!view) 1446 if (!view)
1385 return; 1447 return;
1386 1448
1387 int zoomedX = static_cast<int>(x * m_frame->pageZoomFactor()); 1449 int zoomedX = static_cast<int>(x * m_frame->pageZoomFactor());
1388 int zoomedY = static_cast<int>(y * m_frame->pageZoomFactor()); 1450 int zoomedY = static_cast<int>(y * m_frame->pageZoomFactor());
1389 view->setScrollPosition(IntPoint(zoomedX, zoomedY)); 1451 view->setScrollPosition(IntPoint(zoomedX, zoomedY));
1390 } 1452 }
1391 1453
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 return &m_eventTargetData; 1710 return &m_eventTargetData;
1649 } 1711 }
1650 1712
1651 EventTargetData* DOMWindow::ensureEventTargetData() 1713 EventTargetData* DOMWindow::ensureEventTargetData()
1652 { 1714 {
1653 return &m_eventTargetData; 1715 return &m_eventTargetData;
1654 } 1716 }
1655 1717
1656 void DOMWindow::setLocation(const String& urlString, DOMWindow* activeWindow, DO MWindow* firstWindow, SetLocationLocking locking) 1718 void DOMWindow::setLocation(const String& urlString, DOMWindow* activeWindow, DO MWindow* firstWindow, SetLocationLocking locking)
1657 { 1719 {
1658 if (!m_frame) 1720 if (!isCurrentlyDisplayedInFrame())
1659 return; 1721 return;
1660 1722
1661 Frame* activeFrame = activeWindow->frame(); 1723 Frame* activeFrame = activeWindow->frame();
1662 if (!activeFrame) 1724 if (!activeFrame)
1663 return; 1725 return;
1664 1726
1665 if (!activeFrame->loader()->shouldAllowNavigation(m_frame)) 1727 if (!activeFrame->loader()->shouldAllowNavigation(m_frame))
1666 return; 1728 return;
1667 1729
1668 Frame* firstFrame = firstWindow->frame(); 1730 Frame* firstFrame = firstWindow->frame();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1708 // Perhaps we should involve the security origin object in composing it. 1770 // Perhaps we should involve the security origin object in composing it.
1709 // FIXME: This message, and other console messages, have extra newlines. Sho uld remove them. 1771 // FIXME: This message, and other console messages, have extra newlines. Sho uld remove them.
1710 return "Unsafe JavaScript attempt to access frame with URL " + m_url.string( ) + " from frame with URL " + activeWindowURL.string() + ". Domains, protocols a nd ports must match.\n"; 1772 return "Unsafe JavaScript attempt to access frame with URL " + m_url.string( ) + " from frame with URL " + activeWindowURL.string() + ". Domains, protocols a nd ports must match.\n";
1711 } 1773 }
1712 1774
1713 bool DOMWindow::isInsecureScriptAccess(DOMWindow* activeWindow, const String& ur lString) 1775 bool DOMWindow::isInsecureScriptAccess(DOMWindow* activeWindow, const String& ur lString)
1714 { 1776 {
1715 if (!protocolIsJavaScript(urlString)) 1777 if (!protocolIsJavaScript(urlString))
1716 return false; 1778 return false;
1717 1779
1718 // If m_frame->domWindow() != this, then |this| isn't the DOMWindow that's 1780 // If this DOMWindow isn't currently active in the Frame, then there's no
1719 // currently active in the frame and there's no way we should allow the 1781 // way we should allow the access.
1720 // access.
1721 // FIXME: Remove this check if we're able to disconnect DOMWindow from 1782 // FIXME: Remove this check if we're able to disconnect DOMWindow from
1722 // Frame on navigation: https://bugs.webkit.org/show_bug.cgi?id=62054 1783 // Frame on navigation: https://bugs.webkit.org/show_bug.cgi?id=62054
1723 if (m_frame->domWindow() == this) { 1784 if (isCurrentlyDisplayedInFrame()) {
1724 // FIXME: Is there some way to eliminate the need for a separate "active Window == this" check? 1785 // FIXME: Is there some way to eliminate the need for a separate "active Window == this" check?
1725 if (activeWindow == this) 1786 if (activeWindow == this)
1726 return false; 1787 return false;
1727 1788
1728 // FIXME: The name canAccess seems to be a roundabout way to ask "can ex ecute script". 1789 // FIXME: The name canAccess seems to be a roundabout way to ask "can ex ecute script".
1729 // Can we name the SecurityOrigin function better to make this more clea r? 1790 // Can we name the SecurityOrigin function better to make this more clea r?
1730 if (activeWindow->securityOrigin()->canAccess(securityOrigin())) 1791 if (activeWindow->securityOrigin()->canAccess(securityOrigin()))
1731 return false; 1792 return false;
1732 } 1793 }
1733 1794
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 bool lockHistory = !ScriptController::processingUserGesture(); 1831 bool lockHistory = !ScriptController::processingUserGesture();
1771 newFrame->navigationScheduler()->scheduleLocationChange(activeWindow->se curityOrigin(), completedURL.string(), referrer, lockHistory, false); 1832 newFrame->navigationScheduler()->scheduleLocationChange(activeWindow->se curityOrigin(), completedURL.string(), referrer, lockHistory, false);
1772 } 1833 }
1773 1834
1774 return newFrame; 1835 return newFrame;
1775 } 1836 }
1776 1837
1777 PassRefPtr<DOMWindow> DOMWindow::open(const String& urlString, const AtomicStrin g& frameName, const String& windowFeaturesString, 1838 PassRefPtr<DOMWindow> DOMWindow::open(const String& urlString, const AtomicStrin g& frameName, const String& windowFeaturesString,
1778 DOMWindow* activeWindow, DOMWindow* firstWindow) 1839 DOMWindow* activeWindow, DOMWindow* firstWindow)
1779 { 1840 {
1780 if (!m_frame) 1841 if (!isCurrentlyDisplayedInFrame())
1781 return 0; 1842 return 0;
1782 Frame* activeFrame = activeWindow->frame(); 1843 Frame* activeFrame = activeWindow->frame();
1783 if (!activeFrame) 1844 if (!activeFrame)
1784 return 0; 1845 return 0;
1785 Frame* firstFrame = firstWindow->frame(); 1846 Frame* firstFrame = firstWindow->frame();
1786 if (!firstFrame) 1847 if (!firstFrame)
1787 return 0; 1848 return 0;
1788 1849
1789 if (!firstWindow->allowPopUp()) { 1850 if (!firstWindow->allowPopUp()) {
1790 // Because FrameTree::find() returns true for empty strings, we must che ck for empty frame names. 1851 // Because FrameTree::find() returns true for empty strings, we must che ck for empty frame names.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1838 windowFeatures.height = windowRect.height(); 1899 windowFeatures.height = windowRect.height();
1839 windowFeatures.width = windowRect.width(); 1900 windowFeatures.width = windowRect.width();
1840 1901
1841 Frame* result = createWindow(urlString, frameName, windowFeatures, activeWin dow, firstFrame, m_frame); 1902 Frame* result = createWindow(urlString, frameName, windowFeatures, activeWin dow, firstFrame, m_frame);
1842 return result ? result->domWindow() : 0; 1903 return result ? result->domWindow() : 0;
1843 } 1904 }
1844 1905
1845 void DOMWindow::showModalDialog(const String& urlString, const String& dialogFea turesString, 1906 void DOMWindow::showModalDialog(const String& urlString, const String& dialogFea turesString,
1846 DOMWindow* activeWindow, DOMWindow* firstWindow, PrepareDialogFunction funct ion, void* functionContext) 1907 DOMWindow* activeWindow, DOMWindow* firstWindow, PrepareDialogFunction funct ion, void* functionContext)
1847 { 1908 {
1848 if (!m_frame) 1909 if (!isCurrentlyDisplayedInFrame())
1849 return; 1910 return;
1850 Frame* activeFrame = activeWindow->frame(); 1911 Frame* activeFrame = activeWindow->frame();
1851 if (!activeFrame) 1912 if (!activeFrame)
1852 return; 1913 return;
1853 Frame* firstFrame = firstWindow->frame(); 1914 Frame* firstFrame = firstWindow->frame();
1854 if (!firstFrame) 1915 if (!firstFrame)
1855 return; 1916 return;
1856 1917
1857 if (!canShowModalDialogNow(m_frame) || !firstWindow->allowPopUp()) 1918 if (!canShowModalDialogNow(m_frame) || !firstWindow->allowPopUp())
1858 return; 1919 return;
1859 1920
1860 Frame* dialogFrame = createWindow(urlString, emptyAtom, WindowFeatures(dialo gFeaturesString, screenAvailableRect(m_frame->view())), 1921 Frame* dialogFrame = createWindow(urlString, emptyAtom, WindowFeatures(dialo gFeaturesString, screenAvailableRect(m_frame->view())),
1861 activeWindow, firstFrame, m_frame, function, functionContext); 1922 activeWindow, firstFrame, m_frame, function, functionContext);
1862 if (!dialogFrame) 1923 if (!dialogFrame)
1863 return; 1924 return;
1864 1925
1865 dialogFrame->page()->chrome()->runModal(); 1926 dialogFrame->page()->chrome()->runModal();
1866 } 1927 }
1867 1928
1868 #if ENABLE(BLOB) 1929 #if ENABLE(BLOB)
1869 DOMURL* DOMWindow::webkitURL() const 1930 DOMURL* DOMWindow::webkitURL() const
1870 { 1931 {
1871 if (!m_domURL) 1932 if (!m_domURL && isCurrentlyDisplayedInFrame())
1872 m_domURL = DOMURL::create(this->scriptExecutionContext()); 1933 m_domURL = DOMURL::create(this->scriptExecutionContext());
1873 return m_domURL.get(); 1934 return m_domURL.get();
1874 } 1935 }
1875 #endif 1936 #endif
1876 1937
1877 #if ENABLE(QUOTA) 1938 #if ENABLE(QUOTA)
1878 StorageInfo* DOMWindow::webkitStorageInfo() const 1939 StorageInfo* DOMWindow::webkitStorageInfo() const
1879 { 1940 {
1880 if (!m_storageInfo) 1941 if (!m_storageInfo && isCurrentlyDisplayedInFrame())
1881 m_storageInfo = StorageInfo::create(); 1942 m_storageInfo = StorageInfo::create();
1882 return m_storageInfo.get(); 1943 return m_storageInfo.get();
1883 } 1944 }
1884 #endif 1945 #endif
1885 1946
1886 } // namespace WebCore 1947 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/page/DOMWindow.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698