[cmx][fuchsia-pkg] Parse deprecated-bare-package-url

TESTED=Added deprecated-bare-package-url to token_manager.cmx, observed
that it is being parsed. Observed that warnings are still thrown but
nothing fails.

CF-156 #comment

Change-Id: I09bc5c8c0e495c4d5229464a2a41f62353a9d633
diff --git a/bin/appmgr/realm.cc b/bin/appmgr/realm.cc
index 10d75c4..15450af 100644
--- a/bin/appmgr/realm.cc
+++ b/bin/appmgr/realm.cc
@@ -618,10 +618,15 @@
   CmxMetadata cmx;
   std::string cmx_path;
   FuchsiaPkgUrl fp;
+  bool is_fuchsia_pkg_url = false;
   if (fp.Parse(package->resolved_url.get())) {
     if (!fp.resource_path().empty()) {
       // If the url has a resource, assume that's the cmx.
       cmx_path = fp.resource_path();
+
+      // The URL is fuchsia-pkg iff it has a resource.
+      // TODO(CF-156): Remove this logic once all URLs are fuchsia-pkg.
+      is_fuchsia_pkg_url = true;
     } else {
       // It's possible the url does not have a resource, in which case either
       // the cmx exists at meta/<package_name.cmx> or it does not exist.
@@ -656,6 +661,17 @@
     return;
   }
 
+  // TODO(CF-156): Remove this logic once all URLs are fuchsia-pkg.
+  if (!is_fuchsia_pkg_url) {
+    // TODO(CF-156): If !cmx.deprecated_bare_package_url(), fail the component.
+    FXL_LOG(WARNING)
+        << "Component " << fp.GetDefaultComponentName()
+        << " was launched without using fuchsia-pkg URLs! Use "
+        << package->resolved_url << "#" << fp.GetDefaultComponentCmxPath()
+        << " instead. See https://fuchsia.googlesource.com/docs/+/master/"
+        << "glossary.md#fuchsia_pkg-url for more information.";
+  }
+
   RuntimeMetadata runtime;
   std::string runtime_parse_error;
   // If meta/*.cmx has runtime data, get it.
diff --git a/lib/cmx/cmx.cc b/lib/cmx/cmx.cc
index c27d597..ab92eff 100644
--- a/lib/cmx/cmx.cc
+++ b/lib/cmx/cmx.cc
@@ -18,6 +18,8 @@
 
 constexpr char kSandbox[] = "sandbox";
 constexpr char kProgram[] = "program";
+// TODO(CF-156): Remove this logic once all URLs are fuchsia-pkg.
+constexpr char kDeprecatedBarePackageUrl[] = "deprecated-bare-package-url";
 
 CmxMetadata::CmxMetadata() = default;
 CmxMetadata::~CmxMetadata() = default;
@@ -33,6 +35,7 @@
     json_parser->ReportError("File is not a JSON object.");
     return false;
   }
+  ParseDeprecatedBarePackageUrl(document, json_parser);
   ParseSandboxMetadata(document, json_parser);
   runtime_meta_.ParseFromDocument(document, json_parser);
   ParseProgramMetadata(document, json_parser);
@@ -40,6 +43,19 @@
   return !json_parser->HasError();
 }
 
+void CmxMetadata::ParseDeprecatedBarePackageUrl(
+    const rapidjson::Document& document, json::JSONParser* json_parser) {
+  auto package_url = document.FindMember(kDeprecatedBarePackageUrl);
+  if (package_url == document.MemberEnd()) {
+    deprecated_bare_package_url_ = false;
+  } else if (!package_url->value.IsBool()) {
+    deprecated_bare_package_url_ = false;
+    json_parser->ReportError("'deprecated-bare-package-url' is not a bool.");
+  } else {
+    deprecated_bare_package_url_ = package_url->value.GetBool();
+  }
+}
+
 const rapidjson::Value& CmxMetadata::GetFacet(const std::string& key) {
   return facet_parser_.GetSection(key);
 }
diff --git a/lib/cmx/cmx.h b/lib/cmx/cmx.h
index 289c556..577995e 100644
--- a/lib/cmx/cmx.h
+++ b/lib/cmx/cmx.h
@@ -35,6 +35,10 @@
   const RuntimeMetadata& runtime_meta() { return runtime_meta_; }
   const ProgramMetadata& program_meta() { return program_meta_; }
 
+  // True iff cmx has the deprecated-bare-package-url set to true.
+  // TODO(CF-156): Remove this logic once all URLs are fuchsia-pkg.
+  bool deprecated_bare_package_url() { return deprecated_bare_package_url_; }
+
  private:
   static std::string GetCmxPathFromPath(const std::regex& regex,
                                         const std::string& path);
@@ -43,10 +47,17 @@
   void ParseProgramMetadata(const rapidjson::Document& document,
                             json::JSONParser* json_parser);
 
+  // TODO(CF-156): Remove this logic once all URLs are fuchsia-pkg.
+  void ParseDeprecatedBarePackageUrl(const rapidjson::Document& document,
+                                     json::JSONParser* json_parser);
+
   SandboxMetadata sandbox_meta_;
   RuntimeMetadata runtime_meta_;
   ProgramMetadata program_meta_;
   CmxFacetParser facet_parser_;
+
+  // TODO(CF-156): Remove this logic once all URLs are fuchsia-pkg.
+  bool deprecated_bare_package_url_;
 };
 
 }  // namespace component
diff --git a/lib/cmx/cmx_unittest.cc b/lib/cmx/cmx_unittest.cc
index 4f234e3..3d788bb 100644
--- a/lib/cmx/cmx_unittest.cc
+++ b/lib/cmx/cmx_unittest.cc
@@ -55,6 +55,7 @@
       "services": [ "fuchsia.MyService" ]
   },
   "runner": "dart_runner",
+  "deprecated-bare-package-url": true,
   "facets": {
     "some_key": "some_value"
   },
@@ -75,6 +76,8 @@
   EXPECT_FALSE(cmx.runtime_meta().IsNull());
   EXPECT_EQ(cmx.runtime_meta().runner(), "dart_runner");
 
+  EXPECT_TRUE(cmx.deprecated_bare_package_url());
+
   const auto& some_value = cmx.GetFacet("some_key");
   ASSERT_TRUE(some_value.IsString());
   EXPECT_EQ("some_value", std::string(some_value.GetString()));
diff --git a/lib/loader/package_loader.cc b/lib/loader/package_loader.cc
index 0cfee4d..c0b9eb8 100644
--- a/lib/loader/package_loader.cc
+++ b/lib/loader/package_loader.cc
@@ -48,16 +48,6 @@
   }
 
   package.resolved_url = fuchsia_url.ToString();
-  // TODO(CF-156): Remove support for non fuchsia-pkg URLs, and get rid of this.
-  if (!FuchsiaPkgUrl::IsFuchsiaPkgScheme(url)) {
-    FXL_LOG(WARNING)
-        << "Component " << url
-        << " was launched without using fuchsia-pkg URLs! Use "
-        << package.resolved_url << "#"
-        << fuchsia_url.GetDefaultComponentCmxPath()
-        << " instead. See https://fuchsia.googlesource.com/docs/+/master/"
-        << "glossary.md#fuchsia_pkg-url for more information.";
-  }
 
   fxl::UniqueFD package_dir(
       open(fuchsia_url.pkgfs_dir_path().c_str(), O_DIRECTORY | O_RDONLY));