Merge branch 'tizen_4.0' into tizen_5.0 45/219745/1
authorPiotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Mon, 9 Dec 2019 13:07:54 +0000 (14:07 +0100)
committerPiotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics <p.kosko@samsung.com>
Mon, 9 Dec 2019 13:07:54 +0000 (14:07 +0100)
Change-Id: Ib491adc102418f59ef279fc47d45a7ef3f867569

1  2 
packaging/webapi-plugins.spec
src/messageport/messageport_api.js
src/messageport/messageport_instance.cc

@@@ -8,7 -8,7 +8,7 @@@
  %define crosswalk_extensions_path %{_libdir}/%{crosswalk_extensions}
  
  Name:       webapi-plugins
- Version:    2.44
 -Version:    2.40
++Version:    2.45
  Release:    0
  License:    Apache-2.0 and BSD-3-Clause and MIT
  Group:      Development/Libraries
@@@ -30,7 -30,6 +30,7 @@@ Source0:    %{name}-%{version}.tar.g
  %define tizen_common_feature_bluetooth_support               1
  %define tizen_common_feature_bookmark_support                0
  %define tizen_common_feature_calendar_support                0
 +%define tizen_common_feature_callhistory_support             0
  %define tizen_common_feature_contact_support                 0
  %define tizen_common_feature_content_support                 1
  %define tizen_common_feature_datacontrol_support             0
  %define tizen_common_feature_filesystem_support              1
  %define tizen_common_feature_fm_radio_support                0
  %define tizen_common_feature_ham_support                     0
 +%define tizen_common_feature_inputdevice_support             0
  %define tizen_common_feature_iotcon_support                  0
 -%define tizen_common_feature_location_batch                  0
  %define tizen_common_feature_key_manager_support             0
 +%define tizen_common_feature_location_batch                  0
  %define tizen_common_feature_media_controller_support        0
  %define tizen_common_feature_media_key_support               0
  %define tizen_common_feature_message_port_support            1
  %define tizen_common_feature_messaging_support               0
 -%define tizen_common_feature_nfc_emulation_support           0
 +%define tizen_common_feature_nbs_support                     0
  %define tizen_common_feature_nfc_support                     0
 +%define tizen_common_feature_nfc_emulation_support           0
  %define tizen_common_feature_notification_support            0
  %define tizen_common_feature_package_support                 1
  %define tizen_common_feature_player_util_support             0
  %define tizen_common_feature_power_support                   0
 +%define tizen_common_feature_ppm_support                     0
  %define tizen_common_feature_preference_support              0
  %define tizen_common_feature_push_support                    0
  %define tizen_common_feature_se_support                      0
  %define tizen_common_feature_system_setting_support          0
  %define tizen_common_feature_telephony_support               0
  %define tizen_common_feature_time_support                    1
 -%define tizen_common_feature_web_setting_support             0
 -%define tizen_common_feature_widget_service_support          0
 -%define tizen_common_feature_wi_fi_support                   1
 -%define tizen_common_feature_inputdevice_support             0
 -%define tizen_common_feature_callhistory_support             0
 -%define tizen_common_feature_nbs_support                     0
  %define tizen_common_feature_tvinputdevice_support           0
  %define tizen_common_feature_voicecontrol_support            0
 -%define tizen_common_feature_ppm_support                     0
 -
 +%define tizen_common_feature_web_setting_support             0
 +%define tizen_common_feature_wi_fi_support                   1
 +%define tizen_common_feature_widget_service_support          0
  
  ####################################################################
  #       Mobile Profile :  TM1(32bit), Redwood(SM-Z910F), KIRAN(Z130H)          #
  %endif
  
  %define tizen_mobile_feature_ham_support                     0
 -
 +%define tizen_mobile_feature_inputdevice_support             1
  %define tizen_mobile_feature_iotcon_support                  1
 -%define tizen_mobile_feature_location_batch                  0
  %define tizen_mobile_feature_key_manager_support             1
 +%define tizen_mobile_feature_location_batch                  0
  %define tizen_mobile_feature_media_controller_support        1
 -
  %define tizen_mobile_feature_media_key_support               1
 -
  %define tizen_mobile_feature_message_port_support            1
  %define tizen_mobile_feature_messaging_support               1
 -
 -%define tizen_mobile_feature_nfc_emulation_support           0
  %define tizen_mobile_feature_nfc_support                     0
 -
 +%define tizen_mobile_feature_nfc_emulation_support           0
  %define tizen_mobile_feature_notification_support            1
  %define tizen_mobile_feature_package_support                 1
  %define tizen_mobile_feature_player_util_support             1
  %define tizen_mobile_feature_power_support                   1
 +%define tizen_mobile_feature_ppm_support                     1
  %define tizen_mobile_feature_preference_support              1
  %define tizen_mobile_feature_push_support                    1
  
  %endif
  
  %define tizen_mobile_feature_time_support                    1
 +%define tizen_mobile_feature_tvinputdevice_support           0
 +%define tizen_mobile_feature_voicecontrol_support            1
  %define tizen_mobile_feature_web_setting_support             1
 +%define tizen_mobile_feature_wi_fi_support                   1
  %define tizen_mobile_feature_widget_service_support          1
  
 -%define tizen_mobile_feature_wi_fi_support                   1
 +## Mobile emulator
  
 -%define tizen_mobile_feature_inputdevice_support             1
 +%define tizen_mobile_emulator_feature_bluetooth_support      0
  
 -%define tizen_mobile_feature_tvinputdevice_support           0
 +# FM radio feature
 +%define tizen_mobile_emulator_feature_fm_radio_support       1
  
 -%define tizen_mobile_feature_voicecontrol_support            1
 -%define tizen_mobile_feature_ppm_support                     1
 +%define tizen_mobile_emulator_feature_ham_support            1
 +%define tizen_mobile_emulator_feature_media_key_support      0
 +%define tizen_mobile_emulator_feature_nfc_support            1
 +%define tizen_mobile_emulator_feature_nfc_emulation_support  0
 +
 +# secure element feature
 +%define tizen_mobile_emulator_feature_se_support             0
 +
 +# telephony feature
 +%define tizen_mobile_emulator_feature_telephony_support      1
 +%define tizen_mobile_emulator_feature_callhistory_support    1
 +%define tizen_mobile_emulator_feature_nbs_support            1
 +
 +%define tizen_mobile_emulator_feature_wi_fi_support          0
  
  ####################################################################
  #       Wearable Profile :  B2 / TW2                      #
  %define tizen_wearable_feature_filesystem_support              1
  %define tizen_wearable_feature_fm_radio_support                0
  %define tizen_wearable_feature_ham_support                     1
 +%define tizen_wearable_feature_inputdevice_support             1
  %define tizen_wearable_feature_iotcon_support                  1
 +%define tizen_wearable_feature_key_manager_support             1
  %define tizen_wearable_feature_location_batch                  0
  %define tizen_wearable_feature_media_controller_support        1
  
  # MediayKey API is optional in Tizen Wearable Profile.
  # tizen.org/feature/network.bluetooth.audio.media is required for MediayKey API
  %define tizen_wearable_feature_media_key_support               1
 -%define tizen_wearable_feature_key_manager_support             1
  %define tizen_wearable_feature_message_port_support            1
  %define tizen_wearable_feature_messaging_support               0
 -%define tizen_wearable_feature_nfc_emulation_support           0
  %define tizen_wearable_feature_nfc_support                     1
 +%define tizen_wearable_feature_nfc_emulation_support           0
  %define tizen_wearable_feature_notification_support            1
  %define tizen_wearable_feature_package_support                 1
  %define tizen_wearable_feature_player_util_support             1
  %define tizen_wearable_feature_power_support                   1
 +%define tizen_wearable_feature_ppm_support                     1
  %define tizen_wearable_feature_preference_support              1
  %define tizen_wearable_feature_push_support                    1
  %define tizen_wearable_feature_se_support                      1
  %define tizen_wearable_feature_nbs_support                     0
  
  %define tizen_wearable_feature_time_support                    1
 +%define tizen_wearable_feature_tvinputdevice_support           0
 +%define tizen_wearable_feature_voicecontrol_support            1
  %define tizen_wearable_feature_web_setting_support             0
 -%define tizen_wearable_feature_widget_service_support          1
  %define tizen_wearable_feature_wi_fi_support                   1
 -%define tizen_wearable_feature_inputdevice_support             1
 -%define tizen_wearable_feature_tvinputdevice_support           0
 +%define tizen_wearable_feature_widget_service_support          1
  
 -%define tizen_wearable_feature_voicecontrol_support            1
 -%define tizen_wearable_feature_ppm_support                     1
 +## Wearable emulator
 +
 +%define tizen_wearable_emulator_feature_bluetooth_support      0
 +
 +# MediayKey API is optional in Tizen Wearable Profile.
 +# tizen.org/feature/network.bluetooth.audio.media is required for MediayKey API
 +%define tizen_wearable_emulator_feature_media_key_support      0
 +
 +#- telephony related APIs
 +# CallHistory API is optional in Tizen Wearable Profile.
 +# NetworkBearerSelection API is optional in Tizen Wearable Profile.
 +%define tizen_wearable_emulator_feature_telephony_support      1
 +%define tizen_wearable_emulator_feature_callhistory_support    1
 +%define tizen_wearable_emulator_feature_nbs_support            1
  
 +%define tizen_wearable_emulator_feature_se_support             0
 +%define tizen_wearable_emulator_feature_sensor_support         1
  
  ####################################################################
  #       TV Profile                                                 #
  
  %define tizen_tv_privilege_engine                        CYNARA
  
 -%define tizen_tv_feature_account_support                 0
 +%define tizen_tv_feature_account_support                 1
  %define tizen_tv_feature_alarm_support                   1
  %define tizen_tv_feature_app_control_settings_support    0
  %define tizen_tv_feature_application_support             1
  %define tizen_tv_feature_filesystem_support              1
  %define tizen_tv_feature_fm_radio_support                0
  %define tizen_tv_feature_ham_support                     0
 +%define tizen_tv_feature_inputdevice_support             0
  %define tizen_tv_feature_iotcon_support                  1
  %define tizen_tv_feature_key_manager_support             1
 -%define tizen_tv_feature_media_controller_support        0
 +%define tizen_tv_feature_media_controller_support        1
  %define tizen_tv_feature_media_key_support               0
  %define tizen_tv_feature_message_port_support            1
  %define tizen_tv_feature_messaging_support               0
  %define tizen_tv_feature_nbs_support                     0
 -%define tizen_tv_feature_nfc_emulation_support           0
  %define tizen_tv_feature_nfc_support                     0
 +%define tizen_tv_feature_nfc_emulation_support           0
  %define tizen_tv_feature_notification_support            0
  %define tizen_tv_feature_package_support                 1
  %define tizen_tv_feature_player_util_support             0
  %define tizen_tv_feature_power_support                   0
 +%define tizen_tv_feature_ppm_support                     0
  %define tizen_tv_feature_preference_support              0
  %define tizen_tv_feature_push_support                    1
  %define tizen_tv_feature_se_support                      0
  %define tizen_tv_feature_system_setting_support          0
  %define tizen_tv_feature_telephony_support               0
  %define tizen_tv_feature_time_support                    1
 -%define tizen_tv_feature_web_setting_support             1
 -%define tizen_tv_feature_widget_service_support          0
 -%define tizen_tv_feature_wi_fi_support                   1
 -%define tizen_tv_feature_inputdevice_support             0
  %define tizen_tv_feature_tvinputdevice_support           1
  %define tizen_tv_feature_voicecontrol_support            1
 -%define tizen_tv_feature_ppm_support                     0
 +%define tizen_tv_feature_web_setting_support             1
 +%define tizen_tv_feature_wi_fi_support                   1
 +%define tizen_tv_feature_widget_service_support          0
  
  # common, or "unified (undefined)"
  %define unified_build   1
@@@ -481,7 -453,7 +481,7 @@@ BuildRequires: pkgconfig(capi-data-cont
  BuildRequires: pkgconfig(capi-web-url-download)
  %endif
  
 -%if "%{?tizen_feature_ham_support}" == "1" || "%{?unified_build}" == "1"
 +%if "%{?tizen_feature_ham_support}" == "1" || "%{?unified_build}" == "1" || "%{?tizen_mobile_emulator_feature_ham_support}" == "1"
  BuildRequires: pkgconfig(motion)
  BuildRequires: pkgconfig(capi-system-sensor)
  BuildRequires: pkgconfig(capi-location-manager)
@@@ -518,6 -490,7 +518,6 @@@ BuildRequires:  pkgconfig(ecore-file
  BuildRequires:  pkgconfig(email-service)
  BuildRequires:  pkgconfig(msg-service)
  BuildRequires:  pkgconfig(db-util)
 -BuildRequires:  pkgconfig(dbus-glib-1)
  %endif
  
  %if "%{?tizen_feature_badge_support}" == "1" || "%{?unified_build}" == "1"
@@@ -532,7 -505,7 +532,7 @@@ BuildRequires:  pkgconfig(calendar-serv
  BuildRequires:  pkgconfig(contacts-service2)
  %endif
  
 -%if "%{?tizen_feature_callhistory_support}" == "1" || "%{?unified_build}" == "1"
 +%if "%{?tizen_feature_callhistory_support}" == "1" || "%{?unified_build}" == "1" || "%{?tizen_mobile_emulator_feature_callhistory_support}" == "1" || "%{?tizen_wearable_emulator_feature_callhistory_support}" == "1"
  BuildRequires:  pkgconfig(contacts-service2)
  %endif
  
  BuildRequires:  pkgconfig(libexif)
  %endif
  
 -%if "%{?tizen_feature_nfc_support}" == "1" || "%{?unified_build}" == "1"
 +%if "%{?tizen_feature_nfc_support}" == "1" || "%{?unified_build}" == "1" || "%{?tizen_mobile_emulator_feature_nfc_support}" == "1"
  BuildRequires:  pkgconfig(capi-network-nfc)
  BuildRequires:  pkgconfig(capi-appfw-app-control)
  %endif
  
 -%if "%{?tizen_feature_fm_radio_support}" == "1" || "%{?unified_build}" == "1"
 +%if "%{?tizen_feature_fm_radio_support}" == "1" || "%{?unified_build}" == "1" || "%{?tizen_mobile_emulator_feature_fm_radio_support}" == "1"
  BuildRequires: pkgconfig(capi-media-radio)
  %endif
  
@@@ -574,7 -547,7 +574,7 @@@ BuildRequires: pkgconfig(capi-appfw-pre
  BuildRequires:  pkgconfig(capi-media-sound-manager)
  %endif
  
 -%if "%{?tizen_feature_sensor_support}" == "1" || "%{?unified_build}" == "1"
 +%if "%{?tizen_feature_sensor_support}" == "1" || "%{?unified_build}" == "1" || "%{?tizen_wearable_emulator_feature_sensor_support}" == "1"
  BuildRequires: pkgconfig(capi-system-sensor)
  %endif
  
@@@ -747,30 -720,33 +747,30 @@@ GYP_OPTIONS="$GYP_OPTIONS -Dtizen_featu
  ninja -C out/Default %{?_smp_mflags}
  pushd out
  mv Default bin_mobile
 -%if "%{?profile}" == "mobile"
 -ln -sf bin_mobile Default
 -%endif
  popd
  
  # mobile-extension-emulator
  %ifarch %{ix86} x86_64
  
 -%define tizen_mobile_feature_bluetooth_support               0
 +%define tizen_mobile_feature_bluetooth_support               %{?tizen_mobile_emulator_feature_bluetooth_support}
  
  # FM radio feature
 -%define tizen_mobile_feature_fm_radio_support                1
 +%define tizen_mobile_feature_fm_radio_support                %{?tizen_mobile_emulator_feature_fm_radio_support}
  
 -%define tizen_mobile_feature_ham_support                     1
 -%define tizen_mobile_feature_media_key_support               0
 -%define tizen_mobile_feature_nfc_emulation_support           0
 -%define tizen_mobile_feature_nfc_support                     1
 +%define tizen_mobile_feature_ham_support                     %{?tizen_mobile_emulator_feature_ham_support}
 +%define tizen_mobile_feature_media_key_support               %{?tizen_mobile_emulator_feature_media_key_support}
 +%define tizen_mobile_feature_nfc_emulation_support           %{?tizen_mobile_emulator_feature_nfc_emulation_support}
 +%define tizen_mobile_feature_nfc_support                     %{?tizen_mobile_emulator_feature_nfc_support}
  
  # secure element feature
 -%define tizen_mobile_feature_se_support                      0
 +%define tizen_mobile_feature_se_support                      %{?tizen_mobile_emulator_feature_se_support}
  
  # telephony feature
 -%define tizen_mobile_feature_telephony_support               1
 -%define tizen_mobile_feature_callhistory_support             1
 -%define tizen_mobile_feature_nbs_support                     1
 +%define tizen_mobile_feature_telephony_support               %{?tizen_mobile_emulator_feature_telephony_support}
 +%define tizen_mobile_feature_callhistory_support             %{?tizen_mobile_emulator_feature_callhistory_support}
 +%define tizen_mobile_feature_nbs_support                     %{?tizen_mobile_emulator_feature_nbs_support}
  
 -%define tizen_mobile_feature_wi_fi_support                   0
 +%define tizen_mobile_feature_wi_fi_support                   %{?tizen_mobile_emulator_feature_wi_fi_support}
  
  GYP_OPTIONS="--depth=. -Dtizen=1 -Dextension_build_type=Debug -Dextension_host_os=mobile -Dprivilege_engine=%{tizen_mobile_privilege_engine}"
  GYP_OPTIONS="$GYP_OPTIONS -Ddisplay_type=%{display_type}"
@@@ -834,15 -810,11 +834,15 @@@ GYP_OPTIONS="$GYP_OPTIONS -Dtizen_featu
  ninja -C out/Default %{?_smp_mflags}
  pushd out
  mv Default bin_mobile_emulator
 +popd
 +%endif # mobile-extension-emulator
 +
 +pushd out
  %if "%{?profile}" == "mobile"
 -ln -sf bin_mobile_emulator Default
 +ln -sf bin_mobile Default
  %endif
  popd
 -%endif # mobile-extension-emulator
 +
  %endif # MOBILE
  
  %if "%{?unified_build}" == "1" || "%{?profile}" == "wearable"
@@@ -909,25 -881,28 +909,25 @@@ GYP_OPTIONS="$GYP_OPTIONS -Dtizen_featu
  ninja -C out/Default %{?_smp_mflags}
  pushd out
  mv Default bin_wearable
 -%if "%{?profile}" == "wearable"
 -ln -sf bin_wearable Default
 -%endif
  popd
  
  # wearable-extension-emulator
  %ifarch %{ix86} x86_64
  
 -%define tizen_wearable_feature_bluetooth_support             0
 +%define tizen_wearable_feature_bluetooth_support             %{?tizen_wearable_emulator_feature_bluetooth_support}
  
  # MediayKey API is optional in Tizen Wearable Profile.
  # tizen.org/feature/network.bluetooth.audio.media is required for MediayKey API
 -%define tizen_wearable_feature_media_key_support             0
 +%define tizen_wearable_feature_media_key_support             %{?tizen_wearable_emulator_feature_media_key_support}
  
  #- telephony related APIs
  # CallHistory API is optional in Tizen Wearable Profile.
  # NetworkBearerSelection API is optional in Tizen Wearable Profile.
 -%define tizen_wearable_feature_se_support                    0
 -%define tizen_wearable_feature_telephony_support             1
 -%define tizen_wearable_feature_callhistory_support           1
 -%define tizen_wearable_feature_nbs_support                   1
 -%define tizen_wearable_feature_sensor_support                1
 +%define tizen_wearable_feature_se_support                    %{?tizen_wearable_emulator_feature_se_support}
 +%define tizen_wearable_feature_telephony_support             %{?tizen_wearable_emulator_feature_telephony_support}
 +%define tizen_wearable_feature_callhistory_support           %{?tizen_wearable_emulator_feature_callhistory_support}
 +%define tizen_wearable_feature_nbs_support                   %{?tizen_wearable_emulator_feature_nbs_support}
 +%define tizen_wearable_feature_sensor_support                %{?tizen_wearable_emulator_feature_sensor_support}
  
  GYP_OPTIONS="--depth=. -Dtizen=1 -Dextension_build_type=Debug -Dextension_host_os=wearable -Dprivilege_engine=%{tizen_wearable_privilege_engine}"
  GYP_OPTIONS="$GYP_OPTIONS -Ddisplay_type=%{display_type}"
@@@ -991,15 -966,11 +991,15 @@@ GYP_OPTIONS="$GYP_OPTIONS -Dtizen_featu
  ninja -C out/Default %{?_smp_mflags}
  pushd out
  mv Default bin_wearable_emulator
 +popd
 +%endif # wearable-extension-emulator
 +
 +pushd out
  %if "%{?profile}" == "wearable"
 -ln -sf bin_wearable_emulator Default
 +ln -sf bin_wearable Default
  %endif
  popd
 -%endif # wearable-extension-emulator
 +
  %endif # WEARABLE
  
  %if "%{?unified_build}" == "1" || "%{?profile}" == "tv"
   *    limitations under the License.
   */
  
 -var JSON_ = xwalk.JSON;
  var validator_ = xwalk.utils.validator;
  var types_ = validator_.Types;
  var type_ = xwalk.utils.type;
  var converter_ = xwalk.utils.converter;
 -var privUtils_ = xwalk.utils;
 +var native_ = new xwalk.utils.NativeManager(extension);
 +
 +var LOCAL_MESSAGE_PORT_LISTENER_ID = 'LocalMessagePortListener';
  
  var callbackId = 0;
  var callbacks = {};
  var ports = [];
  
 -extension.setMessageListener(function(json) {
 -    var msg = JSON_.parse(json);
 -    var listeners = callbacks[msg['local_port_id']];
 +function MessagePortChangeCallback(msg) {
 +    var listeners = callbacks[msg['localPortId']];
      var rmp;
  
 -    privUtils_.log('Listeners length:' + listeners.length);
 -
      if (!msg.hasOwnProperty('remotePort')) rmp = null;
      else rmp = new RemoteMessagePort(msg.remotePort, msg.remoteAppId, msg.trusted);
      for (var i = 0; i < listeners.length; i++) {
-         var func = listeners[i][0];
-         setTimeout(function() {
-             func(msg.message, rmp);
-         }, 0);
+         setTimeout(
+             function(f) {
+                 f(msg.message, rmp);
+             }.bind(null, listeners[i][0]),
+             0
+         );
      }
 -});
 +}
  
  function nextCallbackId() {
      return callbackId++;
  }
  
 -var ExceptionMap = {
 -    UnknownError: WebAPIException.UNKNOWN_ERR,
 -    TypeMismatchError: WebAPIException.TYPE_MISMATCH_ERR,
 -    InvalidValuesError: WebAPIException.INVALID_VALUES_ERR,
 -    IOError: WebAPIException.IO_ERR,
 -    ServiceNotAvailableError: WebAPIException.SERVICE_NOT_AVAILABLE_ERR,
 -    SecurityError: WebAPIException.SECURITY_ERR,
 -    NetworkError: WebAPIException.NETWORK_ERR,
 -    NotSupportedError: WebAPIException.NOT_SUPPORTED_ERR,
 -    NotFoundError: WebAPIException.NOT_FOUND_ERR,
 -    InvalidAccessError: WebAPIException.INVALID_ACCESS_ERR,
 -    AbortError: WebAPIException.ABORT_ERR,
 -    QuotaExceededError: WebAPIException.QUOTA_EXCEEDED_ERR
 -};
 -
 -function callNative(cmd, args) {
 -    var json = { cmd: cmd, args: args };
 -    var argjson = JSON_.stringify(json);
 -    var resultString = extension.internal.sendSyncMessage(argjson);
 -    var result = JSON_.parse(resultString);
 -
 -    if (typeof result !== 'object') {
 -        throw new WebAPIException(WebAPIException.UNKNOWN_ERR);
 -    }
 -
 -    if (result['status'] == 'success') {
 -        if (result['result']) {
 -            return result['result'];
 -        }
 -        return true;
 -    } else if (result['status'] == 'error') {
 -        var err = result['error'];
 -        if (err) {
 -            if (ExceptionMap[err.name]) {
 -                throw new WebAPIException(ExceptionMap[err.name], err.message);
 -            } else {
 -                throw new WebAPIException(WebAPIException.UNKNOWN_ERR, err.message);
 -            }
 -        }
 -        return false;
 -    }
 -}
 -
 -function callNativeWithCallback(cmd, args, callback) {
 -    if (callback) {
 -        var id = nextCallbackId();
 -        args['callbackId'] = id;
 -        callbacks[id] = callback;
 -    }
 -
 -    return callNative(cmd, args);
 -}
 -
 -function SetReadOnlyProperty(obj, n, v) {
 -    Object.defineProperty(obj, n, { value: v, writable: false });
 -}
 -
  function MessagePortManager() {
      // constructor of MessagePortManager
  }
@@@ -60,22 -121,22 +62,22 @@@ MessagePortManager.prototype.requestLoc
          );
      }
  
 -    var localPortId;
 +    var localPortId; // TODO remove
      var nativeParam = {
          localMessagePortName: args.localMessagePortName
      };
  
 -    try {
 -        localPortId = callNative(
 -            'MessagePortManager_requestLocalMessagePort',
 -            nativeParam
 -        );
 -    } catch (e) {
 -        throw e;
 -    }
 +    var result = native_.callSync(
 +        'MessagePortManager_requestLocalMessagePort',
 +        nativeParam
 +    );
  
 -    var returnObject = new LocalMessagePort(args.localMessagePortName, false);
 -    ports[nativeParam.localMessagePortName] = localPortId;
 +    if (native_.isSuccess(result)) {
 +        var returnObject = new LocalMessagePort(args.localMessagePortName, false);
 +        ports[nativeParam.localMessagePortName] = native_.getResultObject(result);
 +    } else {
 +        throw native_.getErrorObject(result);
 +    }
  
      return returnObject;
  };
@@@ -98,17 -159,17 +100,17 @@@ MessagePortManager.prototype.requestTru
          localMessagePortName: args.localMessagePortName
      };
  
 -    try {
 -        var localPortId = callNative(
 -            'MessagePortManager_requestTrustedLocalMessagePort',
 -            nativeParam
 -        );
 -    } catch (e) {
 -        throw e;
 -    }
 +    var result = native_.callSync(
 +        'MessagePortManager_requestTrustedLocalMessagePort',
 +        nativeParam
 +    );
  
 -    var returnObject = new LocalMessagePort(args.localMessagePortName, true);
 -    ports[nativeParam.localMessagePortName] = localPortId;
 +    if (native_.isSuccess(result)) {
 +        var returnObject = new LocalMessagePort(args.localMessagePortName, true);
 +        ports[nativeParam.localMessagePortName] = native_.getResultObject(result);
 +    } else {
 +        throw native_.getErrorObject(result);
 +    }
  
      return returnObject;
  };
@@@ -127,13 -188,13 +129,13 @@@ MessagePortManager.prototype.requestRem
          remoteMessagePortName: args.remoteMessagePortName
      };
  
 -    try {
 -        var syncResult = callNative(
 -            'MessagePortManager_requestRemoteMessagePort',
 -            nativeParam
 -        );
 -    } catch (e) {
 -        throw e;
 +    var result = native_.callSync(
 +        'MessagePortManager_requestRemoteMessagePort',
 +        nativeParam
 +    );
 +
 +    if (native_.isFailure(result)) {
 +        throw native_.getErrorObject(result);
      }
  
      var returnObject = new RemoteMessagePort(
@@@ -159,13 -220,13 +161,13 @@@ MessagePortManager.prototype.requestTru
          remoteMessagePortName: args.remoteMessagePortName
      };
  
 -    try {
 -        var syncResult = callNative(
 -            'MessagePortManager_requestTrustedRemoteMessagePort',
 -            nativeParam
 -        );
 -    } catch (e) {
 -        throw e;
 +    var result = native_.callSync(
 +        'MessagePortManager_requestTrustedRemoteMessagePort',
 +        nativeParam
 +    );
 +
 +    if (native_.isFailure(result)) {
 +        throw native_.getErrorObject(result);
      }
  
      var returnObject = new RemoteMessagePort(
@@@ -189,8 -250,6 +191,8 @@@ LocalMessagePort.prototype.addMessagePo
          { name: 'listener', type: types_.FUNCTION, nullable: false }
      ]);
  
 +    native_.addListener(LOCAL_MESSAGE_PORT_LISTENER_ID, MessagePortChangeCallback);
 +
      var portId = ports[this.messagePortName];
  
      if (!callbacks.hasOwnProperty(portId)) callbacks[portId] = [];
@@@ -255,10 -314,10 +257,10 @@@ RemoteMessagePort.prototype.sendMessag
          }
      ]);
  
 -    var filtered_data = new Array(args.data.length);
 -    var unique_data_key = {};
 -    var data_length = args.data.length;
 -    for (var i = 0; i < data_length; i++) {
 +    var filteredData = new Array(args.data.length);
 +    var uniqueDataKey = {};
 +    var dataLength = args.data.length;
 +    for (var i = 0; i < dataLength; i++) {
          if (!args.data[i].hasOwnProperty('key')) {
              throw new WebAPIException(
                  WebAPIException.INVALID_VALUES_ERR,
                  'Property \'key\' should not be empty.'
              );
          }
 -        if (true === unique_data_key[key]) {
 +        if (true === uniqueDataKey[key]) {
              throw new WebAPIException(
                  WebAPIException.INVALID_VALUES_ERR,
                  'Property \'key\' should not be duplicated.'
          }
          var value = args.data[i].value;
          if (type_.isString(value)) {
 -            filtered_data[i] = { key: key, value: value, valueType: 'stringValueType' };
 +            filteredData[i] = { key: key, value: value, valueType: 'stringValueType' };
          } else if (type_.isArray(value)) {
              var arrayMember = value[0];
              if (type_.isString(arrayMember)) {
                          );
                      }
                  }
 -                filtered_data[i] = {
 +                filteredData[i] = {
                      key: key,
                      value: value,
                      valueType: 'stringArrayValueType'
                          'Data is not octet array'
                      );
                  }
 -                filtered_data[i] = {
 +                filteredData[i] = {
                      key: key,
                      value: value,
                      valueType: 'byteStreamValueType'
                          );
                      }
                  }
 -                filtered_data[i] = {
 +                filteredData[i] = {
                      key: key,
                      value: value,
                      valueType: 'byteStreamArrayValueType'
              }
          } else {
              // convert any other value to string -> backward compatibility
 -            filtered_data[i] = {
 +            filteredData[i] = {
                  key: key,
                  value: converter_.toString(value),
                  valueType: 'stringValueType'
              };
          }
 -        unique_data_key[key] = true;
 +        uniqueDataKey[key] = true;
      }
  
      var nativeParam = {
          appId: this.appId,
          messagePortName: this.messagePortName,
 -        data: filtered_data,
 +        data: filteredData,
          trusted: this.isTrusted,
 -        local_port_id: args.localMessagePort
 +        localPortId: args.localMessagePort
              ? ports[args.localMessagePort.messagePortName]
              : -1
      };
  
 -    var syncResult = callNative('RemoteMessagePort_sendMessage', nativeParam);
 +    var result = native_.callSync('RemoteMessagePort_sendMessage', nativeParam);
 +
 +    if (native_.isFailure(result)) {
 +        throw native_.getErrorObject(result);
 +    }
  };
  
  exports = new MessagePortManager();
@@@ -54,6 -54,18 +54,18 @@@ MessageportInstance::MessageportInstanc
  
  MessageportInstance::~MessageportInstance() {
    ScopeLogger();
+   for (int port : local_ports) {
+     int ret = message_port_unregister_local_port(port);
+     if (MESSAGE_PORT_ERROR_NONE != ret) {
+       LoggerW("Failed to unregister local port listener during instance destructor.");
+     }
+   }
+   for (int port : local_trusted_ports) {
+     int ret = message_port_unregister_trusted_local_port(port);
+     if (MESSAGE_PORT_ERROR_NONE != ret) {
+       LoggerW("Failed to unregister local trusted port listener during instance destructor");
+     }
+   }
  }
  
  enum MessageportCallbacks {
@@@ -163,8 -175,7 +175,8 @@@ static void OnReceiveLocalMessage(int l
    picojson::value::object o;
    picojson::value::array data;
  
 -  o["local_port_id"] = picojson::value(static_cast<double>(local_port_id));
 +  o["listenerId"] = picojson::value("LocalMessagePortListener");
 +  o["localPortId"] = picojson::value(static_cast<double>(local_port_id));
  
    if (remote_port) {
      o["remoteAppId"] = picojson::value(remote_app_id);
@@@ -220,6 -231,7 +232,7 @@@ void MessageportInstance::MessagePortMa
          break;
      }
    } else {
+     local_ports.push_back(portId);
      ReportSuccess(picojson::value(static_cast<double>(portId)), out);
    }
  }
@@@ -262,6 -274,7 +275,7 @@@ void MessageportInstance::MessagePortMa
          break;
      }
    } else {
+     local_trusted_ports.push_back(portId);
      ReportSuccess(picojson::value(static_cast<double>(portId)), out);
    }
  }
@@@ -283,17 -296,29 +297,17 @@@ void MessageportInstance::MessagePortMa
            portCheck ? "true" : "false");
    LoggerD("Error code: %d (%s)", ret, get_error_message(ret));
  
 -  if (ret == MESSAGE_PORT_ERROR_NONE) {
 +  if (MESSAGE_PORT_ERROR_NONE == ret) {
      if (portCheck) {
        ReportSuccess(out);
      } else {
        LogAndReportError(NotFoundException("The port of the target application is not found"), out);
      }
 -  } else if (ret == MESSAGE_PORT_ERROR_INVALID_PARAMETER) {
 -    LogAndReportError(
 -        InvalidValuesException("An input parameter contains an invalid value."), out,
 -        ("message_port_check_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_OUT_OF_MEMORY) {
 -    LogAndReportError(
 -        UnknownException("Out of memory."), out,
 -        ("message_port_check_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_IO_ERROR) {
 +  } else if (MESSAGE_PORT_ERROR_IO_ERROR == ret) {
      // IO error means that remote port does not exist
      LogAndReportError(
          NotFoundException("The port of the target application is not found"), out,
          ("message_port_check_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_PORT_NOT_FOUND) {
 -    LogAndReportError(
 -        NotFoundException("The port of the target application is not found"), out,
 -        ("message_port_check_remote_port error: %d (%s)", ret, get_error_message(ret)));
    } else {
      LogAndReportError(
          UnknownException("Unknown Error"), out,
@@@ -319,18 -344,30 +333,18 @@@ void MessageportInstance::MessagePortMa
            portCheck ? "true" : "false");
    LoggerD("Error code: %d (%s)", ret, get_error_message(ret));
  
 -  if (ret == MESSAGE_PORT_ERROR_NONE) {
 +  if (MESSAGE_PORT_ERROR_NONE == ret) {
      if (portCheck) {
        ReportSuccess(out);
      } else {
        LogAndReportError(NotFoundException("The port of the target application is not found"), out);
      }
 -  } else if (ret == MESSAGE_PORT_ERROR_INVALID_PARAMETER) {
 -    LogAndReportError(
 -        InvalidValuesException("An input parameter contains an invalid value."), out,
 -        ("message_port_check_trusted_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_OUT_OF_MEMORY) {
 -    LogAndReportError(
 -        UnknownException("Out of memory."), out,
 -        ("message_port_check_trusted_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_IO_ERROR) {
 +  } else if (MESSAGE_PORT_ERROR_IO_ERROR == ret) {
      // IO error means that remote port does not exist
      LogAndReportError(
          NotFoundException("The port of the target application is not found"), out,
          ("message_port_check_trusted_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_PORT_NOT_FOUND) {
 -    LogAndReportError(
 -        NotFoundException("The port of the target application is not found"), out,
 -        ("message_port_check_trusted_remote_port error: %d (%s)", ret, get_error_message(ret)));
 -  } else if (ret == MESSAGE_PORT_ERROR_CERTIFICATE_NOT_MATCH) {
 +  } else if (MESSAGE_PORT_ERROR_CERTIFICATE_NOT_MATCH == ret) {
      LogAndReportError(
          UnknownException("The remote application is not signed with the same certificate"), out,
          ("message_port_check_trusted_remote_port error: %d (%s)", ret, get_error_message(ret)));
@@@ -348,7 -385,7 +362,7 @@@ void MessageportInstance::RemoteMessage
    const std::string& message_port_name = args.get("messagePortName").get<std::string>();
    std::vector<picojson::value> data = args.get("data").get<picojson::array>();
  
 -  long local_port_id = static_cast<long>(args.get("local_port_id").get<double>());
 +  long local_port_id = static_cast<long>(args.get("localPortId").get<double>());
    bool trusted = args.get("trusted").get<bool>();
  
    int result;