mirror of
https://github.com/openharmony/ability_ability_runtime.git
synced 2026-08-25 12:23:20 -04:00
!7846 修复js_ui_extension_base未初始化session中的context问题
Merge pull request !7846 from yangzk/bugfix
This commit is contained in:
@@ -103,33 +103,6 @@ napi_value AttachUIExtensionContext(napi_env env, void *value, void *extValue)
|
||||
return contextObj;
|
||||
}
|
||||
|
||||
void AbilityResultListeners::AddListener(const uint64_t &uiExtensionComponentId,
|
||||
std::shared_ptr<AbilityResultListener> listener)
|
||||
{
|
||||
if (uiExtensionComponentId == 0) {
|
||||
HILOG_ERROR("Invalid session.");
|
||||
return;
|
||||
}
|
||||
listeners_[uiExtensionComponentId] = listener;
|
||||
}
|
||||
|
||||
void AbilityResultListeners::RemoveListener(const uint64_t &uiExtensionComponentId)
|
||||
{
|
||||
if (listeners_.find(uiExtensionComponentId) != listeners_.end()) {
|
||||
listeners_.erase(uiExtensionComponentId);
|
||||
}
|
||||
}
|
||||
|
||||
void AbilityResultListeners::OnAbilityResult(int requestCode, int resultCode, const Want &resultData)
|
||||
{
|
||||
for (auto item:listeners_) {
|
||||
if (item.second && item.second->IsMatch(requestCode)) {
|
||||
item.second->OnAbilityResult(requestCode, resultCode, resultData);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JsUIExtension* JsUIExtension::Create(const std::unique_ptr<Runtime>& runtime)
|
||||
{
|
||||
return new (std::nothrow) JsUIExtension(static_cast<JsRuntime&>(*runtime));
|
||||
|
||||
@@ -98,7 +98,9 @@ napi_value AttachUIExtensionBaseContext(napi_env env, void *value, void*)
|
||||
|
||||
JsUIExtensionBase::JsUIExtensionBase(const std::unique_ptr<Runtime> &runtime)
|
||||
: jsRuntime_(static_cast<JsRuntime&>(*runtime))
|
||||
{}
|
||||
{
|
||||
abilityResultListeners_ = std::make_shared<AbilityResultListeners>();
|
||||
}
|
||||
|
||||
JsUIExtensionBase::~JsUIExtensionBase()
|
||||
{
|
||||
@@ -449,8 +451,8 @@ bool JsUIExtensionBase::CallJsOnSessionCreate(const AAFwk::Want &want, const spt
|
||||
HILOG_ERROR("Failed to get want");
|
||||
return false;
|
||||
}
|
||||
napi_value nativeContentSession =
|
||||
JsUIExtensionContentSession::CreateJsUIExtensionContentSession(env, sessionInfo, uiWindow);
|
||||
napi_value nativeContentSession = JsUIExtensionContentSession::CreateJsUIExtensionContentSession(
|
||||
env, sessionInfo, uiWindow, context_, abilityResultListeners_);
|
||||
if (nativeContentSession == nullptr) {
|
||||
HILOG_ERROR("Failed to get contentSession");
|
||||
return false;
|
||||
@@ -568,6 +570,9 @@ void JsUIExtensionBase::DestroyWindow(const sptr<AAFwk::SessionInfo> &sessionInf
|
||||
uiWindowMap_.erase(componentId);
|
||||
foregroundWindows_.erase(componentId);
|
||||
contentSessions_.erase(componentId);
|
||||
if (abilityResultListeners_) {
|
||||
abilityResultListeners_->RemoveListener(componentId);
|
||||
}
|
||||
}
|
||||
|
||||
napi_value JsUIExtensionBase::CallObjectMethod(const char *name, napi_value const *argv, size_t argc)
|
||||
@@ -682,6 +687,11 @@ void JsUIExtensionBase::OnAbilityResult(int32_t requestCode, int32_t resultCode,
|
||||
return;
|
||||
}
|
||||
context_->OnAbilityResult(requestCode, resultCode, resultData);
|
||||
if (abilityResultListeners_ == nullptr) {
|
||||
HILOG_WARN("abilityResultListensers is nullptr");
|
||||
return;
|
||||
}
|
||||
abilityResultListeners_->OnAbilityResult(requestCode, resultCode, resultData);
|
||||
}
|
||||
|
||||
void JsUIExtensionBase::SetAbilityInfo(const std::shared_ptr<AppExecFwk::AbilityInfo> &abilityInfo)
|
||||
|
||||
+27
@@ -61,6 +61,33 @@ do {
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
void AbilityResultListeners::AddListener(const uint64_t &uiExtensionComponentId,
|
||||
std::shared_ptr<AbilityResultListener> listener)
|
||||
{
|
||||
if (uiExtensionComponentId == 0) {
|
||||
HILOG_ERROR("Invalid session.");
|
||||
return;
|
||||
}
|
||||
listeners_[uiExtensionComponentId] = listener;
|
||||
}
|
||||
|
||||
void AbilityResultListeners::RemoveListener(const uint64_t &uiExtensionComponentId)
|
||||
{
|
||||
if (listeners_.find(uiExtensionComponentId) != listeners_.end()) {
|
||||
listeners_.erase(uiExtensionComponentId);
|
||||
}
|
||||
}
|
||||
|
||||
void AbilityResultListeners::OnAbilityResult(int requestCode, int resultCode, const Want &resultData)
|
||||
{
|
||||
for (auto item:listeners_) {
|
||||
if (item.second && item.second->IsMatch(requestCode)) {
|
||||
item.second->OnAbilityResult(requestCode, resultCode, resultData);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UISessionAbilityResultListener::OnAbilityResult(int requestCode, int resultCode, const Want &resultData)
|
||||
{
|
||||
HILOG_DEBUG("begin.");
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#define OHOS_ABILITY_RUNTIME_JS_UI_EXTENSION_H
|
||||
|
||||
#include "configuration.h"
|
||||
#include "js_ui_extension_content_session.h"
|
||||
#include "ui_extension.h"
|
||||
#include <unordered_set>
|
||||
|
||||
@@ -29,27 +30,6 @@ class JsRuntime;
|
||||
/**
|
||||
* @brief Basic ui extension components.
|
||||
*/
|
||||
|
||||
|
||||
class AbilityResultListener {
|
||||
public:
|
||||
AbilityResultListener() = default;
|
||||
virtual ~AbilityResultListener() = default;
|
||||
virtual void OnAbilityResult(int requestCode, int resultCode, const Want &resultData) = 0;
|
||||
virtual bool IsMatch(int requestCode) = 0;
|
||||
};
|
||||
|
||||
class AbilityResultListeners {
|
||||
public:
|
||||
AbilityResultListeners() = default;
|
||||
virtual ~AbilityResultListeners() = default;
|
||||
void AddListener(const uint64_t &uiExtensionComponentId, std::shared_ptr<AbilityResultListener> listener);
|
||||
void RemoveListener(const uint64_t &uiExtensionComponentId);
|
||||
void OnAbilityResult(int requestCode, int resultCode, const Want &resultData);
|
||||
private:
|
||||
std::map<uint64_t, std::shared_ptr<AbilityResultListener>> listeners_;
|
||||
};
|
||||
|
||||
class JsUIExtension : public UIExtension {
|
||||
public:
|
||||
explicit JsUIExtension(JsRuntime& jsRuntime);
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "ability_local_record.h"
|
||||
#include "configuration.h"
|
||||
#include "js_extension_common.h"
|
||||
#include "js_ui_extension_content_session.h"
|
||||
#include "native_engine/native_engine.h"
|
||||
#include "ohos_application.h"
|
||||
#include "session_info.h"
|
||||
@@ -170,6 +171,7 @@ private:
|
||||
std::map<uint64_t, sptr<Rosen::Window>> uiWindowMap_;
|
||||
std::set<uint64_t> foregroundWindows_;
|
||||
std::map<uint64_t, std::shared_ptr<NativeReference>> contentSessions_;
|
||||
std::shared_ptr<AbilityResultListeners> abilityResultListeners_ = nullptr;
|
||||
std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo_;
|
||||
std::shared_ptr<UIExtensionContext> context_;
|
||||
sptr<IRemoteObject> token_ = nullptr;
|
||||
|
||||
+21
-3
@@ -19,7 +19,6 @@
|
||||
#include "native_engine/native_engine.h"
|
||||
#include "js_free_install_observer.h"
|
||||
#include "js_runtime_utils.h"
|
||||
#include "js_ui_extension.h"
|
||||
#include "session_info.h"
|
||||
#include "start_options.h"
|
||||
#include "window.h"
|
||||
@@ -28,13 +27,32 @@ namespace OHOS {
|
||||
namespace AbilityRuntime {
|
||||
using RuntimeTask = std::function<void(int, const AAFwk::Want&, bool)>;
|
||||
|
||||
class AbilityResultListener {
|
||||
public:
|
||||
AbilityResultListener() = default;
|
||||
virtual ~AbilityResultListener() = default;
|
||||
virtual void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData) = 0;
|
||||
virtual bool IsMatch(int requestCode) = 0;
|
||||
};
|
||||
|
||||
class AbilityResultListeners {
|
||||
public:
|
||||
AbilityResultListeners() = default;
|
||||
virtual ~AbilityResultListeners() = default;
|
||||
void AddListener(const uint64_t &uiExtensionComponentId, std::shared_ptr<AbilityResultListener> listener);
|
||||
void RemoveListener(const uint64_t &uiExtensionComponentId);
|
||||
void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData);
|
||||
private:
|
||||
std::map<uint64_t, std::shared_ptr<AbilityResultListener>> listeners_;
|
||||
};
|
||||
|
||||
class UISessionAbilityResultListener : public AbilityResultListener {
|
||||
public:
|
||||
UISessionAbilityResultListener() = default;
|
||||
virtual ~UISessionAbilityResultListener() = default;
|
||||
virtual void OnAbilityResult(int requestCode, int resultCode, const Want &resultData);
|
||||
virtual void OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want &resultData);
|
||||
virtual bool IsMatch(int requestCode);
|
||||
void OnAbilityResultInner(int requestCode, int resultCode, const Want &resultData);
|
||||
void OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want &resultData);
|
||||
void SaveResultCallbacks(int requestCode, RuntimeTask&& task);
|
||||
private:
|
||||
std::map<int, RuntimeTask> resultCallbacks_;
|
||||
|
||||
Reference in New Issue
Block a user