Delay PeerConnectionWrapper destruction until data channels are closed

Due to a recent WebRTC change, if the PeerConnection is closed before
the data channels complete their close dance then an error is raised on
the other side of the connection.  For our purposes, we can't tell the
difference between a connection which was closed on the host-side and a
connection that was dropped due to network conditions, host crash, etc.

This CL adds some logic to delay destruction of the PeerConnection until
after the main data channels (event and control) report that they have
closed.  These channels are wrapped in several layers of abstraction so
instead, mostly to make it simple for the host to handle both WebRTC and
Chromotocol connections.  The simplest way I could find to track the
channel state was to store refptrs for the event and control channels in
the WebrtcTransport class and then query them (requires polling) after
so often until they report they have successfully closed.  If for some
reason this takes way longer than usual, we have a max timeout of 5
seconds which will just close the peer connection.

Bug: 1083269
Change-Id: I5a42282d7dd4f74ad734e2fc1a955e42c67e4ce7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2197415
Commit-Queue: Joe Downing <joedow@chromium.org>
Reviewed-by: Jamie Walch <jamiewalch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#769459}
3 files changed
tree: b5a3accb64c448cff4284a5451a6e9716ead2126
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. ENG_REVIEW_OWNERS
  68. LICENSE
  69. LICENSE.chromium_os
  70. OWNERS
  71. PRESUBMIT.py
  72. PRESUBMIT_test.py
  73. PRESUBMIT_test_mocks.py
  74. README.md
  75. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.