New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 623556 link

Starred by 1 user

Issue metadata

Status: Fixed
Owner:
Last visit > 30 days ago
Closed: Jul 2016
Cc:
EstimatedDays: ----
NextAction: ----
OS: ----
Pri: 3
Type: Bug

Blocking:
issue 590212



Sign in to add a comment

update PageLoadTiming TimeDeltas to use base::Optional

Project Member Reported by bmcquade@chromium.org, Jun 27 2016

Issue description

In https://codereview.chromium.org/1837233002 Shivani landed a change to use base::Optional for some of the timings used by page load metrics.

As a follow up, we should also switch all of the TimeDeltas in PageLoadTiming to use base::Optional.

We currently use a non-zero TimeDelta as an indicator that a given PageLoadTiming event occurred. For example, in DispatchObserverTimingCallbacks (https://cs.chromium.org/chromium/src/components/page_load_metrics/browser/metrics_web_contents_observer.cc?rcl=1467011815&l=207) we have logic like:

  if (!new_timing.dom_content_loaded_event_start.is_zero() &&
      last_timing.dom_content_loaded_event_start.is_zero())
    observer->OnDomContentLoadedEventStart(new_timing, extra_info);

This ends up working correctly most of the time, but misses cases where a timing was observed but at zero milliseconds after navigation start.

The bigger issue is that this can make writing tests difficult in some cases. For instance, in https://cs.chromium.org/chromium/src/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc, the test logic become unnecessarily complex as a result of having a zero TTFCP value in the test. To work around the issues, additional methods were exposed to allow the test to override certain aspects of the code behavior, which means these tests aren't actually even testing real production code flow - they have to inject certain calls that don't normally happen in production in order to exercise the intended codepaths.

To fix this, we should update the timings in PageLoadTiming to be wrapped in base::Optional.

There are a few complications that we need to address before we can do this:
1. we need to add support for IPC serialization of base::Optional. I've got a CL in progress that does this.
2. we need to avoid using PageLoadTiming with gmock, due to some rather subtle and unfortunate issues explained in https://groups.google.com/forum/#!topic/googletestframework/W-Hud3j_c6I. I started working on these and can try to finish the work.

Once the above are done, we can put together a change that updates the timings in PageLoadTiming to use base::Optional. We'll also have to update all code that uses PageLoadTiming to know how to process these Optional values, which is going to be a somewhat large task.
 
Blocking: 590212
Project Member

Comment 2 by bugdroid1@chromium.org, Jun 30 2016

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/4a92b31b73ae1410660625e7b833dde4556217ca

commit 4a92b31b73ae1410660625e7b833dde4556217ca
Author: bmcquade <bmcquade@chromium.org>
Date: Thu Jun 30 20:23:47 2016

PageLoadTiming fixes in prep for using base::Optional

We use PageLoadTiming with gmock in a few places. gmock sometimes passes
objects to functions by value. In these cases, if PageLoadTiming contains
base::Optional members, the code fails to compile on windows due to as
issue with Optional's use of aligned memory.

This changes updates our use of PageLoadTiming with gmock to no longer
use aspects of gmock that pass PageLoadTiming by value.

This factors common code into a new FakePageTimingMetricsIPCSender class,
which provides the functionality we had been using gmock for.

See https://groups.google.com/forum/#!topic/googletestframework/W-Hud3j_c6I
for additional details on why gmock is not compatible with Optional.

BUG= 623556 

Review-Url: https://codereview.chromium.org/2100653002
Cr-Commit-Position: refs/heads/master@{#403266}

[modify] https://crrev.com/4a92b31b73ae1410660625e7b833dde4556217ca/components/components_tests.gyp
[modify] https://crrev.com/4a92b31b73ae1410660625e7b833dde4556217ca/components/page_load_metrics/renderer/BUILD.gn
[add] https://crrev.com/4a92b31b73ae1410660625e7b833dde4556217ca/components/page_load_metrics/renderer/fake_page_timing_metrics_ipc_sender.cc
[add] https://crrev.com/4a92b31b73ae1410660625e7b833dde4556217ca/components/page_load_metrics/renderer/fake_page_timing_metrics_ipc_sender.h
[modify] https://crrev.com/4a92b31b73ae1410660625e7b833dde4556217ca/components/page_load_metrics/renderer/metrics_render_frame_observer_unittest.cc
[modify] https://crrev.com/4a92b31b73ae1410660625e7b833dde4556217ca/components/page_load_metrics/renderer/page_timing_metrics_sender_unittest.cc

Project Member

Comment 3 by bugdroid1@chromium.org, Jul 1 2016

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/18573e16ba6fd3240514d661da4b64ffc0e82da8

commit 18573e16ba6fd3240514d661da4b64ffc0e82da8
Author: bmcquade <bmcquade@chromium.org>
Date: Fri Jul 01 13:13:50 2016

Add IPC serialization support for base::Optional

As part of  bug 623556 , we need to update one of our IPC structs to use
Optional.

We unfortunately can't migrate to mojo at this time because our IPCs
depend on delivery order relative to other IPCs (in particular,
FrameHostMsg_DidCommitProvisionalLoad). Additional details on ordering
constraints are covered in
https://docs.google.com/document/d/1HJsJ5W2H_3qRdqPAUgAEo10AF8gXPTXZLUET4X4_sII/edit.
As a result, I'd like to add IPC serialization support for Optional
so we can unblock progress on  bug 623556 .

BUG= 623556 

Review-Url: https://codereview.chromium.org/2098823003
Cr-Commit-Position: refs/heads/master@{#403442}

[modify] https://crrev.com/18573e16ba6fd3240514d661da4b64ffc0e82da8/ipc/ipc_message_utils.h
[modify] https://crrev.com/18573e16ba6fd3240514d661da4b64ffc0e82da8/ipc/ipc_message_utils_unittest.cc

Project Member

Comment 4 by bugdroid1@chromium.org, Jul 8 2016

The following revision refers to this bug:
  https://chromium.googlesource.com/chromium/src.git/+/17bcb076bdfb2d7c27b973518c8488a0c885ef1a

commit 17bcb076bdfb2d7c27b973518c8488a0c885ef1a
Author: bmcquade <bmcquade@chromium.org>
Date: Fri Jul 08 21:21:05 2016

Update PageLoadTiming to use base::Optional

Until now, we've used base::TimeDelta.is_zero() as a signal that
a given timing is unset.

This is technically incorrect, as a TimeDelta can be set to the
zero value.

This mostly presented issues that made writing tests more complex,
but also addresses real issues where a metric reports a zero time
delta that would have previously been ignored but will now be
included in our metrics.

BUG= 623556 

Review-Url: https://codereview.chromium.org/2111073003
Cr-Commit-Position: refs/heads/master@{#404493}

[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer_unittest.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.h
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/chrome/browser/page_load_metrics/observers/stale_while_revalidate_metrics_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/components/page_load_metrics/browser/page_load_metrics_util.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/components/page_load_metrics/browser/page_load_metrics_util.h
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/components/page_load_metrics/common/page_load_timing.cc
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/components/page_load_metrics/common/page_load_timing.h
[modify] https://crrev.com/17bcb076bdfb2d7c27b973518c8488a0c885ef1a/components/page_load_metrics/renderer/metrics_render_frame_observer.cc

Owner: bmcquade@chromium.org
Status: Fixed (was: Available)

Sign in to add a comment