Home | History | Annotate | Download | only in loader
      1 /*
      2  * Copyright (C) 2011 Google, Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "core/loader/DocumentLoadTiming.h"
     28 
     29 #include "platform/weborigin/SecurityOrigin.h"
     30 #include "wtf/RefPtr.h"
     31 
     32 namespace blink {
     33 
     34 DocumentLoadTiming::DocumentLoadTiming()
     35     : m_referenceMonotonicTime(0.0)
     36     , m_referenceWallTime(0.0)
     37     , m_navigationStart(0.0)
     38     , m_unloadEventStart(0.0)
     39     , m_unloadEventEnd(0.0)
     40     , m_redirectStart(0.0)
     41     , m_redirectEnd(0.0)
     42     , m_redirectCount(0)
     43     , m_fetchStart(0.0)
     44     , m_responseEnd(0.0)
     45     , m_loadEventStart(0.0)
     46     , m_loadEventEnd(0.0)
     47     , m_hasCrossOriginRedirect(false)
     48     , m_hasSameOriginAsPreviousDocument(false)
     49 {
     50 }
     51 
     52 double DocumentLoadTiming::monotonicTimeToZeroBasedDocumentTime(double monotonicTime) const
     53 {
     54     if (!monotonicTime)
     55         return 0.0;
     56     return monotonicTime - m_referenceMonotonicTime;
     57 }
     58 
     59 double DocumentLoadTiming::monotonicTimeToPseudoWallTime(double monotonicTime) const
     60 {
     61     if (!monotonicTime)
     62         return 0.0;
     63     return m_referenceWallTime + monotonicTime - m_referenceMonotonicTime;
     64 }
     65 
     66 void DocumentLoadTiming::markNavigationStart()
     67 {
     68     ASSERT(!m_navigationStart && !m_referenceMonotonicTime && !m_referenceWallTime);
     69 
     70     m_navigationStart = m_referenceMonotonicTime = monotonicallyIncreasingTime();
     71     m_referenceWallTime = currentTime();
     72 }
     73 
     74 void DocumentLoadTiming::setNavigationStart(double navigationStart)
     75 {
     76     ASSERT(m_referenceMonotonicTime && m_referenceWallTime);
     77     m_navigationStart = navigationStart;
     78 
     79     // |m_referenceMonotonicTime| and |m_referenceWallTime| represent
     80     // navigationStart. When the embedder sets navigationStart (because the
     81     // navigation started earlied on the browser side), we need to adjust these
     82     // as well.
     83     m_referenceWallTime = monotonicTimeToPseudoWallTime(navigationStart);
     84     m_referenceMonotonicTime = navigationStart;
     85 }
     86 
     87 void DocumentLoadTiming::addRedirect(const KURL& redirectingUrl, const KURL& redirectedUrl)
     88 {
     89     m_redirectCount++;
     90     if (!m_redirectStart)
     91         m_redirectStart = m_fetchStart;
     92     m_redirectEnd = m_fetchStart = monotonicallyIncreasingTime();
     93     // Check if the redirected url is allowed to access the redirecting url's timing information.
     94     RefPtr<SecurityOrigin> redirectedSecurityOrigin = SecurityOrigin::create(redirectedUrl);
     95     m_hasCrossOriginRedirect = !redirectedSecurityOrigin->canRequest(redirectingUrl);
     96 }
     97 
     98 } // namespace blink
     99