/**
  * UserTimingHtmlTable constructor.
  * @param TestRunResults $runResults Run results to use for the table
  */
 public function __construct($runResults)
 {
     $this->runResults = $runResults;
     $this->hasNavTiming = $runResults->hasValidMetric("loadEventStart") || $runResults->hasValidMetric("domContentLoadedEventStart");
     $this->hasUserTiming = $this->_initUserTimings();
     $this->hasFirstPaint = $this->runResults->hasValidMetric("firstPaint");
     $this->hasDomInteractive = $this->runResults->hasValidMetric("domInteractive");
     $this->isMultistep = $runResults->countSteps() > 1;
 }
Пример #2
0
 /**
  * RunResultHtmlTable constructor.
  * @param TestInfo $testInfo
  * @param TestRunResults $runResults
  * @param TestRunResults $rvRunResults Optional. Run results of the repeat view
  */
 public function __construct($testInfo, $runResults, $rvRunResults = null)
 {
     $this->testInfo = $testInfo;
     $this->runResults = $runResults;
     $this->rvRunResults = $rvRunResults;
     $this->isMultistep = $runResults->isMultistep();
     $this->leftOptionalColumns = array(self::COL_LABEL, self::COL_ABOVE_THE_FOLD, self::COL_USER_TIME, self::COL_DOM_TIME, self::COL_DOM_ELEMENTS, self::COL_SPEED_INDEX, self::COL_VISUAL_COMPLETE, self::COL_RESULT);
     $this->rightOptionalColumns = array(self::COL_COST);
     $this->enabledColumns = array();
     // optional columns default setting based on data
     $this->enabledColumns[self::COL_LABEL] = $this->testInfo->getRuns() > 1 || $this->isMultistep || $this->rvRunResults;
     $this->enabledColumns[self::COL_ABOVE_THE_FOLD] = $testInfo->hasAboveTheFoldTime();
     $this->enabledColumns[self::COL_RESULT] = true;
     $checkByMetric = array(self::COL_USER_TIME, self::COL_DOM_TIME, self::COL_DOM_ELEMENTS, self::COL_SPEED_INDEX, self::COL_VISUAL_COMPLETE);
     foreach ($checkByMetric as $col) {
         $this->enabledColumns[$col] = $runResults->hasValidMetric($col) || $rvRunResults && $rvRunResults->hasValidMetric($col);
     }
 }
 /**
  * @param TestRunResults $testRunResults
  * @return array With numSteps, run, and tester info
  */
 private function basicRunInfoArray($testRunResults)
 {
     $ret = array();
     $run = $testRunResults->getRunNumber();
     $ret["numSteps"] = $testRunResults->countSteps();
     $ret['run'] = $run;
     $ret['tester'] = $this->testInfo->getTester($run);
     return $ret;
 }
Пример #4
0
 private function getTestRunResultsWithInvalid()
 {
     $step4 = array('result' => 404, 'TTFB' => 500, 'loadTime' => 1000);
     // result is error
     $steps = $this->getTestStepArray();
     $steps[] = TestStepResult::fromPageData($this->testInfo, $step4, 2, false, 4);
     return TestRunResults::fromStepResults($this->testInfo, 2, false, $steps);
 }
Пример #5
0
 private static function singlestepRunFromPageData($testInfo, $runNumber, $cached, &$runs)
 {
     $cacheIdx = $cached ? 1 : 0;
     if (empty($runs[$cacheIdx])) {
         return null;
     }
     $step = TestStepResult::fromPageData($testInfo, $runs[$cacheIdx], $runNumber, $cached, 1);
     return TestRunResults::fromStepResults($testInfo, $runNumber, $cached, array($step));
 }
 private function getTestRunResults($numSteps)
 {
     $steps = $this->getTestStepArray();
     return TestRunResults::fromStepResults($this->testInfo, 2, true, array_slice($steps, 0, $numSteps));
 }
Пример #7
0
<?php

include 'common.inc';
require_once __DIR__ . '/include/TestInfo.php';
require_once __DIR__ . '/include/TestPaths.php';
require_once __DIR__ . '/include/TestRunResults.php';
require_once __DIR__ . '/include/DomainBreakdownHtmlSnippet.php';
require_once __DIR__ . '/include/AccordionHtmlHelper.php';
$page_keywords = array('Domains', 'Webpagetest', 'Website Speed Test');
$page_description = "Website domain breakdown{$testLabel}";
$testInfo = TestInfo::fromFiles($testPath);
$firstViewResults = TestRunResults::fromFiles($testInfo, $run, false);
$isMultistep = $firstViewResults->countSteps() > 1;
$repeatViewResults = null;
if (!$testInfo->isFirstViewOnly()) {
    $repeatViewResults = TestRunResults::fromFiles($testInfo, $run, true);
}
if (array_key_exists('f', $_REQUEST) && $_REQUEST['f'] == 'json') {
    $domains = array('firstView' => $firstViewResults->getStepResult(1)->getJSFriendlyDomainBreakdown(true));
    if ($repeatViewResults) {
        $domains['repeatView'] = $repeatViewResults->getStepResult(1)->getJSFriendlyDomainBreakdown(true);
    }
    $output = array('domains' => $domains);
    json_response($output);
    exit;
}
?>


<!DOCTYPE html>
<html>
/**
 * Parse the page data and load the optimization-specific details for a complete run
 *
 * @param TestRunResults $testRunResults Results of the run to get the grades for
 * @return array|null An array with all labels, scores, grades, weights, etc per score
 */
function getOptimizationGradesForRun($testRunResults)
{
    if (!isset($testRunResults)) {
        return null;
    }
    $scores = array();
    $scores['keep-alive'] = $testRunResults->averageMetric('score_keep-alive');
    $scores['gzip'] = $testRunResults->averageMetric('score_gzip');
    $scores['image_compression'] = $testRunResults->averageMetric('score_compress');
    $scores['caching'] = $testRunResults->averageMetric('score_cache');
    $scores['combine'] = $testRunResults->averageMetric('score_combine');
    $scores['cdn'] = $testRunResults->averageMetric('score_cdn');
    $scores['cookies'] = $testRunResults->averageMetric('score_cookies');
    $scores['minify'] = $testRunResults->averageMetric('score_minify');
    $scores['e-tags'] = $testRunResults->averageMetric('score_etags');
    $scores['progressive_jpeg'] = $testRunResults->averageMetric('score_progressive_jpeg');
    $numTTFBScores = 0;
    $sumTTFBScores = 0.0;
    for ($i = 1; $i <= $testRunResults->countSteps(); $i++) {
        $stepResult = $testRunResults->getStepResult($i);
        $pageData = $stepResult->getRawResults();
        $ttfb = (int) $pageData['TTFB'];
        $latency = isset($test['testinfo']['latency']) ? $test['testinfo']['latency'] : null;
        $ttfbScore = gradeTTFBForStep($ttfb, $latency, $stepResult->createTestPaths(), $target);
        if (isset($ttfbScore)) {
            $numTTFBScores++;
            $sumTTFBScores += $ttfbScore;
        }
    }
    if ($numTTFBScores > 0) {
        $scores['ttfb'] = $sumTTFBScores / $numTTFBScores;
    }
    return createGradeArray($scores);
}
Пример #9
0
require_once 'waterfall.inc';
require_once __DIR__ . '/include/TestInfo.php';
require_once __DIR__ . '/include/TestRunResults.php';
require_once __DIR__ . '/include/RunResultHtmlTable.php';
require_once __DIR__ . '/include/UserTimingHtmlTable.php';
require_once __DIR__ . '/include/WaterfallViewHtmlSnippet.php';
require_once __DIR__ . '/include/ConnectionViewHtmlSnippet.php';
require_once __DIR__ . '/include/RequestDetailsHtmlSnippet.php';
require_once __DIR__ . '/include/RequestHeadersHtmlSnippet.php';
require_once __DIR__ . '/include/AccordionHtmlHelper.php';
$options = null;
if (array_key_exists('end', $_REQUEST)) {
    $options = array('end' => $_REQUEST['end']);
}
$testInfo = TestInfo::fromFiles($testPath);
$testRunResults = TestRunResults::fromFiles($testInfo, $run, $cached, null, $options);
$data = loadPageRunData($testPath, $run, $cached, $options, $test['testinfo']);
$isMultistep = $testRunResults->countSteps() > 1;
$page_keywords = array('Performance Test', 'Details', 'Webpagetest', 'Website Speed Test', 'Page Speed');
$page_description = "Website performance test details{$testLabel}";
?>
<!DOCTYPE html>
<html>
    <head>
        <title>WebPagetest Test Details<?php 
echo $testLabel;
?>
</title>
        <?php 
$gaTemplate = 'Details';
include 'head.inc';
 private function getSinglestepTestRunResultMock()
 {
     global $SINGLESTEP_RUN_RESULT_DATA;
     $mock = $this->getMockBuilder("TestStepResult")->disableOriginalConstructor()->getMock();
     foreach ($SINGLESTEP_RUN_RESULT_DATA as $key => &$value) {
         $mock->method($key)->willReturn($value);
     }
     $mock->method("isCachedRun")->willReturn(false);
     $mock->method("getRunNumber")->willReturn(1);
     return TestRunResults::fromStepResults($this->testInfoMock, 1, false, array($mock));
 }
<?php

include __DIR__ . '/common.inc';
require_once __DIR__ . '/include/TestInfo.php';
require_once __DIR__ . '/include/TestRunResults.php';
require_once __DIR__ . '/optimization_detail.inc.php';
require_once __DIR__ . '/include/PerformanceOptimizationHtmlSnippet.php';
require_once __DIR__ . '/include/AccordionHtmlHelper.php';
$page_keywords = array('Optimization', 'Webpagetest', 'Website Speed Test', 'Page Speed');
$page_description = "Website performance optimization recommendations{$testLabel}.";
global $testPath, $run, $cached, $step;
// defined in common.inc
$testInfo = TestInfo::fromFiles($testPath);
$testRunResults = TestRunResults::fromFiles($testInfo, $run, $cached, $step);
$isMultistep = $testRunResults->countSteps() > 1;
?>
<!DOCTYPE html>
<html>
    <head>
        <title>WebPagetest Optimization Check Results<?php 
echo $testLabel;
?>
</title>
        <?php 
$gaTemplate = 'Optimization Check';
include 'head.inc';
?>
        <style type="text/css">
            td.nowrap {white-space:nowrap;}
            th.nowrap {white-space:nowrap;}
            tr.blank {height:2ex;}
Пример #12
0
/**
 * @param TestRunResults $testRunResults The run results to generate quicklinks for
 */
function printQuicklinks($testRunResults)
{
    echo '<a name="quicklinks"><h1>Quicklinks</h1></a>';
    echo '<div style="text-align: center;"><table class="pretty" id="quicklinks_table">';
    echo '<tbody>';
    for ($i = 1; $i <= $testRunResults->countSteps(); $i++) {
        $class = $i % 2 == 0 ? " class='even'" : "";
        echo '<tr' . $class . '>';
        echo '<th>' . $testRunResults->getStepResult($i)->readableIdentifier() . '</th>';
        echo '<td><a href="#step_' . $i . '">Screen Shots</a></td>';
        echo '</tr>';
    }
    echo '</tbody>';
    echo "</table></div>";
}
Пример #13
0
 /**
  * @param TestRunResults $runResult Result of this run
  */
 public function printRun($runResult)
 {
     if (empty($runResult)) {
         return;
     }
     $testResult = $runResult->getStepResult(1);
     $numSteps = $runResult->countSteps();
     $this->printViewRootStartTag($testResult->isCachedRun());
     $this->printTester($runResult->getRunNumber());
     echo "<numSteps>" . $numSteps . "</numSteps>\n";
     if ($this->forceMultistep || $numSteps > 1) {
         for ($step = 1; $step <= $numSteps; $step++) {
             $testStepResult = $runResult->getStepResult($step);
             $eventName = empty($testStepResult) ? "" : $testStepResult->getEventName();
             echo "<step>\n";
             echo "<id>" . $step . "</id>";
             echo "<eventName>" . $eventName . "</eventName>";
             $this->printStepResults($testStepResult);
             echo "</step>\n";
         }
     } else {
         $this->printStepResults($runResult->getStepResult(1));
     }
     $this->printViewRootEndTag($testResult->isCachedRun());
 }