|
42 | 42 | #include "nsViewManager.h" |
43 | 43 | #include "GeckoProfiler.h" |
44 | 44 | #include "nsNPAPIPluginInstance.h" |
| 45 | +#include "nsPerformance.h" |
| 46 | +#include "mozilla/dom/WindowBinding.h" |
45 | 47 |
|
46 | 48 | using mozilla::TimeStamp; |
47 | 49 | using mozilla::TimeDuration; |
@@ -816,6 +818,15 @@ nsRefreshDriver::DoTick() |
816 | 818 | } |
817 | 819 | } |
818 | 820 |
|
| 821 | +struct DocumentFrameCallbacks { |
| 822 | + DocumentFrameCallbacks(nsIDocument* aDocument) : |
| 823 | + mDocument(aDocument) |
| 824 | + {} |
| 825 | + |
| 826 | + nsCOMPtr<nsIDocument> mDocument; |
| 827 | + nsIDocument::FrameRequestCallbackList mCallbacks; |
| 828 | +}; |
| 829 | + |
819 | 830 | void |
820 | 831 | nsRefreshDriver::Tick(int64_t aNowEpoch, TimeStamp aNowTime) |
821 | 832 | { |
@@ -873,19 +884,41 @@ nsRefreshDriver::Tick(int64_t aNowEpoch, TimeStamp aNowTime) |
873 | 884 |
|
874 | 885 | if (i == 0) { |
875 | 886 | // Grab all of our frame request callbacks up front. |
876 | | - nsIDocument::FrameRequestCallbackList frameRequestCallbacks; |
| 887 | + nsTArray<DocumentFrameCallbacks> |
| 888 | + frameRequestCallbacks(mFrameRequestCallbackDocs.Length()); |
877 | 889 | for (uint32_t i = 0; i < mFrameRequestCallbackDocs.Length(); ++i) { |
| 890 | + frameRequestCallbacks.AppendElement(mFrameRequestCallbackDocs[i]); |
878 | 891 | mFrameRequestCallbackDocs[i]-> |
879 | | - TakeFrameRequestCallbacks(frameRequestCallbacks); |
| 892 | + TakeFrameRequestCallbacks(frameRequestCallbacks.LastElement().mCallbacks); |
880 | 893 | } |
881 | 894 | // OK, now reset mFrameRequestCallbackDocs so they can be |
882 | 895 | // readded as needed. |
883 | 896 | mFrameRequestCallbackDocs.Clear(); |
884 | 897 |
|
885 | 898 | int64_t eventTime = aNowEpoch / PR_USEC_PER_MSEC; |
886 | 899 | for (uint32_t i = 0; i < frameRequestCallbacks.Length(); ++i) { |
887 | | - nsAutoMicroTask mt; |
888 | | - frameRequestCallbacks[i]->Sample(eventTime); |
| 900 | + const DocumentFrameCallbacks& docCallbacks = frameRequestCallbacks[i]; |
| 901 | + DOMHighResTimeStamp timeStamp; |
| 902 | + // XXXbz Bug 863140: GetInnerWindow can return the outer |
| 903 | + // window in some cases. |
| 904 | + nsPIDOMWindow* innerWindow = docCallbacks.mDocument->GetInnerWindow(); |
| 905 | + if (innerWindow && innerWindow->IsInnerWindow()) { |
| 906 | + timeStamp = innerWindow->GetPerformance()->GetDOMTiming()-> |
| 907 | + TimeStampToDOMHighRes(aNowTime); |
| 908 | + } else { |
| 909 | + timeStamp = 0; |
| 910 | + } |
| 911 | + for (uint32_t j = 0; j < docCallbacks.mCallbacks.Length(); ++j) { |
| 912 | + const nsIDocument::FrameRequestCallbackHolder& holder = |
| 913 | + docCallbacks.mCallbacks[j]; |
| 914 | + nsAutoMicroTask mt; |
| 915 | + if (holder.HasWebIDLCallback()) { |
| 916 | + ErrorResult ignored; |
| 917 | + holder.GetWebIDLCallback()->Call(timeStamp, ignored); |
| 918 | + } else { |
| 919 | + holder.GetXPCOMCallback()->Sample(eventTime); |
| 920 | + } |
| 921 | + } |
889 | 922 | } |
890 | 923 |
|
891 | 924 | // This is the Flush_Style case. |
|
0 commit comments