[DevTools] Roll inspector_protocol

to rev 0ffa9dd64489868aad8fc40988558725eabd656e.

This brings in the fix for AppendString8EntryToCBORMapTmpl.

Change-Id: Iad4e450c5e7b998d311596096c0c5e6145e6d4a3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1574367
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Commit-Queue: Johannes Henkel <johannes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652441}
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium
index 4faba6d..44f8cec 100644
--- a/third_party/inspector_protocol/README.chromium
+++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@
 Short Name: inspector_protocol
 URL: https://chromium.googlesource.com/deps/inspector_protocol/
 Version: 0
-Revision: 34bdcd1fb46ec80fb22908ee03fdb7cacf2575ac
+Revision: 0ffa9dd64489868aad8fc40988558725eabd656e
 License: BSD
 License File: LICENSE
 Security Critical: no
diff --git a/third_party/inspector_protocol/encoding/encoding.cc b/third_party/inspector_protocol/encoding/encoding.cc
index 211deff..d3e7f0d 100644
--- a/third_party/inspector_protocol/encoding/encoding.cc
+++ b/third_party/inspector_protocol/encoding/encoding.cc
@@ -977,6 +977,8 @@
 Status AppendString8EntryToCBORMapTmpl(span<uint8_t> string8_key,
                                        span<uint8_t> string8_value,
                                        C* cbor) {
+  // Careful below: Don't compare (*cbor)[idx] with a uint8_t, since
+  // it could be a char (signed!). Instead, use bytes.
   span<uint8_t> bytes(reinterpret_cast<const uint8_t*>(cbor->data()),
                       cbor->size());
   CBORTokenizer tokenizer(bytes);
@@ -991,7 +993,7 @@
   if (envelope_size == 0 ||
       (tokenizer.GetEnvelopeContents()[0] != EncodeIndefiniteLengthMapStart()))
     return Status(Error::CBOR_MAP_START_EXPECTED, kEncodedEnvelopeHeaderSize);
-  if (cbor->back() != EncodeStop())
+  if (bytes[bytes.size() - 1] != EncodeStop())
     return Status(Error::CBOR_MAP_STOP_EXPECTED, cbor->size() - 1);
   cbor->pop_back();
   EncodeString8(string8_key, cbor);
diff --git a/third_party/inspector_protocol/encoding/encoding_test.cc b/third_party/inspector_protocol/encoding/encoding_test.cc
index e48d359..a0fe95e 100644
--- a/third_party/inspector_protocol/encoding/encoding_test.cc
+++ b/third_party/inspector_protocol/encoding/encoding_test.cc
@@ -1132,7 +1132,13 @@
 // cbor::AppendString8EntryToMap - for limited in-place editing of messages
 // =============================================================================
 
-TEST(AppendString8EntryToMapTest, AppendsEntrySuccessfully) {
+template <typename T>
+class AppendString8EntryToMapTest : public ::testing::Test {};
+
+using ContainerTestTypes = ::testing::Types<std::vector<uint8_t>, std::string>;
+TYPED_TEST_SUITE(AppendString8EntryToMapTest, ContainerTestTypes);
+
+TYPED_TEST(AppendString8EntryToMapTest, AppendsEntrySuccessfully) {
   constexpr uint8_t kPayloadLen = 12;
   std::vector<uint8_t> bytes = {0xd8, 0x5a, 0, 0, 0, kPayloadLen,  // envelope
                                 0xbf};                             // map start
@@ -1142,20 +1148,22 @@
   bytes.push_back(0xff);  // A perfectly fine cbor message.
   EXPECT_EQ(kPayloadLen, bytes.size() - pos_before_payload);
 
+  TypeParam msg(bytes.begin(), bytes.end());
+
   Status status =
-      AppendString8EntryToCBORMap(SpanFrom("foo"), SpanFrom("bar"), &bytes);
+      AppendString8EntryToCBORMap(SpanFrom("foo"), SpanFrom("bar"), &msg);
   EXPECT_EQ(Error::OK, status.error);
   EXPECT_EQ(-1, status.pos);
   std::string out;
   std::unique_ptr<StreamingParserHandler> json_writer =
       NewJSONEncoder(&GetTestPlatform(), &out, &status);
-  ParseCBOR(span<uint8_t>(bytes.data(), bytes.size()), json_writer.get());
+  ParseCBOR(SpanFrom(msg), json_writer.get());
   EXPECT_EQ("{\"key\":\"value\",\"foo\":\"bar\"}", out);
   EXPECT_EQ(Error::OK, status.error);
   EXPECT_EQ(-1, status.pos);
 }
 
-TEST(AppendString8EntryToMapTest, AppendThreeEntries) {
+TYPED_TEST(AppendString8EntryToMapTest, AppendThreeEntries) {
   std::vector<uint8_t> encoded = {
       0xd8, 0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop()};
   EXPECT_EQ(Error::OK, AppendString8EntryToCBORMap(SpanFrom("key"),
@@ -1167,51 +1175,53 @@
   EXPECT_EQ(Error::OK, AppendString8EntryToCBORMap(SpanFrom("key2"),
                                                    SpanFrom("value2"), &encoded)
                            .error);
-
+  TypeParam msg(encoded.begin(), encoded.end());
   std::string out;
   Status status;
   std::unique_ptr<StreamingParserHandler> json_writer =
       NewJSONEncoder(&GetTestPlatform(), &out, &status);
-  ParseCBOR(SpanFrom(encoded), json_writer.get());
+  ParseCBOR(SpanFrom(msg), json_writer.get());
   EXPECT_EQ("{\"key\":\"value\",\"key1\":\"value1\",\"key2\":\"value2\"}", out);
   EXPECT_EQ(Error::OK, status.error);
   EXPECT_EQ(-1, status.pos);
 }
 
-TEST(AppendString8EntryToMapTest, MapStartExpected_Error) {
+TYPED_TEST(AppendString8EntryToMapTest, MapStartExpected_Error) {
   std::vector<uint8_t> bytes = {
       0xd8, 0x5a, 0, 0, 0, 1, EncodeIndefiniteLengthArrayStart()};
-
+  TypeParam msg(bytes.begin(), bytes.end());
   Status status =
-      AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &bytes);
+      AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg);
   EXPECT_EQ(Error::CBOR_MAP_START_EXPECTED, status.error);
   EXPECT_EQ(6, status.pos);
 }
 
-TEST(AppendString8EntryToMapTest, MapStopExpected_Error) {
+TYPED_TEST(AppendString8EntryToMapTest, MapStopExpected_Error) {
   std::vector<uint8_t> bytes = {
       0xd8, 0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), 42};
-
+  TypeParam msg(bytes.begin(), bytes.end());
   Status status =
-      AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &bytes);
+      AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg);
   EXPECT_EQ(Error::CBOR_MAP_STOP_EXPECTED, status.error);
   EXPECT_EQ(7, status.pos);
 }
 
-TEST(AppendString8EntryToMapTest, InvalidEnvelope_Error) {
+TYPED_TEST(AppendString8EntryToMapTest, InvalidEnvelope_Error) {
   {  // Second byte is wrong.
     std::vector<uint8_t> bytes = {
         0x5a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop(), 0};
+    TypeParam msg(bytes.begin(), bytes.end());
     Status status =
-        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &bytes);
+        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg);
     EXPECT_EQ(Error::CBOR_INVALID_ENVELOPE, status.error);
     EXPECT_EQ(0, status.pos);
   }
   {  // Second byte is wrong.
     std::vector<uint8_t> bytes = {
         0xd8, 0x7a, 0, 0, 0, 2, EncodeIndefiniteLengthMapStart(), EncodeStop()};
+    TypeParam msg(bytes.begin(), bytes.end());
     Status status =
-        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &bytes);
+        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg);
     EXPECT_EQ(Error::CBOR_INVALID_ENVELOPE, status.error);
     EXPECT_EQ(0, status.pos);
   }
@@ -1219,8 +1229,9 @@
     std::vector<uint8_t> bytes = {
         0xd8, 0x5a, 0, 0, 0, 3, EncodeIndefiniteLengthMapStart(), EncodeStop(),
     };
+    TypeParam msg(bytes.begin(), bytes.end());
     Status status =
-        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &bytes);
+        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg);
     EXPECT_EQ(Error::CBOR_INVALID_ENVELOPE, status.error);
     EXPECT_EQ(0, status.pos);
   }
@@ -1228,8 +1239,9 @@
     std::vector<uint8_t> bytes = {
         0xd8, 0x5a, 0, 0, 0, 1, EncodeIndefiniteLengthMapStart(), EncodeStop(),
     };
+    TypeParam msg(bytes.begin(), bytes.end());
     Status status =
-        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &bytes);
+        AppendString8EntryToCBORMap(SpanFrom("key"), SpanFrom("value"), &msg);
     EXPECT_EQ(Error::CBOR_INVALID_ENVELOPE, status.error);
     EXPECT_EQ(0, status.pos);
   }
diff --git a/third_party/inspector_protocol/lib/encoding_cpp.template b/third_party/inspector_protocol/lib/encoding_cpp.template
index 9aa164a..f66a804 100644
--- a/third_party/inspector_protocol/lib/encoding_cpp.template
+++ b/third_party/inspector_protocol/lib/encoding_cpp.template
@@ -984,6 +984,8 @@
 Status AppendString8EntryToCBORMapTmpl(span<uint8_t> string8_key,
                                        span<uint8_t> string8_value,
                                        C* cbor) {
+  // Careful below: Don't compare (*cbor)[idx] with a uint8_t, since
+  // it could be a char (signed!). Instead, use bytes.
   span<uint8_t> bytes(reinterpret_cast<const uint8_t*>(cbor->data()),
                       cbor->size());
   CBORTokenizer tokenizer(bytes);
@@ -998,7 +1000,7 @@
   if (envelope_size == 0 ||
       (tokenizer.GetEnvelopeContents()[0] != EncodeIndefiniteLengthMapStart()))
     return Status(Error::CBOR_MAP_START_EXPECTED, kEncodedEnvelopeHeaderSize);
-  if (cbor->back() != EncodeStop())
+  if (bytes[bytes.size() - 1] != EncodeStop())
     return Status(Error::CBOR_MAP_STOP_EXPECTED, cbor->size() - 1);
   cbor->pop_back();
   EncodeString8(string8_key, cbor);