зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to fx-team.
This commit is contained in:
Коммит
fb082e34db
|
@ -382,6 +382,10 @@ let FormAssistant = {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "keydown":
|
case "keydown":
|
||||||
|
if (!this.focusedElement) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Don't monitor the text change resulting from key event.
|
// Don't monitor the text change resulting from key event.
|
||||||
this._ignoreEditActionOnce = true;
|
this._ignoreEditActionOnce = true;
|
||||||
|
|
||||||
|
@ -393,6 +397,10 @@ let FormAssistant = {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "keyup":
|
case "keyup":
|
||||||
|
if (!this.focusedElement) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
this._ignoreEditActionOnce = false;
|
this._ignoreEditActionOnce = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -824,6 +832,10 @@ function getDocumentEncoder(element) {
|
||||||
|
|
||||||
// Get the visible content text of a content editable element
|
// Get the visible content text of a content editable element
|
||||||
function getContentEditableText(element) {
|
function getContentEditableText(element) {
|
||||||
|
if (!element) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
let doc = element.ownerDocument;
|
let doc = element.ownerDocument;
|
||||||
let range = doc.createRange();
|
let range = doc.createRange();
|
||||||
range.selectNodeContents(element);
|
range.selectNodeContents(element);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{
|
{
|
||||||
"revision": "a6b81f7d4b84287a2bdf0ce78df08fed9fd46bee",
|
"revision": "2b195ef19ed8cadd557ca185bae72c9ff836b264",
|
||||||
"repo_path": "/integration/gaia-central"
|
"repo_path": "/integration/gaia-central"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
"config_version": 2,
|
||||||
|
"tooltool_manifest": "releng-helix.tt",
|
||||||
|
"mock_target": "mozilla-centos6-i386",
|
||||||
|
"mock_packages": ["ccache", "make", "bison", "flex", "gcc", "g++", "mpfr", "zlib-devel", "ncurses-devel", "zip", "autoconf213", "glibc-static", "perl-Digest-SHA", "wget", "alsa-lib", "atk", "cairo", "dbus-glib", "fontconfig", "freetype", "glib2", "gtk2", "libXRender", "libXt", "pango", "mozilla-python27-mercurial", "openssh-clients", "nss-devel", "java-1.6.0-openjdk-devel", "git"],
|
||||||
|
"mock_files": [["/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"]],
|
||||||
|
"build_targets": [],
|
||||||
|
"upload_files": [
|
||||||
|
"{objdir}/dist/b2g-*.crashreporter-symbols.zip",
|
||||||
|
"{objdir}/dist/b2g-*.tar.gz",
|
||||||
|
"{workdir}/sources.xml"
|
||||||
|
],
|
||||||
|
"zip_files": [
|
||||||
|
["{workdir}/out/target/product/helix/*.img", "out/target/product/helix/"],
|
||||||
|
"{workdir}/flash.sh",
|
||||||
|
"{workdir}/load-config.sh",
|
||||||
|
"{workdir}/.config",
|
||||||
|
"{workdir}/sources.xml"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"VARIANT": "user",
|
||||||
|
"MOZILLA_OFFICIAL": "1",
|
||||||
|
"B2GUPDATER": "1",
|
||||||
|
"ANDROIDFS_DIR": "{workdir}/helix-ics"
|
||||||
|
},
|
||||||
|
"b2g_manifest": "helix.xml",
|
||||||
|
"b2g_manifest_branch": "master",
|
||||||
|
"additional_source_tarballs": ["helix-ics.tar.xz"],
|
||||||
|
"gecko_l10n_root": "http://hg.mozilla.org/l10n-central",
|
||||||
|
"gaia": {
|
||||||
|
"l10n": {
|
||||||
|
"vcs": "hgtool",
|
||||||
|
"root": "http://hg.mozilla.org/gaia-l10n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"size": 214609120,
|
||||||
|
"digest": "cbda63d37b8db104a0fddcb5d8ffe1da173922805863905cb82e819c80cf6032caffa49903cb74e8c703da35df876cc305a7d7b989a52c045e99845e20718f7e",
|
||||||
|
"algorithm": "sha512",
|
||||||
|
"filename": "helix-ics.tar.xz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": 1570553,
|
||||||
|
"digest": "ea03de74df73b05e939c314cd15c54aac7b5488a407b7cc4f5f263f3049a1f69642c567dd35c43d0bc3f0d599d0385a26ab2dd947a6b18f9044e4918b382eea7",
|
||||||
|
"algorithm": "sha512",
|
||||||
|
"filename": "Adreno200-AU_LINUX_ANDROID_ICS_CHOCO_CS.04.00.03.06.001.zip"
|
||||||
|
}
|
||||||
|
]
|
|
@ -2072,6 +2072,13 @@ nsFrameLoader::TryRemoteBrowser()
|
||||||
mRemoteBrowser->SetBrowserDOMWindow(browserDOMWin);
|
mRemoteBrowser->SetBrowserDOMWindow(browserDOMWin);
|
||||||
|
|
||||||
mContentParent = mRemoteBrowser->Manager();
|
mContentParent = mRemoteBrowser->Manager();
|
||||||
|
|
||||||
|
if (mOwnerContent->AttrValueIs(kNameSpaceID_None,
|
||||||
|
nsGkAtoms::mozpasspointerevents,
|
||||||
|
nsGkAtoms::_true,
|
||||||
|
eCaseMatters)) {
|
||||||
|
unused << mRemoteBrowser->SendSetUpdateHitRegion(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,6 @@ MOCHITEST_FILES = \
|
||||||
test_bug659350.html \
|
test_bug659350.html \
|
||||||
test_bug662678.html \
|
test_bug662678.html \
|
||||||
test_bug667919-1.html \
|
test_bug667919-1.html \
|
||||||
test_bug667919-2.html \
|
|
||||||
test_bug667612.html \
|
test_bug667612.html \
|
||||||
empty.js \
|
empty.js \
|
||||||
test_bug689564.html \
|
test_bug689564.html \
|
||||||
|
|
|
@ -24,7 +24,6 @@ window.addEventListener("deviceorientation", function(event) {
|
||||||
is(event.beta, 2.25);
|
is(event.beta, 2.25);
|
||||||
is(event.gamma, 3.667);
|
is(event.gamma, 3.667);
|
||||||
is(event.absolute, true);
|
is(event.absolute, true);
|
||||||
SimpleTest.finish();
|
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
var event = DeviceOrientationEvent;
|
var event = DeviceOrientationEvent;
|
||||||
|
@ -33,7 +32,6 @@ ok(!!event, "Should have seen DeviceOrientationEvent!");
|
||||||
event = document.createEvent("DeviceOrientationEvent");
|
event = document.createEvent("DeviceOrientationEvent");
|
||||||
event.initDeviceOrientationEvent('deviceorientation', true, true, 1.5, 2.25, 3.667, true);
|
event.initDeviceOrientationEvent('deviceorientation', true, true, 1.5, 2.25, 3.667, true);
|
||||||
window.dispatchEvent(event);
|
window.dispatchEvent(event);
|
||||||
SimpleTest.waitForExplicitFinish();
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
<!DOCTYPE HTML>
|
|
||||||
<html>
|
|
||||||
<!--
|
|
||||||
https://bugzilla.mozilla.org/show_bug.cgi?id=615597
|
|
||||||
-->
|
|
||||||
<head>
|
|
||||||
<title>Test for Bug 615597</title>
|
|
||||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
||||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=615597">Mozilla Bug 615597</a>
|
|
||||||
<p id="display"></p>
|
|
||||||
<div id="content" style="display: none">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<pre id="test">
|
|
||||||
<script type="application/javascript">
|
|
||||||
|
|
||||||
/** Test for Bug 615597 **/
|
|
||||||
|
|
||||||
window.ondeviceorientation = function(event) {
|
|
||||||
is(event.alpha, 1.5);
|
|
||||||
is(event.beta, 2.25);
|
|
||||||
is(event.gamma, 3.667);
|
|
||||||
is(event.absolute, true);
|
|
||||||
SimpleTest.finish();
|
|
||||||
};
|
|
||||||
|
|
||||||
var event = DeviceOrientationEvent;
|
|
||||||
ok(!!event, "Should have seen DeviceOrientationEvent!");
|
|
||||||
|
|
||||||
event = document.createEvent("DeviceOrientationEvent");
|
|
||||||
event.initDeviceOrientationEvent('deviceorientation', true, true, 1.5, 2.25, 3.667, true);
|
|
||||||
window.dispatchEvent(event);
|
|
||||||
SimpleTest.waitForExplicitFinish();
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -57,6 +57,7 @@ extern bool gBluetoothDebugFlag;
|
||||||
*/
|
*/
|
||||||
#define BLUETOOTH_A2DP_STATUS_CHANGED_ID "bluetooth-a2dp-status-changed"
|
#define BLUETOOTH_A2DP_STATUS_CHANGED_ID "bluetooth-a2dp-status-changed"
|
||||||
#define BLUETOOTH_HFP_STATUS_CHANGED_ID "bluetooth-hfp-status-changed"
|
#define BLUETOOTH_HFP_STATUS_CHANGED_ID "bluetooth-hfp-status-changed"
|
||||||
|
#define BLUETOOTH_HID_STATUS_CHANGED_ID "bluetooth-hid-status-changed"
|
||||||
#define BLUETOOTH_SCO_STATUS_CHANGED_ID "bluetooth-sco-status-changed"
|
#define BLUETOOTH_SCO_STATUS_CHANGED_ID "bluetooth-sco-status-changed"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,207 @@
|
||||||
|
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
|
||||||
|
/* vim: set ts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#include "base/basictypes.h"
|
||||||
|
|
||||||
|
#include "BluetoothHidManager.h"
|
||||||
|
|
||||||
|
#include "BluetoothCommon.h"
|
||||||
|
#include "BluetoothService.h"
|
||||||
|
#include "BluetoothUtils.h"
|
||||||
|
|
||||||
|
#include "mozilla/dom/bluetooth/BluetoothTypes.h"
|
||||||
|
#include "mozilla/Services.h"
|
||||||
|
#include "mozilla/StaticPtr.h"
|
||||||
|
#include "nsIObserverService.h"
|
||||||
|
|
||||||
|
using namespace mozilla;
|
||||||
|
USING_BLUETOOTH_NAMESPACE
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
StaticRefPtr<BluetoothHidManager> sBluetoothHidManager;
|
||||||
|
bool sInShutdown = false;
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
BluetoothHidManager::Observe(nsISupports* aSubject,
|
||||||
|
const char* aTopic,
|
||||||
|
const PRUnichar* aData)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(sBluetoothHidManager);
|
||||||
|
|
||||||
|
if (!strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) {
|
||||||
|
HandleShutdown();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
MOZ_ASSERT(false, "BluetoothHidManager got unexpected topic!");
|
||||||
|
return NS_ERROR_UNEXPECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
BluetoothHidManager::BluetoothHidManager()
|
||||||
|
: mConnected(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
BluetoothHidManager::Init()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
|
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
|
||||||
|
NS_ENSURE_TRUE(obs, false);
|
||||||
|
if (NS_FAILED(obs->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false))) {
|
||||||
|
BT_WARNING("Failed to add shutdown observer!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
BluetoothHidManager::~BluetoothHidManager()
|
||||||
|
{
|
||||||
|
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
|
||||||
|
NS_ENSURE_TRUE_VOID(obs);
|
||||||
|
if (NS_FAILED(obs->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID))) {
|
||||||
|
BT_WARNING("Failed to remove shutdown observer!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//static
|
||||||
|
BluetoothHidManager*
|
||||||
|
BluetoothHidManager::Get()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
|
// If we already exist, exit early
|
||||||
|
if (sBluetoothHidManager) {
|
||||||
|
return sBluetoothHidManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're in shutdown, don't create a new instance
|
||||||
|
NS_ENSURE_FALSE(sInShutdown, nullptr);
|
||||||
|
|
||||||
|
// Create a new instance, register, and return
|
||||||
|
BluetoothHidManager* manager = new BluetoothHidManager();
|
||||||
|
NS_ENSURE_TRUE(manager->Init(), nullptr);
|
||||||
|
|
||||||
|
sBluetoothHidManager = manager;
|
||||||
|
return sBluetoothHidManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BluetoothHidManager::HandleShutdown()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
sInShutdown = true;
|
||||||
|
Disconnect();
|
||||||
|
sBluetoothHidManager = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
BluetoothHidManager::Connect(const nsAString& aDeviceAddress,
|
||||||
|
BluetoothReplyRunnable* aRunnable)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
MOZ_ASSERT(!aDeviceAddress.IsEmpty());
|
||||||
|
|
||||||
|
NS_ENSURE_FALSE(sInShutdown, false);
|
||||||
|
NS_ENSURE_FALSE(mConnected, false);
|
||||||
|
|
||||||
|
mDeviceAddress = aDeviceAddress;
|
||||||
|
|
||||||
|
BluetoothService* bs = BluetoothService::Get();
|
||||||
|
NS_ENSURE_TRUE(bs, false);
|
||||||
|
nsresult rv = bs->SendInputMessage(aDeviceAddress,
|
||||||
|
NS_LITERAL_STRING("Connect"),
|
||||||
|
aRunnable);
|
||||||
|
|
||||||
|
return NS_SUCCEEDED(rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BluetoothHidManager::Disconnect()
|
||||||
|
{
|
||||||
|
NS_ENSURE_TRUE_VOID(mConnected);
|
||||||
|
|
||||||
|
MOZ_ASSERT(!mDeviceAddress.IsEmpty());
|
||||||
|
|
||||||
|
BluetoothService* bs = BluetoothService::Get();
|
||||||
|
NS_ENSURE_TRUE_VOID(bs);
|
||||||
|
bs->SendInputMessage(mDeviceAddress,
|
||||||
|
NS_LITERAL_STRING("Disconnect"),
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BluetoothHidManager::IsConnected()
|
||||||
|
{
|
||||||
|
return mConnected;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BluetoothHidManager::HandleInputPropertyChanged(const BluetoothSignal& aSignal)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
MOZ_ASSERT(aSignal.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue);
|
||||||
|
|
||||||
|
const InfallibleTArray<BluetoothNamedValue>& arr =
|
||||||
|
aSignal.value().get_ArrayOfBluetoothNamedValue();
|
||||||
|
MOZ_ASSERT(arr.Length() == 1);
|
||||||
|
|
||||||
|
const nsString& name = arr[0].name();
|
||||||
|
const BluetoothValue& value = arr[0].value();
|
||||||
|
|
||||||
|
if (name.EqualsLiteral("Connected")) {
|
||||||
|
MOZ_ASSERT(value.type() == BluetoothValue::Tbool);
|
||||||
|
MOZ_ASSERT(mConnected != value.get_bool());
|
||||||
|
|
||||||
|
mConnected = value.get_bool();
|
||||||
|
NotifyStatusChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BluetoothHidManager::NotifyStatusChanged()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
|
NS_NAMED_LITERAL_STRING(type, BLUETOOTH_HID_STATUS_CHANGED_ID);
|
||||||
|
InfallibleTArray<BluetoothNamedValue> parameters;
|
||||||
|
|
||||||
|
BluetoothValue v = mConnected;
|
||||||
|
parameters.AppendElement(
|
||||||
|
BluetoothNamedValue(NS_LITERAL_STRING("connected"), v));
|
||||||
|
|
||||||
|
v = mDeviceAddress;
|
||||||
|
parameters.AppendElement(
|
||||||
|
BluetoothNamedValue(NS_LITERAL_STRING("address"), v));
|
||||||
|
|
||||||
|
if (!BroadcastSystemMessage(type, parameters)) {
|
||||||
|
NS_WARNING("Failed to broadcast system message to settings");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BluetoothHidManager::OnGetServiceChannel(const nsAString& aDeviceAddress,
|
||||||
|
const nsAString& aServiceUuid,
|
||||||
|
int aChannel)
|
||||||
|
{
|
||||||
|
// Do nothing here as bluez acquires service channel and connects for us
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BluetoothHidManager::OnUpdateSdpRecords(const nsAString& aDeviceAddress)
|
||||||
|
{
|
||||||
|
// Do nothing here as bluez acquires service channel and connects for us
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BluetoothHidManager::GetAddress(nsAString& aDeviceAddress)
|
||||||
|
{
|
||||||
|
aDeviceAddress = mDeviceAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMPL_ISUPPORTS1(BluetoothHidManager, nsIObserver)
|
|
@ -0,0 +1,53 @@
|
||||||
|
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
|
||||||
|
/* vim: set ts=2 et sw=2 tw=80: */
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
#ifndef mozilla_dom_bluetooth_bluetoothhidmanager_h__
|
||||||
|
#define mozilla_dom_bluetooth_bluetoothhidmanager_h__
|
||||||
|
|
||||||
|
#include "BluetoothCommon.h"
|
||||||
|
#include "BluetoothProfileManagerBase.h"
|
||||||
|
|
||||||
|
BEGIN_BLUETOOTH_NAMESPACE
|
||||||
|
|
||||||
|
class BluetoothReplyRunnable;
|
||||||
|
|
||||||
|
class BluetoothHidManager : public BluetoothProfileManagerBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
NS_DECL_NSIOBSERVER
|
||||||
|
|
||||||
|
static BluetoothHidManager* Get();
|
||||||
|
~BluetoothHidManager();
|
||||||
|
|
||||||
|
virtual void OnGetServiceChannel(const nsAString& aDeviceAddress,
|
||||||
|
const nsAString& aServiceUuid,
|
||||||
|
int aChannel) MOZ_OVERRIDE;
|
||||||
|
virtual void OnUpdateSdpRecords(const nsAString& aDeviceAddress) MOZ_OVERRIDE;
|
||||||
|
virtual void GetAddress(nsAString& aDeviceAddress) MOZ_OVERRIDE;
|
||||||
|
virtual bool IsConnected() MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
bool Connect(const nsAString& aDeviceAddress,
|
||||||
|
BluetoothReplyRunnable* aRunnable);
|
||||||
|
void Disconnect();
|
||||||
|
void HandleInputPropertyChanged(const BluetoothSignal& aSignal);
|
||||||
|
|
||||||
|
private:
|
||||||
|
BluetoothHidManager();
|
||||||
|
bool Init();
|
||||||
|
void Cleanup();
|
||||||
|
void HandleShutdown();
|
||||||
|
|
||||||
|
void NotifyStatusChanged();
|
||||||
|
|
||||||
|
// data member
|
||||||
|
bool mConnected;
|
||||||
|
nsString mDeviceAddress;
|
||||||
|
};
|
||||||
|
|
||||||
|
END_BLUETOOTH_NAMESPACE
|
||||||
|
|
||||||
|
#endif //#ifndef mozilla_dom_bluetooth_bluetoothhidmanager_h__
|
|
@ -294,6 +294,11 @@ public:
|
||||||
SendSinkMessage(const nsAString& aDeviceAddresses,
|
SendSinkMessage(const nsAString& aDeviceAddresses,
|
||||||
const nsAString& aMessage) = 0;
|
const nsAString& aMessage) = 0;
|
||||||
|
|
||||||
|
virtual nsresult
|
||||||
|
SendInputMessage(const nsAString& aDeviceAddresses,
|
||||||
|
const nsAString& aMessage,
|
||||||
|
BluetoothReplyRunnable* aRunnable) = 0;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
IsEnabled() const
|
IsEnabled() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,7 +26,8 @@ enum BluetoothServiceClass
|
||||||
HEADSET_AG = 0x1112,
|
HEADSET_AG = 0x1112,
|
||||||
HANDSFREE = 0x111E,
|
HANDSFREE = 0x111E,
|
||||||
HANDSFREE_AG = 0x111F,
|
HANDSFREE_AG = 0x111F,
|
||||||
OBJECT_PUSH = 0x1105
|
OBJECT_PUSH = 0x1105,
|
||||||
|
HID = 0x1124,
|
||||||
};
|
};
|
||||||
|
|
||||||
class BluetoothUuidHelper
|
class BluetoothUuidHelper
|
||||||
|
|
|
@ -415,6 +415,14 @@ BluetoothServiceChildProcess::SendSinkMessage(const nsAString& aDeviceAddresses,
|
||||||
MOZ_CRASH("This should never be called!");
|
MOZ_CRASH("This should never be called!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothServiceChildProcess::SendInputMessage(const nsAString& aDeviceAddresses,
|
||||||
|
const nsAString& aMessage,
|
||||||
|
BluetoothReplyRunnable* aRunnable)
|
||||||
|
{
|
||||||
|
MOZ_CRASH("This should never be called!");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BluetoothServiceChildProcess::UpdatePlayStatus(uint32_t aDuration,
|
BluetoothServiceChildProcess::UpdatePlayStatus(uint32_t aDuration,
|
||||||
uint32_t aPosition,
|
uint32_t aPosition,
|
||||||
|
|
|
@ -176,6 +176,11 @@ public:
|
||||||
SendSinkMessage(const nsAString& aDeviceAddresses,
|
SendSinkMessage(const nsAString& aDeviceAddresses,
|
||||||
const nsAString& aMessage) MOZ_OVERRIDE;
|
const nsAString& aMessage) MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual nsresult
|
||||||
|
SendInputMessage(const nsAString& aDeviceAddresses,
|
||||||
|
const nsAString& aMessage,
|
||||||
|
BluetoothReplyRunnable* aRunnable) MOZ_OVERRIDE;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
BluetoothServiceChildProcess();
|
BluetoothServiceChildProcess();
|
||||||
virtual ~BluetoothServiceChildProcess();
|
virtual ~BluetoothServiceChildProcess();
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "BluetoothDBusService.h"
|
#include "BluetoothDBusService.h"
|
||||||
#include "BluetoothA2dpManager.h"
|
#include "BluetoothA2dpManager.h"
|
||||||
#include "BluetoothHfpManager.h"
|
#include "BluetoothHfpManager.h"
|
||||||
|
#include "BluetoothHidManager.h"
|
||||||
#include "BluetoothOppManager.h"
|
#include "BluetoothOppManager.h"
|
||||||
#include "BluetoothReplyRunnable.h"
|
#include "BluetoothReplyRunnable.h"
|
||||||
#include "BluetoothUnixSocketConnector.h"
|
#include "BluetoothUnixSocketConnector.h"
|
||||||
|
@ -69,6 +70,7 @@ USING_BLUETOOTH_NAMESPACE
|
||||||
#define DBUS_AGENT_IFACE BLUEZ_DBUS_BASE_IFC ".Agent"
|
#define DBUS_AGENT_IFACE BLUEZ_DBUS_BASE_IFC ".Agent"
|
||||||
#define DBUS_SINK_IFACE BLUEZ_DBUS_BASE_IFC ".AudioSink"
|
#define DBUS_SINK_IFACE BLUEZ_DBUS_BASE_IFC ".AudioSink"
|
||||||
#define DBUS_CTL_IFACE BLUEZ_DBUS_BASE_IFC ".Control"
|
#define DBUS_CTL_IFACE BLUEZ_DBUS_BASE_IFC ".Control"
|
||||||
|
#define DBUS_INPUT_IFACE BLUEZ_DBUS_BASE_IFC ".Input"
|
||||||
#define BLUEZ_DBUS_BASE_PATH "/org/bluez"
|
#define BLUEZ_DBUS_BASE_PATH "/org/bluez"
|
||||||
#define BLUEZ_DBUS_BASE_IFC "org.bluez"
|
#define BLUEZ_DBUS_BASE_IFC "org.bluez"
|
||||||
#define BLUEZ_ERROR_IFC "org.bluez.Error"
|
#define BLUEZ_ERROR_IFC "org.bluez.Error"
|
||||||
|
@ -139,6 +141,10 @@ static Properties sControlProperties[] = {
|
||||||
{"Connected", DBUS_TYPE_BOOLEAN}
|
{"Connected", DBUS_TYPE_BOOLEAN}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static Properties sInputProperties[] = {
|
||||||
|
{"Connected", DBUS_TYPE_BOOLEAN}
|
||||||
|
};
|
||||||
|
|
||||||
static const char* sBluetoothDBusIfaces[] =
|
static const char* sBluetoothDBusIfaces[] =
|
||||||
{
|
{
|
||||||
DBUS_MANAGER_IFACE,
|
DBUS_MANAGER_IFACE,
|
||||||
|
@ -175,7 +181,6 @@ static Monitor sStopBluetoothMonitor("BluetoothService.sStopBluetoothMonitor");
|
||||||
|
|
||||||
typedef void (*UnpackFunc)(DBusMessage*, DBusError*, BluetoothValue&, nsAString&);
|
typedef void (*UnpackFunc)(DBusMessage*, DBusError*, BluetoothValue&, nsAString&);
|
||||||
typedef bool (*FilterFunc)(const BluetoothValue&);
|
typedef bool (*FilterFunc)(const BluetoothValue&);
|
||||||
typedef void (*SinkCallback)(DBusMessage*, void*);
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
GetConnectedDevicesFilter(const BluetoothValue& aValue)
|
GetConnectedDevicesFilter(const BluetoothValue& aValue)
|
||||||
|
@ -290,6 +295,35 @@ private:
|
||||||
BluetoothSignal mSignal;
|
BluetoothSignal mSignal;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class InputPropertyChangedHandler : public nsRunnable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InputPropertyChangedHandler(const BluetoothSignal& aSignal)
|
||||||
|
: mSignal(aSignal)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHOD
|
||||||
|
Run()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
MOZ_ASSERT(mSignal.name().EqualsLiteral("PropertyChanged"));
|
||||||
|
MOZ_ASSERT(mSignal.value().type() == BluetoothValue::TArrayOfBluetoothNamedValue);
|
||||||
|
|
||||||
|
// Replace object path with device address
|
||||||
|
nsString address = GetAddressFromObjectPath(mSignal.path());
|
||||||
|
mSignal.path() = address;
|
||||||
|
|
||||||
|
BluetoothHidManager* hid = BluetoothHidManager::Get();
|
||||||
|
NS_ENSURE_TRUE(hid, NS_ERROR_FAILURE);
|
||||||
|
hid->HandleInputPropertyChanged(mSignal);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
BluetoothSignal mSignal;
|
||||||
|
};
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
IsDBusMessageError(DBusMessage* aMsg, DBusError* aErr, nsAString& aErrorStr)
|
IsDBusMessageError(DBusMessage* aMsg, DBusError* aErr, nsAString& aErrorStr)
|
||||||
{
|
{
|
||||||
|
@ -489,6 +523,15 @@ CheckForError(DBusMessage* aMsg, void *aParam, const nsAString& aError)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
InputDisconnectCallback(DBusMessage* aMsg, void* aParam)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
NS_NAMED_LITERAL_STRING(errorStr, "Failed to disconnect input device");
|
||||||
|
CheckForError(aMsg, aParam, errorStr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SinkConnectCallback(DBusMessage* aMsg, void* aParam)
|
SinkConnectCallback(DBusMessage* aMsg, void* aParam)
|
||||||
{
|
{
|
||||||
|
@ -503,7 +546,7 @@ SinkDisconnectCallback(DBusMessage* aMsg, void* aParam)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
NS_NAMED_LITERAL_STRING(errorStr, "Failed to disconnect sink");
|
NS_NAMED_LITERAL_STRING(errorStr, "Failed to disconnect sink");
|
||||||
CheckForError(false, aMsg, errorStr);
|
CheckForError(aMsg, aParam, errorStr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1558,6 +1601,13 @@ EventFilter(DBusConnection* aConn, DBusMessage* aMsg, void* aData)
|
||||||
errorStr,
|
errorStr,
|
||||||
sControlProperties,
|
sControlProperties,
|
||||||
ArrayLength(sControlProperties));
|
ArrayLength(sControlProperties));
|
||||||
|
} else if (dbus_message_is_signal(aMsg, DBUS_INPUT_IFACE,
|
||||||
|
"PropertyChanged")) {
|
||||||
|
ParsePropertyChange(aMsg,
|
||||||
|
v,
|
||||||
|
errorStr,
|
||||||
|
sInputProperties,
|
||||||
|
ArrayLength(sInputProperties));
|
||||||
} else {
|
} else {
|
||||||
errorStr = NS_ConvertUTF8toUTF16(dbus_message_get_member(aMsg));
|
errorStr = NS_ConvertUTF8toUTF16(dbus_message_get_member(aMsg));
|
||||||
errorStr.AppendLiteral(" Signal not handled!");
|
errorStr.AppendLiteral(" Signal not handled!");
|
||||||
|
@ -1574,6 +1624,8 @@ EventFilter(DBusConnection* aConn, DBusMessage* aMsg, void* aData)
|
||||||
task = new SinkPropertyChangedHandler(signal);
|
task = new SinkPropertyChangedHandler(signal);
|
||||||
} else if (signalInterface.EqualsLiteral(DBUS_CTL_IFACE)) {
|
} else if (signalInterface.EqualsLiteral(DBUS_CTL_IFACE)) {
|
||||||
task = new ControlPropertyChangedHandler(signal);
|
task = new ControlPropertyChangedHandler(signal);
|
||||||
|
} else if (signalInterface.EqualsLiteral(DBUS_INPUT_IFACE)) {
|
||||||
|
task = new InputPropertyChangedHandler(signal);
|
||||||
} else {
|
} else {
|
||||||
task = new DistributeBluetoothSignalTask(signal);
|
task = new DistributeBluetoothSignalTask(signal);
|
||||||
}
|
}
|
||||||
|
@ -1882,6 +1934,43 @@ BluetoothDBusService::SendDiscoveryMessage(const char* aMessageName,
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsresult
|
||||||
|
BluetoothDBusService::SendInputMessage(const nsAString& aDeviceAddress,
|
||||||
|
const nsAString& aMessage,
|
||||||
|
BluetoothReplyRunnable* aRunnable)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
MOZ_ASSERT(mConnection);
|
||||||
|
MOZ_ASSERT(aMessage.EqualsLiteral("Connect") ||
|
||||||
|
aMessage.EqualsLiteral("Disconnect"));
|
||||||
|
|
||||||
|
NS_ENSURE_TRUE(IsReady(), NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
DBusCallback callback;
|
||||||
|
if (aMessage.EqualsLiteral("Connect")) {
|
||||||
|
callback = GetVoidCallback;
|
||||||
|
} else if (aMessage.EqualsLiteral("Disconnect")) {
|
||||||
|
callback = InputDisconnectCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsRefPtr<BluetoothReplyRunnable> runnable(aRunnable);
|
||||||
|
|
||||||
|
nsString objectPath = GetObjectPathFromAddress(sAdapterPath, aDeviceAddress);
|
||||||
|
bool ret = dbus_func_args_async(mConnection,
|
||||||
|
-1,
|
||||||
|
callback,
|
||||||
|
static_cast<void*>(runnable.get()),
|
||||||
|
NS_ConvertUTF16toUTF8(objectPath).get(),
|
||||||
|
DBUS_INPUT_IFACE,
|
||||||
|
NS_ConvertUTF16toUTF8(aMessage).get(),
|
||||||
|
DBUS_TYPE_INVALID);
|
||||||
|
NS_ENSURE_TRUE(ret, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
runnable.forget();
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
BluetoothDBusService::SendSinkMessage(const nsAString& aDeviceAddress,
|
BluetoothDBusService::SendSinkMessage(const nsAString& aDeviceAddress,
|
||||||
const nsAString& aMessage)
|
const nsAString& aMessage)
|
||||||
|
@ -1890,7 +1979,7 @@ BluetoothDBusService::SendSinkMessage(const nsAString& aDeviceAddress,
|
||||||
MOZ_ASSERT(mConnection);
|
MOZ_ASSERT(mConnection);
|
||||||
MOZ_ASSERT(IsEnabled());
|
MOZ_ASSERT(IsEnabled());
|
||||||
|
|
||||||
SinkCallback callback;
|
DBusCallback callback;
|
||||||
if (aMessage.EqualsLiteral("Connect")) {
|
if (aMessage.EqualsLiteral("Connect")) {
|
||||||
callback = SinkConnectCallback;
|
callback = SinkConnectCallback;
|
||||||
} else if (aMessage.EqualsLiteral("Disconnect")) {
|
} else if (aMessage.EqualsLiteral("Disconnect")) {
|
||||||
|
@ -1909,8 +1998,8 @@ BluetoothDBusService::SendSinkMessage(const nsAString& aDeviceAddress,
|
||||||
DBUS_SINK_IFACE,
|
DBUS_SINK_IFACE,
|
||||||
NS_ConvertUTF16toUTF8(aMessage).get(),
|
NS_ConvertUTF16toUTF8(aMessage).get(),
|
||||||
DBUS_TYPE_INVALID);
|
DBUS_TYPE_INVALID);
|
||||||
|
|
||||||
NS_ENSURE_TRUE(ret, NS_ERROR_FAILURE);
|
NS_ENSURE_TRUE(ret, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2022,6 +2111,8 @@ BluetoothDBusService::GetConnectedDevicePropertiesInternal(uint16_t aProfileId,
|
||||||
if (aProfileId == BluetoothServiceClass::HANDSFREE ||
|
if (aProfileId == BluetoothServiceClass::HANDSFREE ||
|
||||||
aProfileId == BluetoothServiceClass::HEADSET) {
|
aProfileId == BluetoothServiceClass::HEADSET) {
|
||||||
profile = BluetoothHfpManager::Get();
|
profile = BluetoothHfpManager::Get();
|
||||||
|
} else if (aProfileId == BluetoothServiceClass::HID) {
|
||||||
|
profile = BluetoothHidManager::Get();
|
||||||
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
||||||
profile = BluetoothOppManager::Get();
|
profile = BluetoothOppManager::Get();
|
||||||
} else {
|
} else {
|
||||||
|
@ -2489,6 +2580,9 @@ BluetoothDBusService::Connect(const nsAString& aDeviceAddress,
|
||||||
} else if (aProfileId == BluetoothServiceClass::HEADSET) {
|
} else if (aProfileId == BluetoothServiceClass::HEADSET) {
|
||||||
BluetoothHfpManager* hfp = BluetoothHfpManager::Get();
|
BluetoothHfpManager* hfp = BluetoothHfpManager::Get();
|
||||||
hfp->Connect(aDeviceAddress, false, aRunnable);
|
hfp->Connect(aDeviceAddress, false, aRunnable);
|
||||||
|
} else if (aProfileId == BluetoothServiceClass::HID) {
|
||||||
|
BluetoothHidManager* hid = BluetoothHidManager::Get();
|
||||||
|
hid->Connect(aDeviceAddress, aRunnable);
|
||||||
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
||||||
BluetoothOppManager* opp = BluetoothOppManager::Get();
|
BluetoothOppManager* opp = BluetoothOppManager::Get();
|
||||||
opp->Connect(aDeviceAddress, aRunnable);
|
opp->Connect(aDeviceAddress, aRunnable);
|
||||||
|
@ -2508,6 +2602,9 @@ BluetoothDBusService::Disconnect(const uint16_t aProfileId,
|
||||||
aProfileId == BluetoothServiceClass::HEADSET) {
|
aProfileId == BluetoothServiceClass::HEADSET) {
|
||||||
BluetoothHfpManager* hfp = BluetoothHfpManager::Get();
|
BluetoothHfpManager* hfp = BluetoothHfpManager::Get();
|
||||||
hfp->Disconnect();
|
hfp->Disconnect();
|
||||||
|
} else if (aProfileId == BluetoothServiceClass::HID) {
|
||||||
|
BluetoothHidManager* hid = BluetoothHidManager::Get();
|
||||||
|
hid->Disconnect();
|
||||||
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
||||||
BluetoothOppManager* opp = BluetoothOppManager::Get();
|
BluetoothOppManager* opp = BluetoothOppManager::Get();
|
||||||
opp->Disconnect();
|
opp->Disconnect();
|
||||||
|
@ -2531,6 +2628,8 @@ BluetoothDBusService::IsConnected(const uint16_t aProfileId)
|
||||||
if (aProfileId == BluetoothServiceClass::HANDSFREE ||
|
if (aProfileId == BluetoothServiceClass::HANDSFREE ||
|
||||||
aProfileId == BluetoothServiceClass::HEADSET) {
|
aProfileId == BluetoothServiceClass::HEADSET) {
|
||||||
profile = BluetoothHfpManager::Get();
|
profile = BluetoothHfpManager::Get();
|
||||||
|
} else if (aProfileId == BluetoothServiceClass::HID) {
|
||||||
|
profile = BluetoothHidManager::Get();
|
||||||
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
} else if (aProfileId == BluetoothServiceClass::OBJECT_PUSH) {
|
||||||
profile = BluetoothOppManager::Get();
|
profile = BluetoothOppManager::Get();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -162,6 +162,11 @@ public:
|
||||||
SendSinkMessage(const nsAString& aDeviceAddresses,
|
SendSinkMessage(const nsAString& aDeviceAddresses,
|
||||||
const nsAString& aMessage) MOZ_OVERRIDE;
|
const nsAString& aMessage) MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual nsresult
|
||||||
|
SendInputMessage(const nsAString& aDeviceAddresses,
|
||||||
|
const nsAString& aMessage,
|
||||||
|
BluetoothReplyRunnable* aRunnable) MOZ_OVERRIDE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* For DBus Control method of "UpdateNotification", event id should be
|
* For DBus Control method of "UpdateNotification", event id should be
|
||||||
|
|
|
@ -37,6 +37,7 @@ if CONFIG['MOZ_B2G_BT']:
|
||||||
'BluetoothUnixSocketConnector.cpp',
|
'BluetoothUnixSocketConnector.cpp',
|
||||||
'BluetoothA2dpManager.cpp',
|
'BluetoothA2dpManager.cpp',
|
||||||
'BluetoothHfpManager.cpp',
|
'BluetoothHfpManager.cpp',
|
||||||
|
'BluetoothHidManager.cpp',
|
||||||
'BluetoothOppManager.cpp',
|
'BluetoothOppManager.cpp',
|
||||||
'ObexBase.cpp',
|
'ObexBase.cpp',
|
||||||
'BluetoothUuid.cpp',
|
'BluetoothUuid.cpp',
|
||||||
|
|
|
@ -24,8 +24,6 @@ EXPORTS += [
|
||||||
'CameraPreviewMediaStream.h',
|
'CameraPreviewMediaStream.h',
|
||||||
'DOMCameraManager.h',
|
'DOMCameraManager.h',
|
||||||
'GonkCameraControl.h',
|
'GonkCameraControl.h',
|
||||||
'GonkNativeWindow.h',
|
|
||||||
'GonkNativeWindowClient.h',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
CPP_SOURCES += [
|
CPP_SOURCES += [
|
||||||
|
@ -43,20 +41,11 @@ if CONFIG['MOZ_B2G_CAMERA']:
|
||||||
'GonkCameraManager.cpp',
|
'GonkCameraManager.cpp',
|
||||||
'GonkCameraControl.cpp',
|
'GonkCameraControl.cpp',
|
||||||
'GonkCameraHwMgr.cpp',
|
'GonkCameraHwMgr.cpp',
|
||||||
'GonkNativeWindow.cpp',
|
|
||||||
'GonkNativeWindowClient.cpp',
|
|
||||||
'GonkRecorder.cpp',
|
'GonkRecorder.cpp',
|
||||||
'GonkCameraSource.cpp',
|
'GonkCameraSource.cpp',
|
||||||
'AudioParameter.cpp',
|
'AudioParameter.cpp',
|
||||||
'GonkRecorderProfiles.cpp',
|
'GonkRecorderProfiles.cpp',
|
||||||
]
|
]
|
||||||
elif CONFIG['MOZ_OMX_DECODER']:
|
|
||||||
CPP_SOURCES += [
|
|
||||||
'FallbackCameraManager.cpp',
|
|
||||||
'FallbackCameraControl.cpp',
|
|
||||||
'GonkNativeWindow.cpp',
|
|
||||||
'GonkNativeWindowClient.cpp',
|
|
||||||
]
|
|
||||||
else:
|
else:
|
||||||
CPP_SOURCES += [
|
CPP_SOURCES += [
|
||||||
'FallbackCameraManager.cpp',
|
'FallbackCameraManager.cpp',
|
||||||
|
|
|
@ -405,6 +405,13 @@ child:
|
||||||
*/
|
*/
|
||||||
Destroy();
|
Destroy();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell the child side if it has to update it's touchable region
|
||||||
|
* to the parent.
|
||||||
|
*/
|
||||||
|
SetUpdateHitRegion(bool aEnabled);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: write protocol!
|
* FIXME: write protocol!
|
||||||
|
|
||||||
|
|
|
@ -294,6 +294,7 @@ TabChild::TabChild(ContentChild* aManager, const TabContext& aContext, uint32_t
|
||||||
, mContentDocumentIsDisplayed(false)
|
, mContentDocumentIsDisplayed(false)
|
||||||
, mTriedBrowserInit(false)
|
, mTriedBrowserInit(false)
|
||||||
, mOrientation(eScreenOrientation_PortraitPrimary)
|
, mOrientation(eScreenOrientation_PortraitPrimary)
|
||||||
|
, mUpdateHitRegion(false)
|
||||||
{
|
{
|
||||||
printf("creating %d!\n", NS_IsMainThread());
|
printf("creating %d!\n", NS_IsMainThread());
|
||||||
}
|
}
|
||||||
|
@ -2142,6 +2143,13 @@ TabChild::RecvDestroy()
|
||||||
return Send__delete__(this);
|
return Send__delete__(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TabChild::RecvSetUpdateHitRegion(const bool& aEnabled)
|
||||||
|
{
|
||||||
|
mUpdateHitRegion = aEnabled;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
PRenderFrameChild*
|
PRenderFrameChild*
|
||||||
TabChild::AllocPRenderFrameChild(ScrollingBehavior* aScrolling,
|
TabChild::AllocPRenderFrameChild(ScrollingBehavior* aScrolling,
|
||||||
TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
||||||
|
@ -2353,6 +2361,12 @@ TabChild::MakeHidden()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TabChild::UpdateHitRegion(const nsRegion& aRegion)
|
||||||
|
{
|
||||||
|
mRemoteFrame->SendUpdateHitRegion(aRegion);
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
TabChild::GetMessageManager(nsIContentFrameMessageManager** aResult)
|
TabChild::GetMessageManager(nsIContentFrameMessageManager** aResult)
|
||||||
{
|
{
|
||||||
|
|
|
@ -340,12 +340,17 @@ public:
|
||||||
|
|
||||||
ContentChild* Manager() { return mManager; }
|
ContentChild* Manager() { return mManager; }
|
||||||
|
|
||||||
|
bool GetUpdateHitRegion() { return mUpdateHitRegion; }
|
||||||
|
|
||||||
|
void UpdateHitRegion(const nsRegion& aRegion);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual PRenderFrameChild* AllocPRenderFrameChild(ScrollingBehavior* aScrolling,
|
virtual PRenderFrameChild* AllocPRenderFrameChild(ScrollingBehavior* aScrolling,
|
||||||
TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
||||||
uint64_t* aLayersId) MOZ_OVERRIDE;
|
uint64_t* aLayersId) MOZ_OVERRIDE;
|
||||||
virtual bool DeallocPRenderFrameChild(PRenderFrameChild* aFrame) MOZ_OVERRIDE;
|
virtual bool DeallocPRenderFrameChild(PRenderFrameChild* aFrame) MOZ_OVERRIDE;
|
||||||
virtual bool RecvDestroy() MOZ_OVERRIDE;
|
virtual bool RecvDestroy() MOZ_OVERRIDE;
|
||||||
|
virtual bool RecvSetUpdateHitRegion(const bool& aEnabled) MOZ_OVERRIDE;
|
||||||
|
|
||||||
nsEventStatus DispatchWidgetEvent(nsGUIEvent& event);
|
nsEventStatus DispatchWidgetEvent(nsGUIEvent& event);
|
||||||
|
|
||||||
|
@ -471,6 +476,7 @@ private:
|
||||||
bool mContentDocumentIsDisplayed;
|
bool mContentDocumentIsDisplayed;
|
||||||
bool mTriedBrowserInit;
|
bool mTriedBrowserInit;
|
||||||
ScreenOrientation mOrientation;
|
ScreenOrientation mOrientation;
|
||||||
|
bool mUpdateHitRegion;
|
||||||
|
|
||||||
DISALLOW_EVIL_CONSTRUCTORS(TabChild);
|
DISALLOW_EVIL_CONSTRUCTORS(TabChild);
|
||||||
};
|
};
|
||||||
|
|
|
@ -49,6 +49,9 @@ this.SystemMessagePermissionsTable = {
|
||||||
"bluetooth-hfp-status-changed": {
|
"bluetooth-hfp-status-changed": {
|
||||||
"bluetooth": []
|
"bluetooth": []
|
||||||
},
|
},
|
||||||
|
"bluetooth-hid-status-changed": {
|
||||||
|
"bluetooth": []
|
||||||
|
},
|
||||||
"bluetooth-sco-status-changed": {
|
"bluetooth-sco-status-changed": {
|
||||||
"bluetooth": []
|
"bluetooth": []
|
||||||
},
|
},
|
||||||
|
|
|
@ -82,10 +82,8 @@ const RIL_IPC_MSG_NAMES = [
|
||||||
"RIL:CardLockResult",
|
"RIL:CardLockResult",
|
||||||
"RIL:CardLockRetryCount",
|
"RIL:CardLockRetryCount",
|
||||||
"RIL:USSDReceived",
|
"RIL:USSDReceived",
|
||||||
"RIL:SendMMI:Return:OK",
|
"RIL:SendMMI",
|
||||||
"RIL:SendMMI:Return:KO",
|
"RIL:CancelMMI",
|
||||||
"RIL:CancelMMI:Return:OK",
|
|
||||||
"RIL:CancelMMI:Return:KO",
|
|
||||||
"RIL:StkCommand",
|
"RIL:StkCommand",
|
||||||
"RIL:StkSessionEnd",
|
"RIL:StkSessionEnd",
|
||||||
"RIL:DataError",
|
"RIL:DataError",
|
||||||
|
@ -1521,10 +1519,8 @@ RILContentHelper.prototype = {
|
||||||
[data.message, data.sessionEnded]);
|
[data.message, data.sessionEnded]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "RIL:SendMMI:Return:OK":
|
case "RIL:SendMMI":
|
||||||
case "RIL:CancelMMI:Return:OK":
|
case "RIL:CancelMMI":
|
||||||
case "RIL:SendMMI:Return:KO":
|
|
||||||
case "RIL:CancelMMI:Return:KO":
|
|
||||||
this.handleSendCancelMMI(msg.json);
|
this.handleSendCancelMMI(msg.json);
|
||||||
break;
|
break;
|
||||||
case "RIL:StkCommand":
|
case "RIL:StkCommand":
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -28,6 +28,7 @@
|
||||||
#include "mozilla/ipc/Netd.h"
|
#include "mozilla/ipc/Netd.h"
|
||||||
#include "AutoMounter.h"
|
#include "AutoMounter.h"
|
||||||
#include "TimeZoneSettingObserver.h"
|
#include "TimeZoneSettingObserver.h"
|
||||||
|
#include "AudioManager.h"
|
||||||
#endif
|
#endif
|
||||||
#include "mozilla/ipc/Ril.h"
|
#include "mozilla/ipc/Ril.h"
|
||||||
#include "nsIObserverService.h"
|
#include "nsIObserverService.h"
|
||||||
|
@ -347,6 +348,8 @@ SystemWorkerManager::Init()
|
||||||
InitializeTimeZoneSettingObserver();
|
InitializeTimeZoneSettingObserver();
|
||||||
rv = InitNetd(cx);
|
rv = InitNetd(cx);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
nsCOMPtr<nsIAudioManager> audioManager =
|
||||||
|
do_GetService(NS_AUDIOMANAGER_CONTRACTID);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nsCOMPtr<nsIObserverService> obs =
|
nsCOMPtr<nsIObserverService> obs =
|
||||||
|
|
|
@ -1383,9 +1383,9 @@ let RIL = {
|
||||||
*/
|
*/
|
||||||
readICCContacts: function readICCContacts(options) {
|
readICCContacts: function readICCContacts(options) {
|
||||||
if (!this.appType) {
|
if (!this.appType) {
|
||||||
options.rilMessageType = "icccontacts";
|
|
||||||
options.errorMsg = GECKO_ERROR_REQUEST_NOT_SUPPORTED;
|
options.errorMsg = GECKO_ERROR_REQUEST_NOT_SUPPORTED;
|
||||||
this.sendChromeMessage(options);
|
this.sendChromeMessage(options);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ICCContactHelper.readICCContacts(
|
ICCContactHelper.readICCContacts(
|
||||||
|
@ -1393,12 +1393,10 @@ let RIL = {
|
||||||
options.contactType,
|
options.contactType,
|
||||||
function onsuccess(contacts) {
|
function onsuccess(contacts) {
|
||||||
// Reuse 'options' to get 'requestId' and 'contactType'.
|
// Reuse 'options' to get 'requestId' and 'contactType'.
|
||||||
options.rilMessageType = "icccontacts";
|
|
||||||
options.contacts = contacts;
|
options.contacts = contacts;
|
||||||
RIL.sendChromeMessage(options);
|
RIL.sendChromeMessage(options);
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
function onerror(errorMsg) {
|
function onerror(errorMsg) {
|
||||||
options.rilMessageType = "icccontacts";
|
|
||||||
options.errorMsg = errorMsg;
|
options.errorMsg = errorMsg;
|
||||||
RIL.sendChromeMessage(options);
|
RIL.sendChromeMessage(options);
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
@ -1415,12 +1413,10 @@ let RIL = {
|
||||||
updateICCContact: function updateICCContact(options) {
|
updateICCContact: function updateICCContact(options) {
|
||||||
let onsuccess = function onsuccess() {
|
let onsuccess = function onsuccess() {
|
||||||
// Reuse 'options' to get 'requestId' and 'contactType'.
|
// Reuse 'options' to get 'requestId' and 'contactType'.
|
||||||
options.rilMessageType = "icccontactupdate";
|
|
||||||
RIL.sendChromeMessage(options);
|
RIL.sendChromeMessage(options);
|
||||||
}.bind(this);
|
}.bind(this);
|
||||||
|
|
||||||
let onerror = function onerror(errorMsg) {
|
let onerror = function onerror(errorMsg) {
|
||||||
options.rilMessageType = "icccontactupdate";
|
|
||||||
options.errorMsg = errorMsg;
|
options.errorMsg = errorMsg;
|
||||||
RIL.sendChromeMessage(options);
|
RIL.sendChromeMessage(options);
|
||||||
}.bind(this);
|
}.bind(this);
|
||||||
|
@ -2076,12 +2072,16 @@ let RIL = {
|
||||||
try {
|
try {
|
||||||
let str = options.searchListStr;
|
let str = options.searchListStr;
|
||||||
this.cellBroadcastConfigs.MMI = this._convertCellBroadcastSearchList(str);
|
this.cellBroadcastConfigs.MMI = this._convertCellBroadcastSearchList(str);
|
||||||
|
options.success = true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
debug("Invalid Cell Broadcast search list: " + e);
|
debug("Invalid Cell Broadcast search list: " + e);
|
||||||
}
|
}
|
||||||
options.rilRequestError = ERROR_GENERIC_FAILURE;
|
options.success = false;
|
||||||
this.sendChromeMessage(options);
|
}
|
||||||
|
|
||||||
|
this.sendChromeMessage(options);
|
||||||
|
if (!options.success) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2420,7 +2420,6 @@ let RIL = {
|
||||||
|
|
||||||
let _sendMMIError = (function _sendMMIError(errorMsg, mmiServiceCode) {
|
let _sendMMIError = (function _sendMMIError(errorMsg, mmiServiceCode) {
|
||||||
options.success = false;
|
options.success = false;
|
||||||
options.rilMessageType = "sendMMI";
|
|
||||||
options.errorMsg = errorMsg;
|
options.errorMsg = errorMsg;
|
||||||
if (mmiServiceCode) {
|
if (mmiServiceCode) {
|
||||||
options.mmiServiceCode = mmiServiceCode;
|
options.mmiServiceCode = mmiServiceCode;
|
||||||
|
@ -2484,8 +2483,6 @@ let RIL = {
|
||||||
debug("MMI " + JSON.stringify(mmi));
|
debug("MMI " + JSON.stringify(mmi));
|
||||||
}
|
}
|
||||||
|
|
||||||
options.rilMessageType = "sendMMI";
|
|
||||||
|
|
||||||
// We check if the MMI service code is supported and in that case we
|
// We check if the MMI service code is supported and in that case we
|
||||||
// trigger the appropriate RIL request if possible.
|
// trigger the appropriate RIL request if possible.
|
||||||
let sc = mmi.serviceCode;
|
let sc = mmi.serviceCode;
|
||||||
|
@ -2514,8 +2511,7 @@ let RIL = {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
options.rilMessageType = "setCallForward";
|
options.isSetCallForward = true;
|
||||||
options.isSendMMI = true;
|
|
||||||
options.timeSeconds = mmi.sic;
|
options.timeSeconds = mmi.sic;
|
||||||
this.setCallForward(options);
|
this.setCallForward(options);
|
||||||
return;
|
return;
|
||||||
|
@ -2592,7 +2588,7 @@ let RIL = {
|
||||||
case MMI_SC_IMEI:
|
case MMI_SC_IMEI:
|
||||||
// A device's IMEI can't change, so we only need to request it once.
|
// A device's IMEI can't change, so we only need to request it once.
|
||||||
if (this.IMEI == null) {
|
if (this.IMEI == null) {
|
||||||
this.getIMEI({mmi: true});
|
this.getIMEI(options);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// If we already had the device's IMEI, we just send it to chrome.
|
// If we already had the device's IMEI, we just send it to chrome.
|
||||||
|
@ -2634,8 +2630,7 @@ let RIL = {
|
||||||
_sendMMIError(MMI_ERROR_KS_NOT_SUPPORTED, MMI_KS_SC_CLIR);
|
_sendMMIError(MMI_ERROR_KS_NOT_SUPPORTED, MMI_KS_SC_CLIR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
options.rilMessageType = "setCLIR";
|
options.isSetCLIR = true;
|
||||||
options.isSendMMI = true;
|
|
||||||
this.setCLIR(options);
|
this.setCLIR(options);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2656,7 +2651,8 @@ let RIL = {
|
||||||
if (mmi.procedure === MMI_PROCEDURE_INTERROGATION) {
|
if (mmi.procedure === MMI_PROCEDURE_INTERROGATION) {
|
||||||
this.queryICCFacilityLock(options);
|
this.queryICCFacilityLock(options);
|
||||||
return;
|
return;
|
||||||
} else if (mmi.procedure === MMI_PROCEDURE_ACTIVATION) {
|
}
|
||||||
|
if (mmi.procedure === MMI_PROCEDURE_ACTIVATION) {
|
||||||
options.enabled = 1;
|
options.enabled = 1;
|
||||||
} else if (mmi.procedure === MMI_PROCEDURE_DEACTIVATION) {
|
} else if (mmi.procedure === MMI_PROCEDURE_DEACTIVATION) {
|
||||||
options.enabled = 0;
|
options.enabled = 0;
|
||||||
|
@ -2725,7 +2721,7 @@ let RIL = {
|
||||||
Buf.newParcel(REQUEST_QUERY_CALL_FORWARD_STATUS, options);
|
Buf.newParcel(REQUEST_QUERY_CALL_FORWARD_STATUS, options);
|
||||||
Buf.writeUint32(CALL_FORWARD_ACTION_QUERY_STATUS);
|
Buf.writeUint32(CALL_FORWARD_ACTION_QUERY_STATUS);
|
||||||
Buf.writeUint32(options.reason);
|
Buf.writeUint32(options.reason);
|
||||||
Buf.writeUint32(options.serviceClass);
|
Buf.writeUint32(options.serviceClass || ICC_SERVICE_CLASS_NONE);
|
||||||
Buf.writeUint32(this._toaFromString(options.number));
|
Buf.writeUint32(this._toaFromString(options.number));
|
||||||
Buf.writeString(options.number);
|
Buf.writeString(options.number);
|
||||||
Buf.writeUint32(0);
|
Buf.writeUint32(0);
|
||||||
|
@ -2795,7 +2791,7 @@ let RIL = {
|
||||||
* Does use have confirmed the call requested from ICC?
|
* Does use have confirmed the call requested from ICC?
|
||||||
*/
|
*/
|
||||||
stkHandleCallSetup: function stkHandleCallSetup(options) {
|
stkHandleCallSetup: function stkHandleCallSetup(options) {
|
||||||
Buf.newParcel(REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM, options);
|
Buf.newParcel(REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM);
|
||||||
Buf.writeUint32(1);
|
Buf.writeUint32(1);
|
||||||
Buf.writeUint32(options.hasConfirmed ? 1 : 0);
|
Buf.writeUint32(options.hasConfirmed ? 1 : 0);
|
||||||
Buf.sendParcel();
|
Buf.sendParcel();
|
||||||
|
@ -4375,8 +4371,8 @@ let RIL = {
|
||||||
? GECKO_SMS_DELIVERY_STATUS_SUCCESS
|
? GECKO_SMS_DELIVERY_STATUS_SUCCESS
|
||||||
: GECKO_SMS_DELIVERY_STATUS_ERROR;
|
: GECKO_SMS_DELIVERY_STATUS_ERROR;
|
||||||
this.sendChromeMessage({
|
this.sendChromeMessage({
|
||||||
rilMessageType: "sms-delivery",
|
rilMessageType: options.rilMessageType,
|
||||||
envelopeId: options.envelopeId,
|
rilMessageToken: options.rilMessageToken,
|
||||||
deliveryStatus: deliveryStatus
|
deliveryStatus: deliveryStatus
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -4492,8 +4488,8 @@ let RIL = {
|
||||||
// Fall through.
|
// Fall through.
|
||||||
default:
|
default:
|
||||||
this.sendChromeMessage({
|
this.sendChromeMessage({
|
||||||
rilMessageType: "sms-send-failed",
|
rilMessageType: options.rilMessageType,
|
||||||
envelopeId: options.envelopeId,
|
rilMessageToken: options.rilMessageToken,
|
||||||
errorMsg: options.rilRequestError,
|
errorMsg: options.rilRequestError,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
@ -4517,8 +4513,8 @@ let RIL = {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendChromeMessage({
|
this.sendChromeMessage({
|
||||||
rilMessageType: "sms-sent",
|
rilMessageType: options.rilMessageType,
|
||||||
envelopeId: options.envelopeId,
|
rilMessageToken: options.rilMessageToken,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -5403,8 +5399,7 @@ RIL[REQUEST_SET_CLIR] = function REQUEST_SET_CLIR(length, options) {
|
||||||
options.success = (options.rilRequestError === 0);
|
options.success = (options.rilRequestError === 0);
|
||||||
if (!options.success) {
|
if (!options.success) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
}
|
} else if (options.rilMessageType === "sendMMI") {
|
||||||
if (options.success && options.isSendMMI) {
|
|
||||||
switch (options.procedure) {
|
switch (options.procedure) {
|
||||||
case MMI_PROCEDURE_ACTIVATION:
|
case MMI_PROCEDURE_ACTIVATION:
|
||||||
options.statusMessage = MMI_SM_KS_SERVICE_ENABLED;
|
options.statusMessage = MMI_SM_KS_SERVICE_ENABLED;
|
||||||
|
@ -5462,8 +5457,7 @@ RIL[REQUEST_SET_CALL_FORWARD] =
|
||||||
options.success = (options.rilRequestError === 0);
|
options.success = (options.rilRequestError === 0);
|
||||||
if (!options.success) {
|
if (!options.success) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
}
|
} else if (options.rilMessageType === "sendMMI") {
|
||||||
if (options.success && options.isSendMMI) {
|
|
||||||
switch (options.action) {
|
switch (options.action) {
|
||||||
case CALL_FORWARD_ACTION_ENABLE:
|
case CALL_FORWARD_ACTION_ENABLE:
|
||||||
options.statusMessage = MMI_SM_KS_SERVICE_ENABLED;
|
options.statusMessage = MMI_SM_KS_SERVICE_ENABLED;
|
||||||
|
@ -5506,12 +5500,10 @@ RIL[REQUEST_SMS_ACKNOWLEDGE] = null;
|
||||||
RIL[REQUEST_GET_IMEI] = function REQUEST_GET_IMEI(length, options) {
|
RIL[REQUEST_GET_IMEI] = function REQUEST_GET_IMEI(length, options) {
|
||||||
this.IMEI = Buf.readString();
|
this.IMEI = Buf.readString();
|
||||||
// So far we only send the IMEI back to chrome if it was requested via MMI.
|
// So far we only send the IMEI back to chrome if it was requested via MMI.
|
||||||
if (!options.mmi) {
|
if (options.rilMessageType !== "sendMMI") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
options.mmiServiceCode = MMI_KS_SC_IMEI;
|
|
||||||
options.rilMessageType = "sendMMI";
|
|
||||||
options.success = (options.rilRequestError === 0);
|
options.success = (options.rilRequestError === 0);
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
if ((!options.success || this.IMEI == null) && !options.errorMsg) {
|
if ((!options.success || this.IMEI == null) && !options.errorMsg) {
|
||||||
|
@ -5667,8 +5659,6 @@ RIL[REQUEST_QUERY_NETWORK_SELECTION_MODE] = function REQUEST_QUERY_NETWORK_SELEC
|
||||||
RIL[REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = function REQUEST_SET_NETWORK_SELECTION_AUTOMATIC(length, options) {
|
RIL[REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = function REQUEST_SET_NETWORK_SELECTION_AUTOMATIC(length, options) {
|
||||||
if (options.rilRequestError) {
|
if (options.rilRequestError) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
this.sendChromeMessage(options);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendChromeMessage(options);
|
this.sendChromeMessage(options);
|
||||||
|
@ -5676,8 +5666,6 @@ RIL[REQUEST_SET_NETWORK_SELECTION_AUTOMATIC] = function REQUEST_SET_NETWORK_SELE
|
||||||
RIL[REQUEST_SET_NETWORK_SELECTION_MANUAL] = function REQUEST_SET_NETWORK_SELECTION_MANUAL(length, options) {
|
RIL[REQUEST_SET_NETWORK_SELECTION_MANUAL] = function REQUEST_SET_NETWORK_SELECTION_MANUAL(length, options) {
|
||||||
if (options.rilRequestError) {
|
if (options.rilRequestError) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
this.sendChromeMessage(options);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendChromeMessage(options);
|
this.sendChromeMessage(options);
|
||||||
|
@ -5685,11 +5673,9 @@ RIL[REQUEST_SET_NETWORK_SELECTION_MANUAL] = function REQUEST_SET_NETWORK_SELECTI
|
||||||
RIL[REQUEST_QUERY_AVAILABLE_NETWORKS] = function REQUEST_QUERY_AVAILABLE_NETWORKS(length, options) {
|
RIL[REQUEST_QUERY_AVAILABLE_NETWORKS] = function REQUEST_QUERY_AVAILABLE_NETWORKS(length, options) {
|
||||||
if (options.rilRequestError) {
|
if (options.rilRequestError) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
this.sendChromeMessage(options);
|
} else {
|
||||||
return;
|
options.networks = this._processNetworks();
|
||||||
}
|
}
|
||||||
|
|
||||||
options.networks = this._processNetworks();
|
|
||||||
this.sendChromeMessage(options);
|
this.sendChromeMessage(options);
|
||||||
};
|
};
|
||||||
RIL[REQUEST_DTMF_START] = null;
|
RIL[REQUEST_DTMF_START] = null;
|
||||||
|
@ -5857,11 +5843,8 @@ RIL[REQUEST_SET_PREFERRED_NETWORK_TYPE] = function REQUEST_SET_PREFERRED_NETWORK
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendChromeMessage({
|
options.success = (options.rilRequestError == ERROR_SUCCESS);
|
||||||
rilMessageType: "setPreferredNetworkType",
|
this.sendChromeMessage(options);
|
||||||
networkType: options.networkType,
|
|
||||||
success: options.rilRequestError == ERROR_SUCCESS
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
RIL[REQUEST_GET_PREFERRED_NETWORK_TYPE] = function REQUEST_GET_PREFERRED_NETWORK_TYPE(length, options) {
|
RIL[REQUEST_GET_PREFERRED_NETWORK_TYPE] = function REQUEST_GET_PREFERRED_NETWORK_TYPE(length, options) {
|
||||||
let networkType;
|
let networkType;
|
||||||
|
@ -5885,21 +5868,16 @@ RIL[REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE] = null;
|
||||||
RIL[REQUEST_CDMA_SET_ROAMING_PREFERENCE] = function REQUEST_CDMA_SET_ROAMING_PREFERENCE(length, options) {
|
RIL[REQUEST_CDMA_SET_ROAMING_PREFERENCE] = function REQUEST_CDMA_SET_ROAMING_PREFERENCE(length, options) {
|
||||||
if (options.rilRequestError) {
|
if (options.rilRequestError) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
this.sendChromeMessage(options);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendChromeMessage(options);
|
this.sendChromeMessage(options);
|
||||||
};
|
};
|
||||||
RIL[REQUEST_CDMA_QUERY_ROAMING_PREFERENCE] = function REQUEST_CDMA_QUERY_ROAMING_PREFERENCE(length, options) {
|
RIL[REQUEST_CDMA_QUERY_ROAMING_PREFERENCE] = function REQUEST_CDMA_QUERY_ROAMING_PREFERENCE(length, options) {
|
||||||
if (options.rilRequestError) {
|
if (options.rilRequestError) {
|
||||||
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
options.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
|
||||||
this.sendChromeMessage(options);
|
} else {
|
||||||
return;
|
let mode = Buf.readUint32List();
|
||||||
|
options.mode = CDMA_ROAMING_PREFERENCE_TO_GECKO[mode[0]];
|
||||||
}
|
}
|
||||||
|
|
||||||
let mode = Buf.readUint32List();
|
|
||||||
options.mode = CDMA_ROAMING_PREFERENCE_TO_GECKO[mode[0]];
|
|
||||||
this.sendChromeMessage(options);
|
this.sendChromeMessage(options);
|
||||||
};
|
};
|
||||||
RIL[REQUEST_SET_TTY_MODE] = null;
|
RIL[REQUEST_SET_TTY_MODE] = null;
|
||||||
|
|
|
@ -763,24 +763,24 @@ struct ParamTraits<nsIntRect>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<typename Region, typename Rect, typename Iter>
|
||||||
struct ParamTraits<nsIntRegion>
|
struct RegionParamTraits
|
||||||
{
|
{
|
||||||
typedef nsIntRegion paramType;
|
typedef Region paramType;
|
||||||
|
|
||||||
static void Write(Message* msg, const paramType& param)
|
static void Write(Message* msg, const paramType& param)
|
||||||
{
|
{
|
||||||
nsIntRegionRectIterator it(param);
|
Iter it(param);
|
||||||
while (const nsIntRect* r = it.Next())
|
while (const Rect* r = it.Next())
|
||||||
WriteParam(msg, *r);
|
WriteParam(msg, *r);
|
||||||
// empty rects are sentinel values because nsRegions will never
|
// empty rects are sentinel values because nsRegions will never
|
||||||
// contain them
|
// contain them
|
||||||
WriteParam(msg, nsIntRect());
|
WriteParam(msg, Rect());
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool Read(const Message* msg, void** iter, paramType* result)
|
static bool Read(const Message* msg, void** iter, paramType* result)
|
||||||
{
|
{
|
||||||
nsIntRect rect;
|
Rect rect;
|
||||||
while (ReadParam(msg, iter, &rect)) {
|
while (ReadParam(msg, iter, &rect)) {
|
||||||
if (rect.IsEmpty())
|
if (rect.IsEmpty())
|
||||||
return true;
|
return true;
|
||||||
|
@ -790,6 +790,11 @@ struct ParamTraits<nsIntRegion>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct ParamTraits<nsIntRegion>
|
||||||
|
: RegionParamTraits<nsIntRegion, nsIntRect, nsIntRegionRectIterator>
|
||||||
|
{};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct ParamTraits<nsIntSize>
|
struct ParamTraits<nsIntSize>
|
||||||
{
|
{
|
||||||
|
@ -988,6 +993,11 @@ struct ParamTraits<nsRect>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct ParamTraits<nsRegion>
|
||||||
|
: RegionParamTraits<nsRegion, nsRect, nsRegionRectIterator>
|
||||||
|
{};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct ParamTraits<nsID>
|
struct ParamTraits<nsID>
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
#include "BasicLayers.h"
|
#include "BasicLayers.h"
|
||||||
#include "nsBoxFrame.h"
|
#include "nsBoxFrame.h"
|
||||||
#include "nsViewportFrame.h"
|
#include "nsViewportFrame.h"
|
||||||
|
#include "nsSubDocumentFrame.h"
|
||||||
#include "nsSVGEffects.h"
|
#include "nsSVGEffects.h"
|
||||||
#include "nsSVGElement.h"
|
#include "nsSVGElement.h"
|
||||||
#include "nsSVGClipPathFrame.h"
|
#include "nsSVGClipPathFrame.h"
|
||||||
|
@ -1270,6 +1271,17 @@ GetMouseThrough(const nsIFrame* aFrame)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
IsFrameReceivingPointerEvents(nsIFrame* aFrame)
|
||||||
|
{
|
||||||
|
nsSubDocumentFrame* frame = do_QueryFrame(aFrame);
|
||||||
|
if (frame && frame->PassPointerEventsToChildren()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return NS_STYLE_POINTER_EVENTS_NONE !=
|
||||||
|
aFrame->StyleVisibility()->GetEffectivePointerEvents(aFrame);
|
||||||
|
}
|
||||||
|
|
||||||
// A list of frames, and their z depth. Used for sorting
|
// A list of frames, and their z depth. Used for sorting
|
||||||
// the results of hit testing.
|
// the results of hit testing.
|
||||||
struct FramesWithDepth
|
struct FramesWithDepth
|
||||||
|
@ -1352,8 +1364,7 @@ void nsDisplayList::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||||
for (uint32_t j = 0; j < outFrames.Length(); j++) {
|
for (uint32_t j = 0; j < outFrames.Length(); j++) {
|
||||||
nsIFrame *f = outFrames.ElementAt(j);
|
nsIFrame *f = outFrames.ElementAt(j);
|
||||||
// Handle the XUL 'mousethrough' feature and 'pointer-events'.
|
// Handle the XUL 'mousethrough' feature and 'pointer-events'.
|
||||||
if (!GetMouseThrough(f) &&
|
if (!GetMouseThrough(f) && IsFrameReceivingPointerEvents(f)) {
|
||||||
f->StyleVisibility()->GetEffectivePointerEvents(f) != NS_STYLE_POINTER_EVENTS_NONE) {
|
|
||||||
writeFrames->AppendElement(f);
|
writeFrames->AppendElement(f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5489,6 +5489,47 @@ private:
|
||||||
uint32_t mFlags;
|
uint32_t mFlags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class AutoUpdateHitRegion
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AutoUpdateHitRegion(PresShell* aShell, nsIFrame* aFrame)
|
||||||
|
: mShell(aShell), mFrame(aFrame)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
~AutoUpdateHitRegion()
|
||||||
|
{
|
||||||
|
if (XRE_GetProcessType() != GeckoProcessType_Content ||
|
||||||
|
!mFrame || !mShell) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TabChild* tabChild = GetTabChildFrom(mShell);
|
||||||
|
if (!tabChild || !tabChild->GetUpdateHitRegion()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nsRegion region;
|
||||||
|
nsDisplayListBuilder builder(mFrame,
|
||||||
|
nsDisplayListBuilder::EVENT_DELIVERY,
|
||||||
|
/* aBuildCert= */ false);
|
||||||
|
nsDisplayList list;
|
||||||
|
nsAutoTArray<nsIFrame*, 100> outFrames;
|
||||||
|
nsDisplayItem::HitTestState hitTestState;
|
||||||
|
nsRect bounds = mShell->GetPresContext()->GetVisibleArea();
|
||||||
|
builder.EnterPresShell(mFrame, bounds);
|
||||||
|
mFrame->BuildDisplayListForStackingContext(&builder, bounds, &list);
|
||||||
|
builder.LeavePresShell(mFrame, bounds);
|
||||||
|
list.HitTest(&builder, bounds, &hitTestState, &outFrames);
|
||||||
|
list.DeleteAll();
|
||||||
|
for (int32_t i = outFrames.Length() - 1; i >= 0; --i) {
|
||||||
|
region.Or(region, nsLayoutUtils::TransformFrameRectToAncestor(
|
||||||
|
outFrames[i], nsRect(nsPoint(0, 0), outFrames[i]->GetSize()), mFrame));
|
||||||
|
}
|
||||||
|
tabChild->UpdateHitRegion(region);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
PresShell* mShell;
|
||||||
|
nsIFrame* mFrame;
|
||||||
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
PresShell::Paint(nsView* aViewToPaint,
|
PresShell::Paint(nsView* aViewToPaint,
|
||||||
const nsRegion& aDirtyRegion,
|
const nsRegion& aDirtyRegion,
|
||||||
|
@ -5520,6 +5561,7 @@ PresShell::Paint(nsView* aViewToPaint,
|
||||||
didPaintFlags |= PAINT_COMPOSITE;
|
didPaintFlags |= PAINT_COMPOSITE;
|
||||||
}
|
}
|
||||||
nsAutoNotifyDidPaint notifyDidPaint(this, didPaintFlags);
|
nsAutoNotifyDidPaint notifyDidPaint(this, didPaintFlags);
|
||||||
|
AutoUpdateHitRegion updateHitRegion(this, frame);
|
||||||
|
|
||||||
// Whether or not we should set first paint when painting is
|
// Whether or not we should set first paint when painting is
|
||||||
// suppressed is debatable. For now we'll do it because
|
// suppressed is debatable. For now we'll do it because
|
||||||
|
|
|
@ -141,6 +141,7 @@ MOCHITEST_FILES = \
|
||||||
test_bug770106.html \
|
test_bug770106.html \
|
||||||
test_maxLineBoxWidth.html \
|
test_maxLineBoxWidth.html \
|
||||||
test_remote_frame.html \
|
test_remote_frame.html \
|
||||||
|
test_remote_passpointerevents.html \
|
||||||
test_bug842853.html \
|
test_bug842853.html \
|
||||||
test_bug842853-2.html \
|
test_bug842853-2.html \
|
||||||
file_bug842853.sjs \
|
file_bug842853.sjs \
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script type="application/javascript;version=1.7">
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
|
||||||
|
function checkPointerEvents() {
|
||||||
|
let iframe = this;
|
||||||
|
let fRect = iframe.getBoundingClientRect();
|
||||||
|
let e1 = document.elementFromPoint(fRect.left + 10, fRect.top + 10);
|
||||||
|
let e2 = document.elementFromPoint(fRect.left + 110, fRect.top + 110);
|
||||||
|
if (e1 === document.body && e2 === iframe) {
|
||||||
|
is(e1, document.body, "check point in transparent region of the iframe");
|
||||||
|
is(e2, iframe, "check point in opaque region of the iframe");
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SimpleTest.executeSoon(checkPointerEvents.bind(iframe));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function runTest() {
|
||||||
|
let iframe = document.createElement("iframe");
|
||||||
|
SpecialPowers.wrap(iframe).setAttribute('mozbrowser', 'true');
|
||||||
|
SpecialPowers.wrap(iframe).setAttribute('mozpasspointerevents', 'true');
|
||||||
|
SpecialPowers.wrap(iframe).setAttribute('remote', 'true');
|
||||||
|
iframe.style = "border:none; width:400px; height:400px; pointer-events:none";
|
||||||
|
iframe.src = "data:text/html,<html style='pointer-events:none'><div style='margin:100px; width:100px; height:100px; background:yellow; pointer-events:auto'>";
|
||||||
|
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
|
||||||
|
SimpleTest.executeSoon(checkPointerEvents.bind(iframe));
|
||||||
|
}
|
||||||
|
addEventListener("load", function() {
|
||||||
|
SpecialPowers.addPermission("browser", true, document);
|
||||||
|
SpecialPowers.addPermission("embed-apps", true, document);
|
||||||
|
SpecialPowers.pushPrefEnv({
|
||||||
|
"set": [
|
||||||
|
["dom.ipc.browser_frames.oop_by_default", true],
|
||||||
|
["dom.mozBrowserFramesEnabled", true]
|
||||||
|
]
|
||||||
|
}, runTest);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -303,7 +303,11 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||||
if (aBuilder->IsForEventDelivery() && !PassPointerEventsToChildren())
|
if (aBuilder->IsForEventDelivery() && !PassPointerEventsToChildren())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DisplayBorderBackgroundOutline(aBuilder, aLists);
|
// If we are pointer-events:none then we don't need to HitTest background
|
||||||
|
if (!aBuilder->IsForEventDelivery() ||
|
||||||
|
StyleVisibility()->mPointerEvents != NS_STYLE_POINTER_EVENTS_NONE) {
|
||||||
|
DisplayBorderBackgroundOutline(aBuilder, aLists);
|
||||||
|
}
|
||||||
|
|
||||||
if (!mInnerView)
|
if (!mInnerView)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -107,6 +107,12 @@ public:
|
||||||
return !frameLoader || frameLoader->ShouldClampScrollPosition();
|
return !frameLoader || frameLoader->ShouldClampScrollPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if pointer event hit-testing should be allowed to target
|
||||||
|
* content in the subdocument.
|
||||||
|
*/
|
||||||
|
bool PassPointerEventsToChildren();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class AsyncFrameInit;
|
friend class AsyncFrameInit;
|
||||||
|
|
||||||
|
@ -135,12 +141,6 @@ protected:
|
||||||
*/
|
*/
|
||||||
nsIFrame* ObtainIntrinsicSizeFrame();
|
nsIFrame* ObtainIntrinsicSizeFrame();
|
||||||
|
|
||||||
/**
|
|
||||||
* Return true if pointer event hit-testing should be allowed to target
|
|
||||||
* content in the subdocument.
|
|
||||||
*/
|
|
||||||
bool PassPointerEventsToChildren();
|
|
||||||
|
|
||||||
nsRefPtr<nsFrameLoader> mFrameLoader;
|
nsRefPtr<nsFrameLoader> mFrameLoader;
|
||||||
nsView* mInnerView;
|
nsView* mInnerView;
|
||||||
bool mIsInline;
|
bool mIsInline;
|
||||||
|
|
|
@ -8,6 +8,10 @@
|
||||||
include protocol PBrowser;
|
include protocol PBrowser;
|
||||||
include protocol PLayerTransaction;
|
include protocol PLayerTransaction;
|
||||||
|
|
||||||
|
include "nsRegion.h";
|
||||||
|
|
||||||
|
using nsRegion;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace layout {
|
namespace layout {
|
||||||
|
|
||||||
|
@ -44,15 +48,19 @@ parent:
|
||||||
async CancelDefaultPanZoom();
|
async CancelDefaultPanZoom();
|
||||||
async DetectScrollableSubframe();
|
async DetectScrollableSubframe();
|
||||||
|
|
||||||
|
async UpdateHitRegion(nsRegion aRegion);
|
||||||
|
|
||||||
async __delete__();
|
async __delete__();
|
||||||
|
|
||||||
state EMPTY_OR_DIRECT_COMPOSITOR:
|
state EMPTY_OR_DIRECT_COMPOSITOR:
|
||||||
recv PLayerTransaction goto HAVE_CONTENT;
|
recv PLayerTransaction goto HAVE_CONTENT;
|
||||||
recv NotifyCompositorTransaction goto EMPTY_OR_DIRECT_COMPOSITOR;
|
recv NotifyCompositorTransaction goto EMPTY_OR_DIRECT_COMPOSITOR;
|
||||||
|
recv UpdateHitRegion goto EMPTY_OR_DIRECT_COMPOSITOR;
|
||||||
recv __delete__;
|
recv __delete__;
|
||||||
|
|
||||||
state HAVE_CONTENT:
|
state HAVE_CONTENT:
|
||||||
recv NotifyCompositorTransaction goto HAVE_CONTENT;
|
recv NotifyCompositorTransaction goto HAVE_CONTENT;
|
||||||
|
recv UpdateHitRegion goto HAVE_CONTENT;
|
||||||
recv __delete__;
|
recv __delete__;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -624,6 +624,8 @@ RenderFrameParent::RenderFrameParent(nsFrameLoader* aFrameLoader,
|
||||||
CompositorParent::SetControllerForLayerTree(mLayersId, mContentController);
|
CompositorParent::SetControllerForLayerTree(mLayersId, mContentController);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Set a default RenderFrameParent
|
||||||
|
mFrameLoader->SetCurrentRemoteFrame(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
APZCTreeManager*
|
APZCTreeManager*
|
||||||
|
@ -862,6 +864,13 @@ RenderFrameParent::RecvDetectScrollableSubframe()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
RenderFrameParent::RecvUpdateHitRegion(const nsRegion& aRegion)
|
||||||
|
{
|
||||||
|
mTouchRegion = aRegion;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
PLayerTransactionParent*
|
PLayerTransactionParent*
|
||||||
RenderFrameParent::AllocPLayerTransactionParent()
|
RenderFrameParent::AllocPLayerTransactionParent()
|
||||||
{
|
{
|
||||||
|
@ -1007,6 +1016,12 @@ RenderFrameParent::UpdateZoomConstraints(bool aAllowZoom, float aMinZoom, float
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
RenderFrameParent::HitTest(const nsRect& aRect)
|
||||||
|
{
|
||||||
|
return mTouchRegion.Contains(aRect);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace layout
|
} // namespace layout
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
||||||
|
@ -1022,6 +1037,14 @@ nsDisplayRemote::BuildLayer(nsDisplayListBuilder* aBuilder,
|
||||||
return layer.forget();
|
return layer.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nsDisplayRemote::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||||
|
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames)
|
||||||
|
{
|
||||||
|
if (mRemoteFrame->HitTest(aRect)) {
|
||||||
|
aOutFrames->AppendElement(mFrame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsDisplayRemoteShadow::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
nsDisplayRemoteShadow::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||||
|
|
|
@ -104,6 +104,8 @@ public:
|
||||||
|
|
||||||
void UpdateZoomConstraints(bool aAllowZoom, float aMinZoom, float aMaxZoom);
|
void UpdateZoomConstraints(bool aAllowZoom, float aMinZoom, float aMaxZoom);
|
||||||
|
|
||||||
|
bool HitTest(const nsRect& aRect);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
|
void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
@ -112,6 +114,8 @@ protected:
|
||||||
virtual bool RecvCancelDefaultPanZoom() MOZ_OVERRIDE;
|
virtual bool RecvCancelDefaultPanZoom() MOZ_OVERRIDE;
|
||||||
virtual bool RecvDetectScrollableSubframe() MOZ_OVERRIDE;
|
virtual bool RecvDetectScrollableSubframe() MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual bool RecvUpdateHitRegion(const nsRegion& aRegion) MOZ_OVERRIDE;
|
||||||
|
|
||||||
virtual PLayerTransactionParent* AllocPLayerTransactionParent() MOZ_OVERRIDE;
|
virtual PLayerTransactionParent* AllocPLayerTransactionParent() MOZ_OVERRIDE;
|
||||||
virtual bool DeallocPLayerTransactionParent(PLayerTransactionParent* aLayers) MOZ_OVERRIDE;
|
virtual bool DeallocPLayerTransactionParent(PLayerTransactionParent* aLayers) MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
@ -160,6 +164,8 @@ private:
|
||||||
bool mFrameLoaderDestroyed;
|
bool mFrameLoaderDestroyed;
|
||||||
// this is gfxRGBA because that's what ColorLayer wants.
|
// this is gfxRGBA because that's what ColorLayer wants.
|
||||||
gfxRGBA mBackgroundColor;
|
gfxRGBA mBackgroundColor;
|
||||||
|
|
||||||
|
nsRegion mTouchRegion;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace layout
|
} // namespace layout
|
||||||
|
@ -190,6 +196,9 @@ public:
|
||||||
BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager,
|
BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager,
|
||||||
const ContainerParameters& aContainerParameters) MOZ_OVERRIDE;
|
const ContainerParameters& aContainerParameters) MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
||||||
|
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames) MOZ_OVERRIDE;
|
||||||
|
|
||||||
NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE)
|
NS_DISPLAY_DECL_NAME("Remote", TYPE_REMOTE)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -457,6 +457,7 @@ OS_LIBS += \
|
||||||
-lstagefright_omx \
|
-lstagefright_omx \
|
||||||
-lbinder \
|
-lbinder \
|
||||||
-lgui \
|
-lgui \
|
||||||
|
$(DEPTH)/widget/gonk/nativewindow/$(LIB_PREFIX)nativewindow.$(LIB_SUFFIX) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ EXPORTS += [
|
||||||
'OrientationObserver.h',
|
'OrientationObserver.h',
|
||||||
]
|
]
|
||||||
|
|
||||||
DIRS += ['libdisplay']
|
DIRS += ['libdisplay', 'nativewindow']
|
||||||
|
|
||||||
CPP_SOURCES += [
|
CPP_SOURCES += [
|
||||||
'EventHub.cpp',
|
'EventHub.cpp',
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
#include "GonkNativeWindowICS.h"
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
#include "GonkNativeWindowClientICS.h"
|
|
@ -15,8 +15,8 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DOM_CAMERA_GONKNATIVEWINDOWCLIENT_H
|
#ifndef NATIVEWINDOW_GONKNATIVEWINDOWCLIENT_ICS_H
|
||||||
#define DOM_CAMERA_GONKNATIVEWINDOWCLIENT_H
|
#define NATIVEWINDOW_GONKNATIVEWINDOWCLIENT_ICS_H
|
||||||
|
|
||||||
#include <ui/egl/android_natives.h>
|
#include <ui/egl/android_natives.h>
|
||||||
|
|
||||||
|
@ -127,10 +127,10 @@ private:
|
||||||
// member variables are accessed.
|
// member variables are accessed.
|
||||||
mutable Mutex mMutex;
|
mutable Mutex mMutex;
|
||||||
|
|
||||||
bool mConnectedToCpu;
|
bool mConnectedToCpu;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
}; // namespace android
|
}; // namespace android
|
||||||
|
|
||||||
#endif // DOM_CAMERA_GONKNATIVEWINDOWCLIENT_H
|
#endif // NATIVEWINDOW_GONKNATIVEWINDOWCLIENT_ICS_H
|
|
@ -16,7 +16,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "base/basictypes.h"
|
#include "base/basictypes.h"
|
||||||
#include "GonkCameraHwMgr.h"
|
|
||||||
#include "mozilla/layers/ShadowLayers.h"
|
#include "mozilla/layers/ShadowLayers.h"
|
||||||
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
||||||
#include "mozilla/layers/ImageBridgeChild.h"
|
#include "mozilla/layers/ImageBridgeChild.h"
|
|
@ -15,8 +15,8 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DOM_CAMERA_GONKNATIVEWINDOW_H
|
#ifndef NATIVEWINDOW_GONKNATIVEWINDOW_ICS_H
|
||||||
#define DOM_CAMERA_GONKNATIVEWINDOW_H
|
#define NATIVEWINDOW_GONKNATIVEWINDOW_ICS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -349,4 +349,4 @@ protected:
|
||||||
|
|
||||||
}; // namespace android
|
}; // namespace android
|
||||||
|
|
||||||
#endif // DOM_CAMERA_GONKNATIVEWINDOW_H
|
#endif // NATIVEWINDOW_GONKNATIVEWINDOW_ICS_H
|
|
@ -0,0 +1,27 @@
|
||||||
|
# Copyright 2013 Mozilla Foundation and Mozilla contributors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
DEPTH = @DEPTH@
|
||||||
|
topsrcdir = @top_srcdir@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
|
LIBRARY_NAME = nativewindow
|
||||||
|
LIBXUL_LIBRARY = 1
|
||||||
|
FAIL_ON_WARNINGS := 1
|
||||||
|
STL_FLAGS=
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
include $(topsrcdir)/ipc/chromium/chromium-config.mk
|
|
@ -0,0 +1,34 @@
|
||||||
|
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||||
|
# vim: set filetype=python:
|
||||||
|
# Copyright 2013 Mozilla Foundation and Mozilla contributors
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
MODULE = 'nativewindow'
|
||||||
|
|
||||||
|
EXPORTS += [
|
||||||
|
'GonkNativeWindow.h',
|
||||||
|
'GonkNativeWindowClient.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
EXPORTS += [
|
||||||
|
'GonkNativeWindowClientICS.h',
|
||||||
|
'GonkNativeWindowICS.h',
|
||||||
|
]
|
||||||
|
|
||||||
|
if CONFIG['MOZ_B2G_CAMERA'] or CONFIG['MOZ_OMX_DECODER']:
|
||||||
|
CPP_SOURCES += [
|
||||||
|
'GonkNativeWindowICS.cpp',
|
||||||
|
'GonkNativeWindowClientICS.cpp',
|
||||||
|
]
|
||||||
|
|
Загрузка…
Ссылка в новой задаче