flutter_flutter/runtime/runtime_controller.h
Ian McKellar d917c35e72
Allow Flutter apps on Fuchsia to shut down cleanly (#4366)
The UIDartState is now always owned by the isolate and always freed in
the isolate cleanup callback.

In the isolate shutdown callback, if the isolate being shut down is the
main isolate, the RuntimeController is informed which in turn notifies
the RuntimeHolder and thus the ApplicationControllerImpl. The
ApplicationControllerImpl tears down the whole Flutter application.

This fixes Fuchsia bug: MI4-328
2017-11-15 13:28:21 -08:00

79 lines
2.5 KiB
C++

// Copyright 2015 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.
#ifndef FLUTTER_RUNTIME_RUNTIME_CONTROLLER_H_
#define FLUTTER_RUNTIME_RUNTIME_CONTROLLER_H_
#include <memory>
#include "flutter/flow/layers/layer_tree.h"
#include "flutter/lib/ui/ui_dart_state.h"
#include "flutter/lib/ui/window/pointer_data_packet.h"
#include "flutter/lib/ui/window/window.h"
#include "lib/fxl/macros.h"
namespace blink {
class DartController;
class DartLibraryProvider;
class Scene;
class RuntimeDelegate;
class View;
class Window;
class RuntimeController : public WindowClient, public IsolateClient {
public:
static std::unique_ptr<RuntimeController> Create(RuntimeDelegate* client);
~RuntimeController();
void CreateDartController(const std::string& script_uri,
const uint8_t* isolate_snapshot_data,
const uint8_t* isolate_snapshot_instr);
DartController* dart_controller() const { return dart_controller_.get(); }
void SetViewportMetrics(const ViewportMetrics& metrics);
void SetLocale(const std::string& language_code,
const std::string& country_code);
void SetUserSettingsData(const std::string& data);
void SetSemanticsEnabled(bool enabled);
void BeginFrame(fxl::TimePoint frame_time);
void NotifyIdle(int64_t deadline);
void DispatchPlatformMessage(fxl::RefPtr<PlatformMessage> message);
void DispatchPointerDataPacket(const PointerDataPacket& packet);
void DispatchSemanticsAction(int32_t id, SemanticsAction action);
Dart_Port GetMainPort();
std::string GetIsolateName();
bool HasLivePorts();
tonic::DartErrorHandleType GetLastError();
private:
explicit RuntimeController(RuntimeDelegate* client);
Window* GetWindow();
std::string DefaultRouteName() override;
void ScheduleFrame() override;
void Render(Scene* scene) override;
void UpdateSemantics(SemanticsUpdate* update) override;
void HandlePlatformMessage(fxl::RefPtr<PlatformMessage> message) override;
void DidCreateSecondaryIsolate(Dart_Isolate isolate) override;
void DidShutdownMainIsolate() override;
RuntimeDelegate* client_;
std::string language_code_;
std::string country_code_;
std::string user_settings_data_ = "{}";
bool semantics_enabled_ = false;
std::unique_ptr<DartController> dart_controller_;
FXL_DISALLOW_COPY_AND_ASSIGN(RuntimeController);
};
} // namespace blink
#endif // FLUTTER_RUNTIME_RUNTIME_CONTROLLER_H_