// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "flutter/content_handler/service_protocol_hooks.h" #include #include #include #include "flutter/common/threads.h" #include "flutter/content_handler/app.h" #include "lib/fxl/memory/weak_ptr.h" namespace flutter_runner { namespace { constexpr char kViewIdPrefx[] = "_flutterView/"; static void AppendIsolateRef(std::stringstream* stream, int64_t main_port, const std::string name) { *stream << "{\"type\":\"@Isolate\",\"fixedId\":true,\"id\":\"isolates/"; *stream << main_port << "\",\"name\":\"" << name << "\","; *stream << "\"number\":\"" << main_port << "\"}"; } static void AppendFlutterView(std::stringstream* stream, uintptr_t view_id, int64_t isolate_id, const std::string isolate_name) { *stream << "{\"type\":\"FlutterView\", \"id\": \"" << kViewIdPrefx << "0x" << std::hex << view_id << std::dec << "\""; if (isolate_id != ILLEGAL_PORT) { // Append the isolate (if it exists). *stream << "," << "\"isolate\":"; AppendIsolateRef(stream, isolate_id, isolate_name); } *stream << "}"; } } // namespace void ServiceProtocolHooks::RegisterHooks(bool running_precompiled_code) { // Listing of FlutterViews. Dart_RegisterRootServiceRequestCallback(kListViewsExtensionName, &ListViews, nullptr); } const char* ServiceProtocolHooks::kListViewsExtensionName = "_flutter.listViews"; bool ServiceProtocolHooks::ListViews(const char* method, const char** param_keys, const char** param_values, intptr_t num_params, void* user_data, const char** json_object) { // Ask the App for the list of platform views. This will run a task on // the UI thread before returning. App& app = App::Shared(); std::vector platform_views; app.WaitForPlatformViewIds(&platform_views); std::stringstream response; response << "{\"type\":\"FlutterViewList\",\"views\":["; bool prefix_comma = false; for (auto it = platform_views.begin(); it != platform_views.end(); it++) { uintptr_t view_id = it->view_id; int64_t isolate_id = it->isolate_id; const std::string& isolate_name = it->isolate_name; if (!view_id) { continue; } if (prefix_comma) { response << ','; } else { prefix_comma = true; } AppendFlutterView(&response, view_id, isolate_id, isolate_name); } response << "]}"; // Copy the response. *json_object = strdup(response.str().c_str()); return true; } } // namespace flutter_runner