Squashed 'third_party/autocxx/' content from commit 629e8fa53

git-subtree-dir: third_party/autocxx
git-subtree-split: 629e8fa531a633164c0b52e2a3cab536d4cd0849
Signed-off-by: Brian Silverman <bsilver16384@gmail.com>
Change-Id: I62a03b0049f49adf029e0204639cdb5468dde1a1
diff --git a/examples/chromium-fake-render-frame-host/src/fake-chromium-src.cc b/examples/chromium-fake-render-frame-host/src/fake-chromium-src.cc
new file mode 100644
index 0000000..2f9a9d4
--- /dev/null
+++ b/examples/chromium-fake-render-frame-host/src/fake-chromium-src.cc
@@ -0,0 +1,81 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#include "fake-chromium-header.h"
+#include <map>
+#include <algorithm>
+
+using namespace content;
+
+// This is all appalling. None of this is real Chromium code.
+// It's just designed to be the bare minimum required
+// to knock together a quick Rust-side demo. In some future realities, all
+// this is replaced with real Chromium code.
+
+int latest_rfh_id = 0;
+std::map<int, RenderFrameHost *> render_frame_hosts;
+WebContentsImpl *the_only_web_contents; // for this daft demo
+
+CreateParams::CreateParams(const std::string &main_frame_name)
+    : main_frame_name_(main_frame_name) {}
+
+RenderFrameHost *RenderFrameHost::FromId(int, int frame_id) {
+  return render_frame_hosts.at(frame_id);
+}
+
+class RenderFrameHostImpl : public RenderFrameHost {
+public:
+  RenderFrameHostImpl(const std::string name, int routing_id)
+      : routing_id_(routing_id), name_(name) {}
+  virtual int GetRoutingID() { return routing_id_; }
+  virtual std::string GetFrameName() { return name_; }
+
+private:
+  int routing_id_;
+  std::string name_;
+};
+
+std::unique_ptr<WebContents> WebContents::Create(const CreateParams &params) {
+  auto wc = std::make_unique<WebContentsImpl>(params);
+  the_only_web_contents = wc.get();
+  return wc;
+}
+
+WebContentsImpl::WebContentsImpl(const CreateParams &params)
+    : title_(params.main_frame_name_) {
+  int id = latest_rfh_id++;
+  std::unique_ptr<RenderFrameHost> new_rfh(
+      new RenderFrameHostImpl(params.main_frame_name_, id));
+  render_frame_hosts.insert(
+      std::pair<int, RenderFrameHost *>(id, new_rfh.get()));
+  for (auto obs : observers_) {
+    obs->RenderFrameCreated(new_rfh.get());
+  }
+  rfhs_.push_back(std::move(new_rfh));
+}
+
+void WebContentsImpl::AddObserver(WebContentsObserver *observer) {
+  observers_.push_back(observer);
+}
+void WebContentsImpl::RemoveObserver(WebContentsObserver *observer) {
+  std::remove(std::begin(observers_), std::end(observers_), observer);
+}
+
+void WebContentsImpl::DeleteRFH() {
+  for (auto obs : observers_) {
+    obs->RenderFrameDeleted(rfhs_[0].get());
+  }
+  rfhs_.clear();
+}
+
+const std::string &WebContentsImpl::GetTitle() { return title_; }
+
+void SimulateRendererShutdown(int frame_id) {
+  render_frame_hosts.erase(frame_id);
+  the_only_web_contents->DeleteRFH();
+}