!7846 修复js_ui_extension_base未初始化session中的context问题

Merge pull request !7846 from yangzk/bugfix
This commit is contained in:
openharmony_ci
2024-03-15 02:23:57 +00:00
committed by Gitee
6 changed files with 64 additions and 54 deletions
@@ -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)
@@ -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;
@@ -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_;