mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Merge m-c to s-c.
This commit is contained in:
commit
99b6215a18
175
.gdbinit
Normal file
175
.gdbinit
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
# .gdbinit file for debugging Mozilla
|
||||||
|
|
||||||
|
# Don't stop for the SIG32/33/etc signals that Flash produces
|
||||||
|
handle SIG32 noprint nostop pass
|
||||||
|
handle SIG33 noprint nostop pass
|
||||||
|
handle SIGPIPE noprint nostop pass
|
||||||
|
|
||||||
|
# Show the concrete types behind nsIFoo
|
||||||
|
set print object on
|
||||||
|
|
||||||
|
# run when using the auto-solib-add trick
|
||||||
|
def prun
|
||||||
|
tbreak main
|
||||||
|
run
|
||||||
|
set auto-solib-add 0
|
||||||
|
cont
|
||||||
|
end
|
||||||
|
|
||||||
|
# run -mail, when using the auto-solib-add trick
|
||||||
|
def pmail
|
||||||
|
tbreak main
|
||||||
|
run -mail
|
||||||
|
set auto-solib-add 0
|
||||||
|
cont
|
||||||
|
end
|
||||||
|
|
||||||
|
# Define a "pu" command to display PRUnichar * strings (100 chars max)
|
||||||
|
# Also allows an optional argument for how many chars to print as long as
|
||||||
|
# it's less than 100.
|
||||||
|
def pu
|
||||||
|
set $uni = $arg0
|
||||||
|
if $argc == 2
|
||||||
|
set $limit = $arg1
|
||||||
|
if $limit > 100
|
||||||
|
set $limit = 100
|
||||||
|
end
|
||||||
|
else
|
||||||
|
set $limit = 100
|
||||||
|
end
|
||||||
|
# scratch array with space for 100 chars plus null terminator. Make
|
||||||
|
# sure to not use ' ' as the char so this copy/pastes well.
|
||||||
|
set $scratch = "____________________________________________________________________________________________________"
|
||||||
|
set $i = 0
|
||||||
|
set $scratch_idx = 0
|
||||||
|
while (*$uni && $i++ < $limit)
|
||||||
|
if (*$uni < 0x80)
|
||||||
|
set $scratch[$scratch_idx++] = *(char*)$uni++
|
||||||
|
else
|
||||||
|
if ($scratch_idx > 0)
|
||||||
|
set $scratch[$scratch_idx] = '\0'
|
||||||
|
print $scratch
|
||||||
|
set $scratch_idx = 0
|
||||||
|
end
|
||||||
|
print /x *(short*)$uni++
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if ($scratch_idx > 0)
|
||||||
|
set $scratch[$scratch_idx] = '\0'
|
||||||
|
print $scratch
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Define a "ps" command to display subclasses of nsAC?String. Note that
|
||||||
|
# this assumes strings as of Gecko 1.9 (well, and probably a few
|
||||||
|
# releases before that as well); going back far enough will get you
|
||||||
|
# to string classes that this function doesn't work for.
|
||||||
|
def ps
|
||||||
|
set $str = $arg0
|
||||||
|
if (sizeof(*$str.mData) == 1 && ($str.mFlags & 1) != 0)
|
||||||
|
print $str.mData
|
||||||
|
else
|
||||||
|
pu $str.mData $str.mLength
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Define a "pa" command to display the string value for an nsIAtom
|
||||||
|
def pa
|
||||||
|
set $atom = $arg0
|
||||||
|
if (sizeof(*((&*$atom)->mString)) == 2)
|
||||||
|
pu (&*$atom)->mString
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# define a "pxul" command to display the type of a XUL element from
|
||||||
|
# an nsXULDocument* pointer.
|
||||||
|
def pxul
|
||||||
|
set $p = $arg0
|
||||||
|
print $p->mNodeInfo.mRawPtr->mInner.mName->mStaticAtom->mString
|
||||||
|
end
|
||||||
|
|
||||||
|
# define a "prefcnt" command to display the refcount of an XPCOM obj
|
||||||
|
def prefcnt
|
||||||
|
set $p = $arg0
|
||||||
|
print ((nsPurpleBufferEntry*)$p->mRefCnt.mTagged)->mRefCnt
|
||||||
|
end
|
||||||
|
|
||||||
|
# define a "ptag" command to display the tag name of a content node
|
||||||
|
def ptag
|
||||||
|
set $p = $arg0
|
||||||
|
pa $p->mNodeInfo.mRawPtr->mInner.mName
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
## nsTArray
|
||||||
|
##
|
||||||
|
define ptarray
|
||||||
|
if $argc == 0
|
||||||
|
help ptarray
|
||||||
|
else
|
||||||
|
set $size = $arg0.mHdr->mLength
|
||||||
|
set $capacity = $arg0.mHdr->mCapacity
|
||||||
|
set $size_max = $size - 1
|
||||||
|
set $elts = $arg0.Elements()
|
||||||
|
end
|
||||||
|
if $argc == 1
|
||||||
|
set $i = 0
|
||||||
|
while $i < $size
|
||||||
|
printf "elem[%u]: ", $i
|
||||||
|
p *($elts + $i)
|
||||||
|
set $i++
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if $argc == 2
|
||||||
|
set $idx = $arg1
|
||||||
|
if $idx < 0 || $idx > $size_max
|
||||||
|
printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max
|
||||||
|
else
|
||||||
|
printf "elem[%u]: ", $idx
|
||||||
|
p *($elts + $idx)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if $argc == 3
|
||||||
|
set $start_idx = $arg1
|
||||||
|
set $stop_idx = $arg2
|
||||||
|
if $start_idx > $stop_idx
|
||||||
|
set $tmp_idx = $start_idx
|
||||||
|
set $start_idx = $stop_idx
|
||||||
|
set $stop_idx = $tmp_idx
|
||||||
|
end
|
||||||
|
if $start_idx < 0 || $stop_idx < 0 || $start_idx > $size_max || $stop_idx > $size_max
|
||||||
|
printf "idx1, idx2 are not in acceptable range: [0..%u].\n", $size_max
|
||||||
|
else
|
||||||
|
set $i = $start_idx
|
||||||
|
while $i <= $stop_idx
|
||||||
|
printf "elem[%u]: ", $i
|
||||||
|
p *($elts + $i)
|
||||||
|
set $i++
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if $argc > 0
|
||||||
|
printf "nsTArray length = %u\n", $size
|
||||||
|
printf "nsTArray capacity = %u\n", $capacity
|
||||||
|
printf "Element "
|
||||||
|
whatis *$elts
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
document ptarray
|
||||||
|
Prints nsTArray information.
|
||||||
|
Syntax: ptarray
|
||||||
|
Note: idx, idx1 and idx2 must be in acceptable range [0...size()-1].
|
||||||
|
Examples:
|
||||||
|
ptarray a - Prints tarray content, size, capacity and T typedef
|
||||||
|
ptarray a 0 - Prints element[idx] from tarray
|
||||||
|
ptarray a 1 2 - Prints elements in range [idx1..idx2] from tarray
|
||||||
|
end
|
||||||
|
|
||||||
|
def js
|
||||||
|
call DumpJSStack()
|
||||||
|
end
|
||||||
|
|
||||||
|
def ft
|
||||||
|
call nsFrame::DumpFrameTree($arg0)
|
||||||
|
end
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
# User files that may appear at the root
|
# User files that may appear at the root
|
||||||
^\.mozconfig
|
^\.mozconfig
|
||||||
^mozconfig$
|
^mozconfig*
|
||||||
^configure$
|
^configure$
|
||||||
^config\.cache$
|
^config\.cache$
|
||||||
^config\.log$
|
^config\.log$
|
||||||
@ -44,4 +44,3 @@ _OPT\.OBJ/
|
|||||||
\.project$
|
\.project$
|
||||||
\.cproject$
|
\.cproject$
|
||||||
\.settings/
|
\.settings/
|
||||||
|
|
||||||
|
@ -237,6 +237,10 @@ maybe_clobber_profiledbuild:
|
|||||||
find $(DIST)/$(MOZ_APP_NAME) -name "*.pgc" -exec mv {} $(DIST)/bin \;
|
find $(DIST)/$(MOZ_APP_NAME) -name "*.pgc" -exec mv {} $(DIST)/bin \;
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# put in our default gdbinit so that the gdb debugging experience is happier.
|
||||||
|
libs:: .gdbinit
|
||||||
|
$(INSTALL) $< $(DIST)/bin
|
||||||
|
|
||||||
.PHONY: maybe_clobber_profiledbuild
|
.PHONY: maybe_clobber_profiledbuild
|
||||||
|
|
||||||
# Look for R_386_PC32 relocations in shared libs, these
|
# Look for R_386_PC32 relocations in shared libs, these
|
||||||
|
@ -837,11 +837,11 @@ which is handled in <a
|
|||||||
via the creation of an <a
|
via the creation of an <a
|
||||||
href="http://lxr.mozilla.org/seamonkey/find?string=msaa/nsDocAccessibleWrap">nsDocAccessibleWrap</a>
|
href="http://lxr.mozilla.org/seamonkey/find?string=msaa/nsDocAccessibleWrap">nsDocAccessibleWrap</a>
|
||||||
for an inner window or <a
|
for an inner window or <a
|
||||||
href="http://lxr.mozilla.org/seamonkey/find?string=msaa/nsRootAccessibleWrap">nsRootAccessibleWrap</a>
|
href="http://lxr.mozilla.org/seamonkey/find?string=msaa/RootAccessibleWrap">RootAccessibleWrap</a>
|
||||||
for a top level window. These classes implement both nsIAccessible, our
|
for a top level window. These classes implement both nsIAccessible, our
|
||||||
cross platform API, as well as IAccessible, which is specific to
|
cross platform API, as well as IAccessible, which is specific to
|
||||||
Windows/MSAA/COM. The cross-platform nsDocAccessible and
|
Windows/MSAA/COM. The cross-platform nsDocAccessible and
|
||||||
nsRootAccessible classes they inherit from are then told to start
|
RootAccessible classes they inherit from are then told to start
|
||||||
listening for DOM, page load and scroll events. These events cause
|
listening for DOM, page load and scroll events. These events cause
|
||||||
MSAA-specific events, such as EVENT_OBJECT_FOCUS or
|
MSAA-specific events, such as EVENT_OBJECT_FOCUS or
|
||||||
EVENT_OBJECT_STATECHANGE, to fire on UI and document objects within the
|
EVENT_OBJECT_STATECHANGE, to fire on UI and document objects within the
|
||||||
@ -970,7 +970,7 @@ important one is EVENT_OBJECT_FOCUS.<br>
|
|||||||
</p>
|
</p>
|
||||||
<p>When a potential accessibility-related event occurs within
|
<p>When a potential accessibility-related event occurs within
|
||||||
Mozilla, it is typically listened for by nsDocAccessible or
|
Mozilla, it is typically listened for by nsDocAccessible or
|
||||||
nsRootAccessible. The event listeners on these classes call
|
RootAccessible. The event listeners on these classes call
|
||||||
FireToolkitEvent(), which is implemented for every accessible.
|
FireToolkitEvent(), which is implemented for every accessible.
|
||||||
Eventually, the event ends up at nsDocAccessibleWrap::FireToolkitEvent()
|
Eventually, the event ends up at nsDocAccessibleWrap::FireToolkitEvent()
|
||||||
which calls NotifyWinEvent from the Win32 API. NotifyWinEvent is passed
|
which calls NotifyWinEvent from the Win32 API. NotifyWinEvent is passed
|
||||||
|
@ -52,7 +52,6 @@ CPPSRCS = \
|
|||||||
nsAccessNodeWrap.cpp \
|
nsAccessNodeWrap.cpp \
|
||||||
nsAccessibleWrap.cpp \
|
nsAccessibleWrap.cpp \
|
||||||
nsDocAccessibleWrap.cpp \
|
nsDocAccessibleWrap.cpp \
|
||||||
nsRootAccessibleWrap.cpp \
|
|
||||||
ApplicationAccessibleWrap.cpp \
|
ApplicationAccessibleWrap.cpp \
|
||||||
nsMaiInterfaceComponent.cpp \
|
nsMaiInterfaceComponent.cpp \
|
||||||
nsMaiInterfaceAction.cpp \
|
nsMaiInterfaceAction.cpp \
|
||||||
@ -66,6 +65,7 @@ CPPSRCS = \
|
|||||||
nsMaiInterfaceTable.cpp \
|
nsMaiInterfaceTable.cpp \
|
||||||
nsMaiInterfaceDocument.cpp \
|
nsMaiInterfaceDocument.cpp \
|
||||||
nsMaiInterfaceImage.cpp \
|
nsMaiInterfaceImage.cpp \
|
||||||
|
RootAccessibleWrap.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
@ -74,7 +74,6 @@ EXPORTS = \
|
|||||||
nsAccessNodeWrap.h \
|
nsAccessNodeWrap.h \
|
||||||
nsAccessibleWrap.h \
|
nsAccessibleWrap.h \
|
||||||
nsDocAccessibleWrap.h \
|
nsDocAccessibleWrap.h \
|
||||||
nsRootAccessibleWrap.h \
|
|
||||||
nsTextAccessibleWrap.h \
|
nsTextAccessibleWrap.h \
|
||||||
nsXULMenuAccessibleWrap.h \
|
nsXULMenuAccessibleWrap.h \
|
||||||
nsXULListboxAccessibleWrap.h \
|
nsXULListboxAccessibleWrap.h \
|
||||||
|
@ -38,11 +38,14 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include "nsMai.h"
|
#include "RootAccessibleWrap.h"
|
||||||
#include "nsRootAccessibleWrap.h"
|
|
||||||
|
|
||||||
nsNativeRootAccessibleWrap::nsNativeRootAccessibleWrap(AtkObject *aAccessible):
|
#include "nsMai.h"
|
||||||
nsRootAccessible(nsnull, nsnull, nsnull)
|
|
||||||
|
using namespace mozilla::a11y;
|
||||||
|
|
||||||
|
NativeRootAccessibleWrap::NativeRootAccessibleWrap(AtkObject* aAccessible):
|
||||||
|
RootAccessible(nsnull, nsnull, nsnull)
|
||||||
{
|
{
|
||||||
// XXX: mark the object as defunct to ensure no single internal method is
|
// XXX: mark the object as defunct to ensure no single internal method is
|
||||||
// running on it.
|
// running on it.
|
||||||
@ -52,7 +55,7 @@ nsNativeRootAccessibleWrap::nsNativeRootAccessibleWrap(AtkObject *aAccessible):
|
|||||||
mAtkObject = aAccessible;
|
mAtkObject = aAccessible;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsNativeRootAccessibleWrap::~nsNativeRootAccessibleWrap()
|
NativeRootAccessibleWrap::~NativeRootAccessibleWrap()
|
||||||
{
|
{
|
||||||
g_object_unref(mAtkObject);
|
g_object_unref(mAtkObject);
|
||||||
mAtkObject = nsnull;
|
mAtkObject = nsnull;
|
@ -38,23 +38,30 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#ifndef __NS_ROOT_ACCESSIBLE_WRAP_H__
|
#ifndef mozilla_a11y_RootAccessibleWrap_h__
|
||||||
#define __NS_ROOT_ACCESSIBLE_WRAP_H__
|
#define mozilla_a11y_RootAccessibleWrap_h__
|
||||||
|
|
||||||
#include "nsRootAccessible.h"
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
typedef nsRootAccessible nsRootAccessibleWrap;
|
namespace mozilla {
|
||||||
|
namespace a11y {
|
||||||
|
|
||||||
/* nsNativeRootAccessibleWrap is the accessible class for gtk+ native window.
|
typedef RootAccessible RootAccessibleWrap;
|
||||||
* The instance of nsNativeRootAccessibleWrap is a child of MaiAppRoot instance.
|
|
||||||
|
/* NativeRootAccessibleWrap is the accessible class for gtk+ native window.
|
||||||
|
* The instance of NativeRootAccessibleWrap is a child of MaiAppRoot instance.
|
||||||
* It is added into root when the toplevel window is created, and removed
|
* It is added into root when the toplevel window is created, and removed
|
||||||
* from root when the toplevel window is destroyed.
|
* from root when the toplevel window is destroyed.
|
||||||
*/
|
*/
|
||||||
class nsNativeRootAccessibleWrap: public nsRootAccessible
|
class NativeRootAccessibleWrap : public RootAccessible
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsNativeRootAccessibleWrap(AtkObject *aAccessible);
|
NativeRootAccessibleWrap(AtkObject* aAccessible);
|
||||||
~nsNativeRootAccessibleWrap();
|
virtual ~NativeRootAccessibleWrap();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __NS_ROOT_ACCESSIBLE_WRAP_H__ */
|
} // namespace a11y
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
#endif /* mozilla_a11y_Root_Accessible_Wrap_h__ */
|
||||||
|
|
@ -45,8 +45,7 @@
|
|||||||
#include "InterfaceInitFuncs.h"
|
#include "InterfaceInitFuncs.h"
|
||||||
#include "nsAccUtils.h"
|
#include "nsAccUtils.h"
|
||||||
#include "nsIAccessibleRelation.h"
|
#include "nsIAccessibleRelation.h"
|
||||||
#include "nsRootAccessible.h"
|
#include "RootAccessible.h"
|
||||||
#include "nsDocAccessibleWrap.h"
|
|
||||||
#include "nsIAccessibleValue.h"
|
#include "nsIAccessibleValue.h"
|
||||||
#include "nsMai.h"
|
#include "nsMai.h"
|
||||||
#include "nsMaiHyperlink.h"
|
#include "nsMaiHyperlink.h"
|
||||||
@ -55,6 +54,7 @@
|
|||||||
#include "prprf.h"
|
#include "prprf.h"
|
||||||
#include "nsStateMap.h"
|
#include "nsStateMap.h"
|
||||||
#include "Relation.h"
|
#include "Relation.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
#include "States.h"
|
#include "States.h"
|
||||||
|
|
||||||
#include "mozilla/Util.h"
|
#include "mozilla/Util.h"
|
||||||
@ -729,8 +729,21 @@ getRoleCB(AtkObject *aAtkObj)
|
|||||||
if (aAtkObj->role != ATK_ROLE_INVALID)
|
if (aAtkObj->role != ATK_ROLE_INVALID)
|
||||||
return aAtkObj->role;
|
return aAtkObj->role;
|
||||||
|
|
||||||
return aAtkObj->role =
|
#define ROLE(geckoRole, stringRole, atkRole, macRole, msaaRole, ia2Role) \
|
||||||
static_cast<AtkRole>(nsAccessibleWrap::AtkRoleFor(accWrap->Role()));
|
case roles::geckoRole: \
|
||||||
|
aAtkObj->role = atkRole; \
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (accWrap->Role()) {
|
||||||
|
#include "RoleMap.h"
|
||||||
|
default:
|
||||||
|
MOZ_NOT_REACHED("Unknown role.");
|
||||||
|
aAtkObj->role = ATK_ROLE_UNKNOWN;
|
||||||
|
};
|
||||||
|
|
||||||
|
#undef ROLE
|
||||||
|
|
||||||
|
return aAtkObj->role;
|
||||||
}
|
}
|
||||||
|
|
||||||
AtkAttributeSet*
|
AtkAttributeSet*
|
||||||
@ -1027,7 +1040,7 @@ nsAccessibleWrap::FirePlatformEvent(AccEvent* aEvent)
|
|||||||
case nsIAccessibleEvent::EVENT_FOCUS:
|
case nsIAccessibleEvent::EVENT_FOCUS:
|
||||||
{
|
{
|
||||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_FOCUS\n"));
|
MAI_LOG_DEBUG(("\n\nReceived: EVENT_FOCUS\n"));
|
||||||
nsRootAccessible* rootAccWrap = accWrap->RootAccessible();
|
a11y::RootAccessible* rootAccWrap = accWrap->RootAccessible();
|
||||||
if (rootAccWrap && rootAccWrap->mActivated) {
|
if (rootAccWrap && rootAccWrap->mActivated) {
|
||||||
atk_focus_tracker_notify(atkObj);
|
atk_focus_tracker_notify(atkObj);
|
||||||
// Fire state change event for focus
|
// Fire state change event for focus
|
||||||
@ -1220,9 +1233,7 @@ nsAccessibleWrap::FirePlatformEvent(AccEvent* aEvent)
|
|||||||
case nsIAccessibleEvent::EVENT_WINDOW_ACTIVATE:
|
case nsIAccessibleEvent::EVENT_WINDOW_ACTIVATE:
|
||||||
{
|
{
|
||||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_WINDOW_ACTIVATED\n"));
|
MAI_LOG_DEBUG(("\n\nReceived: EVENT_WINDOW_ACTIVATED\n"));
|
||||||
nsRootAccessible *rootAcc =
|
accessible->AsRoot()->mActivated = true;
|
||||||
static_cast<nsRootAccessible *>(accessible);
|
|
||||||
rootAcc->mActivated = true;
|
|
||||||
guint id = g_signal_lookup ("activate", MAI_TYPE_ATK_OBJECT);
|
guint id = g_signal_lookup ("activate", MAI_TYPE_ATK_OBJECT);
|
||||||
g_signal_emit(atkObj, id, 0);
|
g_signal_emit(atkObj, id, 0);
|
||||||
|
|
||||||
@ -1233,9 +1244,7 @@ nsAccessibleWrap::FirePlatformEvent(AccEvent* aEvent)
|
|||||||
case nsIAccessibleEvent::EVENT_WINDOW_DEACTIVATE:
|
case nsIAccessibleEvent::EVENT_WINDOW_DEACTIVATE:
|
||||||
{
|
{
|
||||||
MAI_LOG_DEBUG(("\n\nReceived: EVENT_WINDOW_DEACTIVATED\n"));
|
MAI_LOG_DEBUG(("\n\nReceived: EVENT_WINDOW_DEACTIVATED\n"));
|
||||||
nsRootAccessible *rootAcc =
|
accessible->AsRoot()->mActivated = false;
|
||||||
static_cast<nsRootAccessible *>(accessible);
|
|
||||||
rootAcc->mActivated = false;
|
|
||||||
guint id = g_signal_lookup ("deactivate", MAI_TYPE_ATK_OBJECT);
|
guint id = g_signal_lookup ("deactivate", MAI_TYPE_ATK_OBJECT);
|
||||||
g_signal_emit(atkObj, id, 0);
|
g_signal_emit(atkObj, id, 0);
|
||||||
} break;
|
} break;
|
||||||
@ -1390,20 +1399,3 @@ nsAccessibleWrap::FireAtkShowHideEvent(AccEvent* aEvent,
|
|||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRUint32
|
|
||||||
nsAccessibleWrap::AtkRoleFor(role aRole)
|
|
||||||
{
|
|
||||||
#define ROLE(geckoRole, stringRole, atkRole, macRole, msaaRole, ia2Role) \
|
|
||||||
case roles::geckoRole: \
|
|
||||||
return atkRole;
|
|
||||||
|
|
||||||
switch (aRole) {
|
|
||||||
#include "RoleMap.h"
|
|
||||||
default:
|
|
||||||
MOZ_NOT_REACHED("Unknown role.");
|
|
||||||
return ATK_ROLE_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef ROLE
|
|
||||||
}
|
|
||||||
|
@ -116,11 +116,6 @@ public:
|
|||||||
return returnedString.get();
|
return returnedString.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Function mapping from cross platform roles to ATK roles.
|
|
||||||
*/
|
|
||||||
static PRUint32 AtkRoleFor(mozilla::a11y::role aRole);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual nsresult FirePlatformEvent(AccEvent* aEvent);
|
virtual nsresult FirePlatformEvent(AccEvent* aEvent);
|
||||||
|
|
||||||
|
@ -45,14 +45,15 @@
|
|||||||
|
|
||||||
#include "nsIPersistentProperties2.h"
|
#include "nsIPersistentProperties2.h"
|
||||||
|
|
||||||
|
using namespace mozilla::a11y;
|
||||||
|
|
||||||
AtkAttributeSet* ConvertToAtkAttributeSet(nsIPersistentProperties* aAttributes);
|
AtkAttributeSet* ConvertToAtkAttributeSet(nsIPersistentProperties* aAttributes);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ConvertTexttoAsterisks(nsAccessibleWrap* accWrap, nsAString& aString)
|
ConvertTexttoAsterisks(nsAccessibleWrap* accWrap, nsAString& aString)
|
||||||
{
|
{
|
||||||
// convert each char to "*" when it's "password text"
|
// convert each char to "*" when it's "password text"
|
||||||
PRUint32 atkRole = nsAccessibleWrap::AtkRoleFor(accWrap->NativeRole());
|
if (accWrap->NativeRole() == roles::PASSWORD_TEXT) {
|
||||||
if (atkRole == ATK_ROLE_PASSWORD_TEXT) {
|
|
||||||
for (PRUint32 i = 0; i < aString.Length(); i++)
|
for (PRUint32 i = 0; i < aString.Length(); i++)
|
||||||
aString.Replace(i, 1, NS_LITERAL_STRING("*"));
|
aString.Replace(i, 1, NS_LITERAL_STRING("*"));
|
||||||
}
|
}
|
||||||
@ -153,18 +154,18 @@ getCharacterAtOffsetCB(AtkText *aText, gint aOffset)
|
|||||||
getter_AddRefs(accText));
|
getter_AddRefs(accText));
|
||||||
NS_ENSURE_TRUE(accText, 0);
|
NS_ENSURE_TRUE(accText, 0);
|
||||||
|
|
||||||
/* PRUnichar is unsigned short in Mozilla */
|
// PRUnichar is unsigned short in Mozilla
|
||||||
/* gnuichar is guint32 in glib */
|
// gnuichar is guint32 in glib
|
||||||
PRUnichar uniChar;
|
PRUnichar uniChar = 0;
|
||||||
nsresult rv =
|
nsresult rv = accText->GetCharacterAtOffset(aOffset, &uniChar);
|
||||||
accText->GetCharacterAtOffset(aOffset, &uniChar);
|
if (NS_FAILED(rv))
|
||||||
|
return 0;
|
||||||
|
|
||||||
// convert char to "*" when it's "password text"
|
// Convert char to "*" when it's "password text".
|
||||||
PRUint32 atkRole = nsAccessibleWrap::AtkRoleFor(accWrap->NativeRole());
|
if (accWrap->NativeRole() == roles::PASSWORD_TEXT)
|
||||||
if (atkRole == ATK_ROLE_PASSWORD_TEXT)
|
|
||||||
uniChar = '*';
|
uniChar = '*';
|
||||||
|
|
||||||
return (NS_FAILED(rv)) ? 0 : static_cast<gunichar>(uniChar);
|
return static_cast<gunichar>(uniChar);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar*
|
static gchar*
|
||||||
|
@ -40,8 +40,8 @@
|
|||||||
#include "Accessible-inl.h"
|
#include "Accessible-inl.h"
|
||||||
#include "nsAccessibilityService.h"
|
#include "nsAccessibilityService.h"
|
||||||
#include "nsAccUtils.h"
|
#include "nsAccUtils.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
#include "nsEventStateManager.h"
|
#include "nsEventStateManager.h"
|
||||||
#include "nsFocusManager.h"
|
#include "nsFocusManager.h"
|
||||||
@ -157,7 +157,7 @@ FocusManager::NotifyOfDOMFocus(nsISupports* aTarget)
|
|||||||
if (document) {
|
if (document) {
|
||||||
// Set selection listener for focused element.
|
// Set selection listener for focused element.
|
||||||
if (targetNode->IsElement()) {
|
if (targetNode->IsElement()) {
|
||||||
nsRootAccessible* root = document->RootAccessible();
|
RootAccessible* root = document->RootAccessible();
|
||||||
nsCaretAccessible* caretAcc = root->GetCaretAccessible();
|
nsCaretAccessible* caretAcc = root->GetCaretAccessible();
|
||||||
caretAcc->SetControlSelectionListener(targetNode->AsElement());
|
caretAcc->SetControlSelectionListener(targetNode->AsElement());
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,6 @@ CPPSRCS = \
|
|||||||
nsAccTreeWalker.cpp \
|
nsAccTreeWalker.cpp \
|
||||||
nsBaseWidgetAccessible.cpp \
|
nsBaseWidgetAccessible.cpp \
|
||||||
nsEventShell.cpp \
|
nsEventShell.cpp \
|
||||||
nsRootAccessible.cpp \
|
|
||||||
nsCaretAccessible.cpp \
|
nsCaretAccessible.cpp \
|
||||||
nsTextAccessible.cpp \
|
nsTextAccessible.cpp \
|
||||||
nsTextEquivUtils.cpp \
|
nsTextEquivUtils.cpp \
|
||||||
|
@ -814,7 +814,7 @@ enum Role {
|
|||||||
/**
|
/**
|
||||||
* Represent a definition in a definition list (dd in HTML)
|
* Represent a definition in a definition list (dd in HTML)
|
||||||
*/
|
*/
|
||||||
DEFINITION = 128,
|
DEFINITION = 128
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace role
|
} // namespace role
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
#include "nsAccessibilityService.h"
|
#include "nsAccessibilityService.h"
|
||||||
#include "nsAccUtils.h"
|
#include "nsAccUtils.h"
|
||||||
#include "nsARIAMap.h"
|
#include "nsARIAMap.h"
|
||||||
#include "nsRootAccessibleWrap.h"
|
#include "RootAccessibleWrap.h"
|
||||||
#include "States.h"
|
#include "States.h"
|
||||||
|
|
||||||
#include "nsCURILoader.h"
|
#include "nsCURILoader.h"
|
||||||
@ -391,7 +391,7 @@ nsAccDocManager::CreateDocOrRootAccessible(nsIDocument *aDocument)
|
|||||||
// We only create root accessibles for the true root, otherwise create a
|
// We only create root accessibles for the true root, otherwise create a
|
||||||
// doc accessible.
|
// doc accessible.
|
||||||
nsRefPtr<nsDocAccessible> docAcc = isRootDoc ?
|
nsRefPtr<nsDocAccessible> docAcc = isRootDoc ?
|
||||||
new nsRootAccessibleWrap(aDocument, rootElm, presShell) :
|
new RootAccessibleWrap(aDocument, rootElm, presShell) :
|
||||||
new nsDocAccessibleWrap(aDocument, rootElm, presShell);
|
new nsDocAccessibleWrap(aDocument, rootElm, presShell);
|
||||||
|
|
||||||
// Cache the document accessible into document cache.
|
// Cache the document accessible into document cache.
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
#include "nsAccessibilityService.h"
|
#include "nsAccessibilityService.h"
|
||||||
#include "nsAccUtils.h"
|
#include "nsAccUtils.h"
|
||||||
#include "nsCoreUtils.h"
|
#include "nsCoreUtils.h"
|
||||||
#include "nsRootAccessible.h"
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
#include "nsIDocShell.h"
|
#include "nsIDocShell.h"
|
||||||
#include "nsIDocShellTreeItem.h"
|
#include "nsIDocShellTreeItem.h"
|
||||||
@ -59,6 +59,8 @@
|
|||||||
#include "nsPresContext.h"
|
#include "nsPresContext.h"
|
||||||
#include "mozilla/Services.h"
|
#include "mozilla/Services.h"
|
||||||
|
|
||||||
|
using namespace mozilla::a11y;
|
||||||
|
|
||||||
/* For documentation of the accessibility architecture,
|
/* For documentation of the accessibility architecture,
|
||||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||||
*/
|
*/
|
||||||
@ -92,9 +94,6 @@ nsAccessNode::
|
|||||||
nsAccessNode(nsIContent* aContent, nsDocAccessible* aDoc) :
|
nsAccessNode(nsIContent* aContent, nsDocAccessible* aDoc) :
|
||||||
mContent(aContent), mDoc(aDoc)
|
mContent(aContent), mDoc(aDoc)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_A11Y
|
|
||||||
mIsInitialized = false;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nsAccessNode::~nsAccessNode()
|
nsAccessNode::~nsAccessNode()
|
||||||
@ -207,7 +206,7 @@ void nsAccessNode::ShutdownXPAccessibility()
|
|||||||
NotifyA11yInitOrShutdown(false);
|
NotifyA11yInitOrShutdown(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRootAccessible*
|
RootAccessible*
|
||||||
nsAccessNode::RootAccessible() const
|
nsAccessNode::RootAccessible() const
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDocShellTreeItem> docShellTreeItem =
|
nsCOMPtr<nsIDocShellTreeItem> docShellTreeItem =
|
||||||
|
@ -57,7 +57,12 @@ class ApplicationAccessible;
|
|||||||
class nsAccessNode;
|
class nsAccessNode;
|
||||||
class nsDocAccessible;
|
class nsDocAccessible;
|
||||||
class nsIAccessibleDocument;
|
class nsIAccessibleDocument;
|
||||||
class nsRootAccessible;
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace a11y {
|
||||||
|
class RootAccessible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class nsIPresShell;
|
class nsIPresShell;
|
||||||
class nsPresContext;
|
class nsPresContext;
|
||||||
@ -93,7 +98,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Return the root document accessible for this accessnode.
|
* Return the root document accessible for this accessnode.
|
||||||
*/
|
*/
|
||||||
nsRootAccessible* RootAccessible() const;
|
mozilla::a11y::RootAccessible* RootAccessible() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the access node object, add it to the cache.
|
* Initialize the access node object, add it to the cache.
|
||||||
|
@ -57,11 +57,11 @@
|
|||||||
#include "nsHTMLTableAccessibleWrap.h"
|
#include "nsHTMLTableAccessibleWrap.h"
|
||||||
#include "nsHTMLTextAccessible.h"
|
#include "nsHTMLTextAccessible.h"
|
||||||
#include "nsHyperTextAccessibleWrap.h"
|
#include "nsHyperTextAccessibleWrap.h"
|
||||||
#include "nsRootAccessibleWrap.h"
|
|
||||||
#include "nsXFormsFormControlsAccessible.h"
|
#include "nsXFormsFormControlsAccessible.h"
|
||||||
#include "nsXFormsWidgetsAccessible.h"
|
#include "nsXFormsWidgetsAccessible.h"
|
||||||
#include "OuterDocAccessible.h"
|
#include "OuterDocAccessible.h"
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "RootAccessibleWrap.h"
|
||||||
#include "States.h"
|
#include "States.h"
|
||||||
#include "Statistics.h"
|
#include "Statistics.h"
|
||||||
#ifdef XP_WIN
|
#ifdef XP_WIN
|
||||||
@ -657,7 +657,7 @@ nsAccessibilityService::PresShellActivated(nsIPresShell* aPresShell)
|
|||||||
if (DOMDoc) {
|
if (DOMDoc) {
|
||||||
nsDocAccessible* document = GetDocAccessibleFromCache(DOMDoc);
|
nsDocAccessible* document = GetDocAccessibleFromCache(DOMDoc);
|
||||||
if (document) {
|
if (document) {
|
||||||
nsRootAccessible* rootDocument = document->RootAccessible();
|
RootAccessible* rootDocument = document->RootAccessible();
|
||||||
NS_ASSERTION(rootDocument, "Entirely broken tree: no root document!");
|
NS_ASSERTION(rootDocument, "Entirely broken tree: no root document!");
|
||||||
if (rootDocument)
|
if (rootDocument)
|
||||||
rootDocument->DocumentActivated(document);
|
rootDocument->DocumentActivated(document);
|
||||||
@ -1735,8 +1735,8 @@ nsAccessibilityService::AddNativeRootAccessible(void* aAtkAccessible)
|
|||||||
if (!applicationAcc)
|
if (!applicationAcc)
|
||||||
return nsnull;
|
return nsnull;
|
||||||
|
|
||||||
nsRefPtr<nsNativeRootAccessibleWrap> nativeRootAcc =
|
nsRefPtr<NativeRootAccessibleWrap> nativeRootAcc =
|
||||||
new nsNativeRootAccessibleWrap((AtkObject*)aAtkAccessible);
|
new NativeRootAccessibleWrap(static_cast<AtkObject*>(aAtkAccessible));
|
||||||
if (!nativeRootAcc)
|
if (!nativeRootAcc)
|
||||||
return nsnull;
|
return nsnull;
|
||||||
|
|
||||||
|
@ -50,10 +50,10 @@
|
|||||||
#include "nsAccTreeWalker.h"
|
#include "nsAccTreeWalker.h"
|
||||||
#include "nsIAccessibleRelation.h"
|
#include "nsIAccessibleRelation.h"
|
||||||
#include "nsEventShell.h"
|
#include "nsEventShell.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsTextEquivUtils.h"
|
#include "nsTextEquivUtils.h"
|
||||||
#include "Relation.h"
|
#include "Relation.h"
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
#include "States.h"
|
#include "States.h"
|
||||||
#include "StyleInfo.h"
|
#include "StyleInfo.h"
|
||||||
|
|
||||||
@ -257,8 +257,7 @@ nsAccessible::GetRootDocument(nsIAccessibleDocument **aRootDocument)
|
|||||||
{
|
{
|
||||||
NS_ENSURE_ARG_POINTER(aRootDocument);
|
NS_ENSURE_ARG_POINTER(aRootDocument);
|
||||||
|
|
||||||
nsRootAccessible* rootDocument = RootAccessible();
|
NS_IF_ADDREF(*aRootDocument = RootAccessible());
|
||||||
NS_IF_ADDREF(*aRootDocument = rootDocument);
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ public:
|
|||||||
inline bool IsMenuPopup() const { return mFlags & eMenuPopupAccessible; }
|
inline bool IsMenuPopup() const { return mFlags & eMenuPopupAccessible; }
|
||||||
|
|
||||||
inline bool IsRoot() const { return mFlags & eRootAccessible; }
|
inline bool IsRoot() const { return mFlags & eRootAccessible; }
|
||||||
nsRootAccessible* AsRoot();
|
mozilla::a11y::RootAccessible* AsRoot();
|
||||||
|
|
||||||
virtual mozilla::a11y::TableAccessible* AsTable() { return nsnull; }
|
virtual mozilla::a11y::TableAccessible* AsTable() { return nsnull; }
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include "nsAccUtils.h"
|
#include "nsAccUtils.h"
|
||||||
#include "nsCoreUtils.h"
|
#include "nsCoreUtils.h"
|
||||||
#include "nsIAccessibleEvent.h"
|
#include "nsIAccessibleEvent.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
#include "nsCaret.h"
|
#include "nsCaret.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
@ -49,15 +50,16 @@
|
|||||||
#include "nsIDOMHTMLTextAreaElement.h"
|
#include "nsIDOMHTMLTextAreaElement.h"
|
||||||
#include "nsIFrame.h"
|
#include "nsIFrame.h"
|
||||||
#include "nsIPresShell.h"
|
#include "nsIPresShell.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsISelectionPrivate.h"
|
#include "nsISelectionPrivate.h"
|
||||||
#include "nsServiceManagerUtils.h"
|
#include "nsServiceManagerUtils.h"
|
||||||
|
|
||||||
class nsIWidget;
|
class nsIWidget;
|
||||||
|
|
||||||
|
using namespace mozilla::a11y;
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS1(nsCaretAccessible, nsISelectionListener)
|
NS_IMPL_ISUPPORTS1(nsCaretAccessible, nsISelectionListener)
|
||||||
|
|
||||||
nsCaretAccessible::nsCaretAccessible( nsRootAccessible *aRootAccessible):
|
nsCaretAccessible::nsCaretAccessible(RootAccessible* aRootAccessible) :
|
||||||
mLastCaretOffset(-1), mRootAccessible(aRootAccessible)
|
mLastCaretOffset(-1), mRootAccessible(aRootAccessible)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -68,8 +70,8 @@ nsCaretAccessible::~nsCaretAccessible()
|
|||||||
|
|
||||||
void nsCaretAccessible::Shutdown()
|
void nsCaretAccessible::Shutdown()
|
||||||
{
|
{
|
||||||
// The caret accessible isn't shut down until the nsRootAccessible owning it is shut down
|
// The caret accessible isn't shut down until the RootAccessible owning it is shut down
|
||||||
// Each nsDocAccessible, including the nsRootAccessible, is responsible for clearing the
|
// Each nsDocAccessible, including the RootAccessible, is responsible for clearing the
|
||||||
// doc selection listeners they registered in this nsCaretAccessible
|
// doc selection listeners they registered in this nsCaretAccessible
|
||||||
|
|
||||||
ClearControlSelectionListener(); // Clear the selection listener for the currently focused control
|
ClearControlSelectionListener(); // Clear the selection listener for the currently focused control
|
||||||
|
@ -43,11 +43,9 @@
|
|||||||
|
|
||||||
#include "nsISelectionListener.h"
|
#include "nsISelectionListener.h"
|
||||||
|
|
||||||
class nsRootAccessible;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This special accessibility class is for the caret, which is really the currently focused selection.
|
* This special accessibility class is for the caret, which is really the currently focused selection.
|
||||||
* There is only 1 visible caret per top level window (nsRootAccessible),
|
* There is only 1 visible caret per top level window (RootAccessible),
|
||||||
* However, there may be several visible selections.
|
* However, there may be several visible selections.
|
||||||
*
|
*
|
||||||
* The important selections are the one owned by each document, and the one in the currently focused control.
|
* The important selections are the one owned by each document, and the one in the currently focused control.
|
||||||
@ -59,8 +57,8 @@ class nsRootAccessible;
|
|||||||
* For ATK and Iaccessible2, the caret accessible is used to fire
|
* For ATK and Iaccessible2, the caret accessible is used to fire
|
||||||
* caret move and selection change events.
|
* caret move and selection change events.
|
||||||
*
|
*
|
||||||
* The caret accessible is owned by the nsRootAccessible for the top level window that it's in.
|
* The caret accessible is owned by the RootAccessible for the top level window that it's in.
|
||||||
* The nsRootAccessible needs to tell the nsCaretAccessible about focus changes via
|
* The RootAccessible needs to tell the nsCaretAccessible about focus changes via
|
||||||
* setControlSelectionListener().
|
* setControlSelectionListener().
|
||||||
* Each nsDocAccessible needs to tell the nsCaretAccessible owned by the root to
|
* Each nsDocAccessible needs to tell the nsCaretAccessible owned by the root to
|
||||||
* listen for selection events via addDocSelectionListener() and then needs to remove the
|
* listen for selection events via addDocSelectionListener() and then needs to remove the
|
||||||
@ -72,7 +70,7 @@ class nsCaretAccessible : public nsISelectionListener
|
|||||||
public:
|
public:
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
nsCaretAccessible(nsRootAccessible *aRootAccessible);
|
nsCaretAccessible(mozilla::a11y::RootAccessible* aRootAccessible);
|
||||||
virtual ~nsCaretAccessible();
|
virtual ~nsCaretAccessible();
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
@ -155,7 +153,7 @@ private:
|
|||||||
nsRefPtr<nsHyperTextAccessible> mLastTextAccessible;
|
nsRefPtr<nsHyperTextAccessible> mLastTextAccessible;
|
||||||
PRInt32 mLastCaretOffset;
|
PRInt32 mLastCaretOffset;
|
||||||
|
|
||||||
nsRootAccessible *mRootAccessible;
|
mozilla::a11y::RootAccessible* mRootAccessible;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -43,9 +43,9 @@
|
|||||||
#include "nsAccessiblePivot.h"
|
#include "nsAccessiblePivot.h"
|
||||||
#include "nsAccTreeWalker.h"
|
#include "nsAccTreeWalker.h"
|
||||||
#include "nsAccUtils.h"
|
#include "nsAccUtils.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsTextEquivUtils.h"
|
#include "nsTextEquivUtils.h"
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
#include "States.h"
|
#include "States.h"
|
||||||
|
|
||||||
#include "nsIMutableArray.h"
|
#include "nsIMutableArray.h"
|
||||||
@ -764,7 +764,7 @@ nsresult nsDocAccessible::AddEventListeners()
|
|||||||
nsCOMPtr<nsIDocShellTreeItem> rootTreeItem;
|
nsCOMPtr<nsIDocShellTreeItem> rootTreeItem;
|
||||||
docShellTreeItem->GetRootTreeItem(getter_AddRefs(rootTreeItem));
|
docShellTreeItem->GetRootTreeItem(getter_AddRefs(rootTreeItem));
|
||||||
if (rootTreeItem) {
|
if (rootTreeItem) {
|
||||||
nsRootAccessible* rootAccessible = RootAccessible();
|
a11y::RootAccessible* rootAccessible = RootAccessible();
|
||||||
NS_ENSURE_TRUE(rootAccessible, NS_ERROR_FAILURE);
|
NS_ENSURE_TRUE(rootAccessible, NS_ERROR_FAILURE);
|
||||||
nsRefPtr<nsCaretAccessible> caretAccessible = rootAccessible->GetCaretAccessible();
|
nsRefPtr<nsCaretAccessible> caretAccessible = rootAccessible->GetCaretAccessible();
|
||||||
if (caretAccessible) {
|
if (caretAccessible) {
|
||||||
@ -811,7 +811,7 @@ nsresult nsDocAccessible::RemoveEventListeners()
|
|||||||
NS_RELEASE_THIS(); // Kung fu death grip
|
NS_RELEASE_THIS(); // Kung fu death grip
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRootAccessible* rootAccessible = RootAccessible();
|
a11y::RootAccessible* rootAccessible = RootAccessible();
|
||||||
if (rootAccessible) {
|
if (rootAccessible) {
|
||||||
nsRefPtr<nsCaretAccessible> caretAccessible = rootAccessible->GetCaretAccessible();
|
nsRefPtr<nsCaretAccessible> caretAccessible = rootAccessible->GetCaretAccessible();
|
||||||
if (caretAccessible)
|
if (caretAccessible)
|
||||||
@ -1767,11 +1767,6 @@ nsDocAccessible::ProcessPendingEvent(AccEvent* aEvent)
|
|||||||
PRInt32 caretOffset;
|
PRInt32 caretOffset;
|
||||||
if (hyperText &&
|
if (hyperText &&
|
||||||
NS_SUCCEEDED(hyperText->GetCaretOffset(&caretOffset))) {
|
NS_SUCCEEDED(hyperText->GetCaretOffset(&caretOffset))) {
|
||||||
#ifdef DEBUG_A11Y
|
|
||||||
PRUnichar chAtOffset;
|
|
||||||
hyperText->GetCharacterAtOffset(caretOffset, &chAtOffset);
|
|
||||||
printf("\nCaret moved to %d with char %c", caretOffset, chAtOffset);
|
|
||||||
#endif
|
|
||||||
nsRefPtr<AccEvent> caretMoveEvent =
|
nsRefPtr<AccEvent> caretMoveEvent =
|
||||||
new AccCaretMoveEvent(hyperText, caretOffset);
|
new AccCaretMoveEvent(hyperText, caretOffset);
|
||||||
nsEventShell::FireEvent(caretMoveEvent);
|
nsEventShell::FireEvent(caretMoveEvent);
|
||||||
|
@ -19,6 +19,7 @@ CPPSRCS = \
|
|||||||
ARIAGridAccessible.cpp \
|
ARIAGridAccessible.cpp \
|
||||||
FormControlAccessible.cpp \
|
FormControlAccessible.cpp \
|
||||||
OuterDocAccessible.cpp \
|
OuterDocAccessible.cpp \
|
||||||
|
RootAccessible.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
# we don't want the shared lib, but we want to force the creation of a static lib.
|
# we don't want the shared lib, but we want to force the creation of a static lib.
|
||||||
@ -29,6 +30,8 @@ include $(topsrcdir)/config/rules.mk
|
|||||||
LOCAL_INCLUDES = \
|
LOCAL_INCLUDES = \
|
||||||
-I$(srcdir)/../xpcom \
|
-I$(srcdir)/../xpcom \
|
||||||
-I$(srcdir)/../base \
|
-I$(srcdir)/../base \
|
||||||
|
-I$(srcdir)/../html \
|
||||||
|
-I$(srcdir)/../xul \
|
||||||
-I$(srcdir)/../../../layout/generic \
|
-I$(srcdir)/../../../layout/generic \
|
||||||
-I$(srcdir)/../../../layout/xul/base/src \
|
-I$(srcdir)/../../../layout/xul/base/src \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
@ -35,6 +35,8 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
#include "mozilla/Util.h"
|
#include "mozilla/Util.h"
|
||||||
|
|
||||||
#define CreateEvent CreateEventA
|
#define CreateEvent CreateEventA
|
||||||
@ -76,7 +78,6 @@
|
|||||||
#include "nsPIDOMWindow.h"
|
#include "nsPIDOMWindow.h"
|
||||||
#include "nsIWebBrowserChrome.h"
|
#include "nsIWebBrowserChrome.h"
|
||||||
#include "nsReadableUtils.h"
|
#include "nsReadableUtils.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsIPrivateDOMEvent.h"
|
#include "nsIPrivateDOMEvent.h"
|
||||||
#include "nsFocusManager.h"
|
#include "nsFocusManager.h"
|
||||||
|
|
||||||
@ -92,20 +93,20 @@ using namespace mozilla::a11y;
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// nsISupports
|
// nsISupports
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS_INHERITED1(nsRootAccessible, nsDocAccessible, nsIAccessibleDocument)
|
NS_IMPL_ISUPPORTS_INHERITED1(RootAccessible, nsDocAccessible, nsIAccessibleDocument)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor/desctructor
|
// Constructor/destructor
|
||||||
|
|
||||||
nsRootAccessible::
|
RootAccessible::
|
||||||
nsRootAccessible(nsIDocument* aDocument, nsIContent* aRootContent,
|
RootAccessible(nsIDocument* aDocument, nsIContent* aRootContent,
|
||||||
nsIPresShell* aPresShell) :
|
nsIPresShell* aPresShell) :
|
||||||
nsDocAccessibleWrap(aDocument, aRootContent, aPresShell)
|
nsDocAccessibleWrap(aDocument, aRootContent, aPresShell)
|
||||||
{
|
{
|
||||||
mFlags |= eRootAccessible;
|
mFlags |= eRootAccessible;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRootAccessible::~nsRootAccessible()
|
RootAccessible::~RootAccessible()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +114,7 @@ nsRootAccessible::~nsRootAccessible()
|
|||||||
// nsAccessible
|
// nsAccessible
|
||||||
|
|
||||||
ENameValueFlag
|
ENameValueFlag
|
||||||
nsRootAccessible::Name(nsString& aName)
|
RootAccessible::Name(nsString& aName)
|
||||||
{
|
{
|
||||||
aName.Truncate();
|
aName.Truncate();
|
||||||
|
|
||||||
@ -124,12 +125,13 @@ nsRootAccessible::Name(nsString& aName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIDOMDocument> document = do_QueryInterface(mDocument);
|
nsCOMPtr<nsIDOMDocument> document = do_QueryInterface(mDocument);
|
||||||
|
NS_ENSURE_TRUE(document, eNameOK);
|
||||||
document->GetTitle(aName);
|
document->GetTitle(aName);
|
||||||
return eNameOK;
|
return eNameOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
role
|
role
|
||||||
nsRootAccessible::NativeRole()
|
RootAccessible::NativeRole()
|
||||||
{
|
{
|
||||||
// If it's a <dialog> or <wizard>, use roles::DIALOG instead
|
// If it's a <dialog> or <wizard>, use roles::DIALOG instead
|
||||||
dom::Element *root = mDocument->GetRootElement();
|
dom::Element *root = mDocument->GetRootElement();
|
||||||
@ -147,9 +149,10 @@ nsRootAccessible::NativeRole()
|
|||||||
return nsDocAccessibleWrap::NativeRole();
|
return nsDocAccessibleWrap::NativeRole();
|
||||||
}
|
}
|
||||||
|
|
||||||
// nsRootAccessible protected member
|
// RootAccessible protected member
|
||||||
#ifdef MOZ_XUL
|
#ifdef MOZ_XUL
|
||||||
PRUint32 nsRootAccessible::GetChromeFlags()
|
PRUint32
|
||||||
|
RootAccessible::GetChromeFlags()
|
||||||
{
|
{
|
||||||
// Return the flag set for the top level window as defined
|
// Return the flag set for the top level window as defined
|
||||||
// by nsIWebBrowserChrome::CHROME_WINDOW_[FLAGNAME]
|
// by nsIWebBrowserChrome::CHROME_WINDOW_[FLAGNAME]
|
||||||
@ -171,7 +174,7 @@ PRUint32 nsRootAccessible::GetChromeFlags()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
PRUint64
|
PRUint64
|
||||||
nsRootAccessible::NativeState()
|
RootAccessible::NativeState()
|
||||||
{
|
{
|
||||||
PRUint64 states = nsDocAccessibleWrap::NativeState();
|
PRUint64 states = nsDocAccessibleWrap::NativeState();
|
||||||
|
|
||||||
@ -231,7 +234,8 @@ const char* const docEvents[] = {
|
|||||||
"DOMMenuBarInactive"
|
"DOMMenuBarInactive"
|
||||||
};
|
};
|
||||||
|
|
||||||
nsresult nsRootAccessible::AddEventListeners()
|
nsresult
|
||||||
|
RootAccessible::AddEventListeners()
|
||||||
{
|
{
|
||||||
// nsIDOMEventTarget interface allows to register event listeners to
|
// nsIDOMEventTarget interface allows to register event listeners to
|
||||||
// receive untrusted events (synthetic events generated by untrusted code).
|
// receive untrusted events (synthetic events generated by untrusted code).
|
||||||
@ -256,7 +260,8 @@ nsresult nsRootAccessible::AddEventListeners()
|
|||||||
return nsDocAccessible::AddEventListeners();
|
return nsDocAccessible::AddEventListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult nsRootAccessible::RemoveEventListeners()
|
nsresult
|
||||||
|
RootAccessible::RemoveEventListeners()
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(mDocument));
|
nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(mDocument));
|
||||||
if (target) {
|
if (target) {
|
||||||
@ -284,13 +289,13 @@ nsresult nsRootAccessible::RemoveEventListeners()
|
|||||||
// public
|
// public
|
||||||
|
|
||||||
nsCaretAccessible*
|
nsCaretAccessible*
|
||||||
nsRootAccessible::GetCaretAccessible()
|
RootAccessible::GetCaretAccessible()
|
||||||
{
|
{
|
||||||
return mCaretAccessible;
|
return mCaretAccessible;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessible::DocumentActivated(nsDocAccessible* aDocument)
|
RootAccessible::DocumentActivated(nsDocAccessible* aDocument)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,7 +303,7 @@ nsRootAccessible::DocumentActivated(nsDocAccessible* aDocument)
|
|||||||
// nsIDOMEventListener
|
// nsIDOMEventListener
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsRootAccessible::HandleEvent(nsIDOMEvent* aDOMEvent)
|
RootAccessible::HandleEvent(nsIDOMEvent* aDOMEvent)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDOMNSEvent> DOMNSEvent(do_QueryInterface(aDOMEvent));
|
nsCOMPtr<nsIDOMNSEvent> DOMNSEvent(do_QueryInterface(aDOMEvent));
|
||||||
nsCOMPtr<nsIDOMEventTarget> DOMEventTarget;
|
nsCOMPtr<nsIDOMEventTarget> DOMEventTarget;
|
||||||
@ -335,16 +340,16 @@ nsRootAccessible::HandleEvent(nsIDOMEvent* aDOMEvent)
|
|||||||
// Root accessible exists longer than any of its descendant documents so
|
// Root accessible exists longer than any of its descendant documents so
|
||||||
// that we are guaranteed notification is processed before root accessible
|
// that we are guaranteed notification is processed before root accessible
|
||||||
// is destroyed.
|
// is destroyed.
|
||||||
document->HandleNotification<nsRootAccessible, nsIDOMEvent>
|
document->HandleNotification<RootAccessible, nsIDOMEvent>
|
||||||
(this, &nsRootAccessible::ProcessDOMEvent, aDOMEvent);
|
(this, &RootAccessible::ProcessDOMEvent, aDOMEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// nsRootAccessible protected
|
// RootAccessible protected
|
||||||
void
|
void
|
||||||
nsRootAccessible::ProcessDOMEvent(nsIDOMEvent* aDOMEvent)
|
RootAccessible::ProcessDOMEvent(nsIDOMEvent* aDOMEvent)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDOMNSEvent> DOMNSEvent(do_QueryInterface(aDOMEvent));
|
nsCOMPtr<nsIDOMNSEvent> DOMNSEvent(do_QueryInterface(aDOMEvent));
|
||||||
nsCOMPtr<nsIDOMEventTarget> DOMEventTarget;
|
nsCOMPtr<nsIDOMEventTarget> DOMEventTarget;
|
||||||
@ -534,7 +539,7 @@ nsRootAccessible::ProcessDOMEvent(nsIDOMEvent* aDOMEvent)
|
|||||||
// nsAccessNode
|
// nsAccessNode
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessible::Shutdown()
|
RootAccessible::Shutdown()
|
||||||
{
|
{
|
||||||
// Called manually or by nsAccessNode::LastRelease()
|
// Called manually or by nsAccessNode::LastRelease()
|
||||||
if (!PresShell())
|
if (!PresShell())
|
||||||
@ -545,7 +550,7 @@ nsRootAccessible::Shutdown()
|
|||||||
|
|
||||||
// nsIAccessible method
|
// nsIAccessible method
|
||||||
Relation
|
Relation
|
||||||
nsRootAccessible::RelationByType(PRUint32 aType)
|
RootAccessible::RelationByType(PRUint32 aType)
|
||||||
{
|
{
|
||||||
if (!mDocument || aType != nsIAccessibleRelation::RELATION_EMBEDS)
|
if (!mDocument || aType != nsIAccessibleRelation::RELATION_EMBEDS)
|
||||||
return nsDocAccessibleWrap::RelationByType(aType);
|
return nsDocAccessibleWrap::RelationByType(aType);
|
||||||
@ -575,7 +580,7 @@ nsRootAccessible::RelationByType(PRUint32 aType)
|
|||||||
// Protected members
|
// Protected members
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessible::HandlePopupShownEvent(nsAccessible* aAccessible)
|
RootAccessible::HandlePopupShownEvent(nsAccessible* aAccessible)
|
||||||
{
|
{
|
||||||
roles::Role role = aAccessible->Role();
|
roles::Role role = aAccessible->Role();
|
||||||
|
|
||||||
@ -613,7 +618,7 @@ nsRootAccessible::HandlePopupShownEvent(nsAccessible* aAccessible)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessible::HandlePopupHidingEvent(nsINode* aPopupNode)
|
RootAccessible::HandlePopupHidingEvent(nsINode* aPopupNode)
|
||||||
{
|
{
|
||||||
// Get popup accessible. There are cases when popup element isn't accessible
|
// Get popup accessible. There are cases when popup element isn't accessible
|
||||||
// but an underlying widget is and behaves like popup, an example is
|
// but an underlying widget is and behaves like popup, an example is
|
||||||
@ -718,7 +723,7 @@ nsRootAccessible::HandlePopupHidingEvent(nsINode* aPopupNode)
|
|||||||
|
|
||||||
#ifdef MOZ_XUL
|
#ifdef MOZ_XUL
|
||||||
void
|
void
|
||||||
nsRootAccessible::HandleTreeRowCountChangedEvent(nsIDOMEvent* aEvent,
|
RootAccessible::HandleTreeRowCountChangedEvent(nsIDOMEvent* aEvent,
|
||||||
nsXULTreeAccessible* aAccessible)
|
nsXULTreeAccessible* aAccessible)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDOMDataContainerEvent> dataEvent(do_QueryInterface(aEvent));
|
nsCOMPtr<nsIDOMDataContainerEvent> dataEvent(do_QueryInterface(aEvent));
|
||||||
@ -745,7 +750,7 @@ nsRootAccessible::HandleTreeRowCountChangedEvent(nsIDOMEvent* aEvent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessible::HandleTreeInvalidatedEvent(nsIDOMEvent* aEvent,
|
RootAccessible::HandleTreeInvalidatedEvent(nsIDOMEvent* aEvent,
|
||||||
nsXULTreeAccessible* aAccessible)
|
nsXULTreeAccessible* aAccessible)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIDOMDataContainerEvent> dataEvent(do_QueryInterface(aEvent));
|
nsCOMPtr<nsIDOMDataContainerEvent> dataEvent(do_QueryInterface(aEvent));
|
@ -35,8 +35,8 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#ifndef _nsRootAccessible_H_
|
#ifndef mozilla_a11y_RootAccessible_h__
|
||||||
#define _nsRootAccessible_H_
|
#define mozilla_a11y_RootAccessible_h__
|
||||||
|
|
||||||
#include "nsCaretAccessible.h"
|
#include "nsCaretAccessible.h"
|
||||||
#include "nsDocAccessibleWrap.h"
|
#include "nsDocAccessibleWrap.h"
|
||||||
@ -50,17 +50,18 @@
|
|||||||
class nsXULTreeAccessible;
|
class nsXULTreeAccessible;
|
||||||
class Relation;
|
class Relation;
|
||||||
|
|
||||||
const PRInt32 SCROLL_HASH_START_SIZE = 6;
|
namespace mozilla {
|
||||||
|
namespace a11y {
|
||||||
|
|
||||||
class nsRootAccessible : public nsDocAccessibleWrap,
|
class RootAccessible : public nsDocAccessibleWrap,
|
||||||
public nsIDOMEventListener
|
public nsIDOMEventListener
|
||||||
{
|
{
|
||||||
NS_DECL_ISUPPORTS_INHERITED
|
NS_DECL_ISUPPORTS_INHERITED
|
||||||
|
|
||||||
public:
|
public:
|
||||||
nsRootAccessible(nsIDocument* aDocument, nsIContent* aRootContent,
|
RootAccessible(nsIDocument* aDocument, nsIContent* aRootContent,
|
||||||
nsIPresShell* aPresShell);
|
nsIPresShell* aPresShell);
|
||||||
virtual ~nsRootAccessible();
|
virtual ~RootAccessible();
|
||||||
|
|
||||||
// nsIDOMEventListener
|
// nsIDOMEventListener
|
||||||
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
|
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent);
|
||||||
@ -74,7 +75,7 @@ public:
|
|||||||
virtual mozilla::a11y::role NativeRole();
|
virtual mozilla::a11y::role NativeRole();
|
||||||
virtual PRUint64 NativeState();
|
virtual PRUint64 NativeState();
|
||||||
|
|
||||||
// nsRootAccessible
|
// RootAccessible
|
||||||
nsCaretAccessible* GetCaretAccessible();
|
nsCaretAccessible* GetCaretAccessible();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -117,11 +118,14 @@ protected:
|
|||||||
nsRefPtr<nsCaretAccessible> mCaretAccessible;
|
nsRefPtr<nsCaretAccessible> mCaretAccessible;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline nsRootAccessible*
|
} // namespace a11y
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
inline mozilla::a11y::RootAccessible*
|
||||||
nsAccessible::AsRoot()
|
nsAccessible::AsRoot()
|
||||||
{
|
{
|
||||||
return mFlags & eRootAccessible ?
|
return mFlags & eRootAccessible ?
|
||||||
static_cast<nsRootAccessible*>(this) : nsnull;
|
static_cast<mozilla::a11y::RootAccessible*>(this) : nsnull;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -1297,10 +1297,8 @@ nsHTMLTableAccessible::Description(nsString& aDescription)
|
|||||||
bool isProbablyForLayout = IsProbablyLayoutTable();
|
bool isProbablyForLayout = IsProbablyLayoutTable();
|
||||||
aDescription = mLayoutHeuristic;
|
aDescription = mLayoutHeuristic;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_A11Y
|
|
||||||
printf("\nTABLE: %s\n", NS_ConvertUTF16toUTF8(mLayoutHeuristic).get());
|
printf("\nTABLE: %s\n", NS_ConvertUTF16toUTF8(mLayoutHeuristic).get());
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -16,6 +16,10 @@ Cu.import('resource://gre/modules/Services.jsm');
|
|||||||
Cu.import('resource://gre/modules/accessibility/Presenters.jsm');
|
Cu.import('resource://gre/modules/accessibility/Presenters.jsm');
|
||||||
Cu.import('resource://gre/modules/accessibility/VirtualCursorController.jsm');
|
Cu.import('resource://gre/modules/accessibility/VirtualCursorController.jsm');
|
||||||
|
|
||||||
|
const ACCESSFU_DISABLE = 0;
|
||||||
|
const ACCESSFU_ENABLE = 1;
|
||||||
|
const ACCESSFU_AUTO = 2;
|
||||||
|
|
||||||
var AccessFu = {
|
var AccessFu = {
|
||||||
/**
|
/**
|
||||||
* Attach chrome-layer accessibility functionality to the given chrome window.
|
* Attach chrome-layer accessibility functionality to the given chrome window.
|
||||||
@ -26,27 +30,25 @@ var AccessFu = {
|
|||||||
* AccessFu.
|
* AccessFu.
|
||||||
*/
|
*/
|
||||||
attach: function attach(aWindow) {
|
attach: function attach(aWindow) {
|
||||||
|
if (this.chromeWin)
|
||||||
|
// XXX: only supports attaching to one window now.
|
||||||
|
throw new Error('Only one window could be attached to AccessFu');
|
||||||
|
|
||||||
dump('AccessFu attach!! ' + Services.appinfo.OS + '\n');
|
dump('AccessFu attach!! ' + Services.appinfo.OS + '\n');
|
||||||
this.chromeWin = aWindow;
|
this.chromeWin = aWindow;
|
||||||
this.presenters = [];
|
this.presenters = [];
|
||||||
|
|
||||||
function checkA11y() {
|
this.prefsBranch = Cc['@mozilla.org/preferences-service;1']
|
||||||
if (Services.appinfo.OS == 'Android') {
|
.getService(Ci.nsIPrefService).getBranch('accessibility.');
|
||||||
let msg = Cc['@mozilla.org/android/bridge;1'].
|
this.prefsBranch.addObserver('accessfu', this, false);
|
||||||
getService(Ci.nsIAndroidBridge).handleGeckoMessage(
|
|
||||||
JSON.stringify(
|
let accessPref = ACCESSFU_DISABLE;
|
||||||
{ gecko: {
|
try {
|
||||||
type: 'Accessibility:IsEnabled',
|
accessPref = this.prefsBranch.getIntPref('accessfu');
|
||||||
eventType: 1,
|
} catch (x) {
|
||||||
text: []
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
return JSON.parse(msg).enabled;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkA11y())
|
if (this.amINeeded(accessPref))
|
||||||
this.enable();
|
this.enable();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -94,6 +96,28 @@ var AccessFu = {
|
|||||||
this.chromeWin.removeEventListener('TabClose', this);
|
this.chromeWin.removeEventListener('TabClose', this);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
amINeeded: function(aPref) {
|
||||||
|
switch (aPref) {
|
||||||
|
case ACCESSFU_ENABLE:
|
||||||
|
return true;
|
||||||
|
case ACCESSFU_AUTO:
|
||||||
|
if (Services.appinfo.OS == 'Android') {
|
||||||
|
let msg = Cc['@mozilla.org/android/bridge;1'].
|
||||||
|
getService(Ci.nsIAndroidBridge).handleGeckoMessage(
|
||||||
|
JSON.stringify(
|
||||||
|
{ gecko: {
|
||||||
|
type: 'Accessibility:IsEnabled',
|
||||||
|
eventType: 1,
|
||||||
|
text: []
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
return JSON.parse(msg).enabled;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
addPresenter: function addPresenter(presenter) {
|
addPresenter: function addPresenter(presenter) {
|
||||||
this.presenters.push(presenter);
|
this.presenters.push(presenter);
|
||||||
presenter.attach(this.chromeWin);
|
presenter.attach(this.chromeWin);
|
||||||
@ -150,6 +174,14 @@ var AccessFu = {
|
|||||||
|
|
||||||
observe: function observe(aSubject, aTopic, aData) {
|
observe: function observe(aSubject, aTopic, aData) {
|
||||||
switch (aTopic) {
|
switch (aTopic) {
|
||||||
|
case 'nsPref:changed':
|
||||||
|
if (aData == 'accessfu') {
|
||||||
|
if (this.amINeeded(this.prefsBranch.getIntPref('accessfu')))
|
||||||
|
this.enable();
|
||||||
|
else
|
||||||
|
this.disable();
|
||||||
|
}
|
||||||
|
break;
|
||||||
case 'accessible-event':
|
case 'accessible-event':
|
||||||
let event;
|
let event;
|
||||||
try {
|
try {
|
||||||
@ -204,6 +236,34 @@ var AccessFu = {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case Ci.nsIAccessibleEvent.EVENT_TEXT_INSERTED:
|
||||||
|
case Ci.nsIAccessibleEvent.EVENT_TEXT_REMOVED:
|
||||||
|
{
|
||||||
|
if (aEvent.isFromUserInput) {
|
||||||
|
// XXX support live regions as well.
|
||||||
|
let event = aEvent.QueryInterface(Ci.nsIAccessibleTextChangeEvent);
|
||||||
|
let isInserted = event.isInserted();
|
||||||
|
let textIface = aEvent.accessible.QueryInterface(Ci.nsIAccessibleText);
|
||||||
|
|
||||||
|
let text = '';
|
||||||
|
try {
|
||||||
|
text = textIface.
|
||||||
|
getText(0, Ci.nsIAccessibleText.TEXT_OFFSET_END_OF_TEXT);
|
||||||
|
} catch (x) {
|
||||||
|
// XXX we might have gotten an exception with of a
|
||||||
|
// zero-length text. If we did, ignore it (bug #749810).
|
||||||
|
if (textIface.characterCount)
|
||||||
|
throw x;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.presenters.forEach(
|
||||||
|
function(p) {
|
||||||
|
p.textChanged(isInserted, event.start, event.length, text, event.modifiedText);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ Presenter.prototype = {
|
|||||||
/**
|
/**
|
||||||
* Text has changed, either by the user or by the system. TODO.
|
* Text has changed, either by the user or by the system. TODO.
|
||||||
*/
|
*/
|
||||||
textChanged: function textChanged() {},
|
textChanged: function textChanged(aIsInserted, aStartOffset, aLength, aText, aModifiedText) {},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Text selection has changed. TODO.
|
* Text selection has changed. TODO.
|
||||||
@ -254,6 +254,27 @@ AndroidPresenter.prototype.tabSelected = function(aObject) {
|
|||||||
this.pivotChanged(vcDoc.virtualCursor.position || aObject, context);
|
this.pivotChanged(vcDoc.virtualCursor.position || aObject, context);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
AndroidPresenter.prototype.textChanged = function(aIsInserted, aStart, aLength, aText, aModifiedText) {
|
||||||
|
let androidEvent = {
|
||||||
|
type: 'Accessibility:Event',
|
||||||
|
eventType: ANDROID_TYPE_VIEW_TEXT_CHANGED,
|
||||||
|
text: [aText],
|
||||||
|
fromIndex: aStart
|
||||||
|
};
|
||||||
|
|
||||||
|
if (aIsInserted) {
|
||||||
|
androidEvent.addedCount = aLength;
|
||||||
|
androidEvent.beforeText =
|
||||||
|
aText.substring(0, aStart) + aText.substring(aStart + aLength);
|
||||||
|
} else {
|
||||||
|
androidEvent.removedCount = aLength;
|
||||||
|
androidEvent.beforeText =
|
||||||
|
aText.substring(0, aStart) + aModifiedText + aText.substring(aStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sendMessageToJava({gecko: androidEvent});
|
||||||
|
};
|
||||||
|
|
||||||
AndroidPresenter.prototype.sendMessageToJava = function(aMessage) {
|
AndroidPresenter.prototype.sendMessageToJava = function(aMessage) {
|
||||||
return Cc['@mozilla.org/android/bridge;1'].
|
return Cc['@mozilla.org/android/bridge;1'].
|
||||||
getService(Ci.nsIAndroidBridge).
|
getService(Ci.nsIAndroidBridge).
|
||||||
|
@ -50,7 +50,7 @@ var UtteranceGenerator = {
|
|||||||
if (aForceName)
|
if (aForceName)
|
||||||
flags |= INCLUDE_NAME;
|
flags |= INCLUDE_NAME;
|
||||||
|
|
||||||
return func(aAccessible, roleString, flags);
|
return func.apply(this, [aAccessible, roleString, flags]);
|
||||||
},
|
},
|
||||||
|
|
||||||
genForAction: function(aObject, aActionName) {
|
genForAction: function(aObject, aActionName) {
|
||||||
@ -113,8 +113,7 @@ var UtteranceGenerator = {
|
|||||||
objectUtteranceFunctions: {
|
objectUtteranceFunctions: {
|
||||||
defaultFunc: function defaultFunc(aAccessible, aRoleStr, aFlags) {
|
defaultFunc: function defaultFunc(aAccessible, aRoleStr, aFlags) {
|
||||||
let name = (aFlags & INCLUDE_NAME) ? (aAccessible.name || '') : '';
|
let name = (aFlags & INCLUDE_NAME) ? (aAccessible.name || '') : '';
|
||||||
let desc = (aFlags & INCLUDE_ROLE) ?
|
let desc = (aFlags & INCLUDE_ROLE) ? this._getLocalizedRole(aRoleStr) : '';
|
||||||
gStringBundle.GetStringFromName(aRoleStr) : '';
|
|
||||||
|
|
||||||
if (!name && !desc)
|
if (!name && !desc)
|
||||||
return [];
|
return [];
|
||||||
@ -149,7 +148,7 @@ var UtteranceGenerator = {
|
|||||||
|
|
||||||
listitem: function(aAccessible, aRoleStr, aFlags) {
|
listitem: function(aAccessible, aRoleStr, aFlags) {
|
||||||
let name = (aFlags & INCLUDE_NAME) ? (aAccessible.name || '') : '';
|
let name = (aFlags & INCLUDE_NAME) ? (aAccessible.name || '') : '';
|
||||||
let localizedRole = gStringBundle.GetStringFromName(aRoleStr);
|
let localizedRole = this._getLocalizedRole(aRoleStr);
|
||||||
let itemno = {};
|
let itemno = {};
|
||||||
let itemof = {};
|
let itemof = {};
|
||||||
aAccessible.groupPosition({}, itemof, itemno);
|
aAccessible.groupPosition({}, itemof, itemno);
|
||||||
@ -158,5 +157,13 @@ var UtteranceGenerator = {
|
|||||||
|
|
||||||
return [desc, name];
|
return [desc, name];
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_getLocalizedRole: function _getLocalizedRole(aRoleStr) {
|
||||||
|
try {
|
||||||
|
return gStringBundle.GetStringFromName(aRoleStr.replace(' ', ''));
|
||||||
|
} catch (x) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -122,20 +122,28 @@ var VirtualCursorController = {
|
|||||||
Ci.nsIAccessibleTraversalRule.PREFILTER_INVISIBLE,
|
Ci.nsIAccessibleTraversalRule.PREFILTER_INVISIBLE,
|
||||||
|
|
||||||
match: function(aAccessible) {
|
match: function(aAccessible) {
|
||||||
let rv = Ci.nsIAccessibleTraversalRule.FILTER_IGNORE;
|
if (aAccessible.childCount)
|
||||||
if (aAccessible.childCount == 0) {
|
// Non-leafs do not interest us.
|
||||||
// TODO: Find a better solution for ROLE_STATICTEXT.
|
return Ci.nsIAccessibleTraversalRule.FILTER_IGNORE;
|
||||||
// Right now it helps filter list bullets, but it is also used
|
|
||||||
// in CSS generated content.
|
// XXX: Find a better solution for ROLE_STATICTEXT.
|
||||||
|
// It allows to filter list bullets but the same time it
|
||||||
|
// filters CSS generated content too as unwanted side effect.
|
||||||
let ignoreRoles = [Ci.nsIAccessibleRole.ROLE_WHITESPACE,
|
let ignoreRoles = [Ci.nsIAccessibleRole.ROLE_WHITESPACE,
|
||||||
Ci.nsIAccessibleRole.ROLE_STATICTEXT];
|
Ci.nsIAccessibleRole.ROLE_STATICTEXT];
|
||||||
|
|
||||||
|
if (ignoreRoles.indexOf(aAccessible.role) < 0) {
|
||||||
|
let name = aAccessible.name;
|
||||||
|
if (name && name.trim())
|
||||||
|
return Ci.nsIAccessibleTraversalRule.FILTER_MATCH;
|
||||||
|
}
|
||||||
|
|
||||||
let state = {};
|
let state = {};
|
||||||
aAccessible.getState(state, {});
|
aAccessible.getState(state, {});
|
||||||
if ((state.value & Ci.nsIAccessibleStates.STATE_FOCUSABLE) ||
|
if (state.value & Ci.nsIAccessibleStates.STATE_FOCUSABLE)
|
||||||
(aAccessible.name && ignoreRoles.indexOf(aAccessible.role) < 0))
|
return Ci.nsIAccessibleTraversalRule.FILTER_MATCH;
|
||||||
rv = Ci.nsIAccessibleTraversalRule.FILTER_MATCH;
|
|
||||||
}
|
return Ci.nsIAccessibleTraversalRule.FILTER_IGNORE;
|
||||||
return rv;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIAccessibleTraversalRule])
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIAccessibleTraversalRule])
|
||||||
|
@ -50,7 +50,6 @@ LIBXUL_LIBRARY = 1
|
|||||||
|
|
||||||
CMMSRCS = nsAccessNodeWrap.mm \
|
CMMSRCS = nsAccessNodeWrap.mm \
|
||||||
nsDocAccessibleWrap.mm \
|
nsDocAccessibleWrap.mm \
|
||||||
nsRootAccessibleWrap.mm \
|
|
||||||
nsAccessibleWrap.mm \
|
nsAccessibleWrap.mm \
|
||||||
mozAccessible.mm \
|
mozAccessible.mm \
|
||||||
mozDocAccessible.mm \
|
mozDocAccessible.mm \
|
||||||
@ -58,6 +57,7 @@ CMMSRCS = nsAccessNodeWrap.mm \
|
|||||||
mozTextAccessible.mm \
|
mozTextAccessible.mm \
|
||||||
mozHTMLAccessible.mm \
|
mozHTMLAccessible.mm \
|
||||||
MacUtils.mm \
|
MacUtils.mm \
|
||||||
|
RootAccessibleWrap.mm \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
|
||||||
@ -67,7 +67,6 @@ EXPORTS = \
|
|||||||
nsTextAccessibleWrap.h \
|
nsTextAccessibleWrap.h \
|
||||||
nsAccessibleWrap.h \
|
nsAccessibleWrap.h \
|
||||||
nsDocAccessibleWrap.h \
|
nsDocAccessibleWrap.h \
|
||||||
nsRootAccessibleWrap.h \
|
|
||||||
nsXULMenuAccessibleWrap.h \
|
nsXULMenuAccessibleWrap.h \
|
||||||
nsXULListboxAccessibleWrap.h \
|
nsXULListboxAccessibleWrap.h \
|
||||||
nsXULTreeGridAccessibleWrap.h \
|
nsXULTreeGridAccessibleWrap.h \
|
||||||
|
@ -40,19 +40,22 @@
|
|||||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _nsRootAccessibleWrap_H_
|
#ifndef mozilla_a11y_RootAccessibleWrap_h__
|
||||||
#define _nsRootAccessibleWrap_H_
|
#define mozilla_a11y_RootAccessibleWrap_h__
|
||||||
|
|
||||||
#include "nsRootAccessible.h"
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace a11y {
|
||||||
|
|
||||||
struct objc_class;
|
struct objc_class;
|
||||||
|
|
||||||
class nsRootAccessibleWrap : public nsRootAccessible
|
class RootAccessibleWrap : public RootAccessible
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsRootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
RootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
||||||
nsIPresShell* aPresShell);
|
nsIPresShell* aPresShell);
|
||||||
virtual ~nsRootAccessibleWrap();
|
virtual ~RootAccessibleWrap();
|
||||||
|
|
||||||
Class GetNativeType ();
|
Class GetNativeType ();
|
||||||
|
|
||||||
@ -61,5 +64,7 @@ public:
|
|||||||
void GetNativeWidget (void **aOutView);
|
void GetNativeWidget (void **aOutView);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace a11y
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -36,7 +36,7 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include "nsRootAccessibleWrap.h"
|
#include "RootAccessibleWrap.h"
|
||||||
|
|
||||||
#include "mozDocAccessible.h"
|
#include "mozDocAccessible.h"
|
||||||
|
|
||||||
@ -45,19 +45,21 @@
|
|||||||
#include "nsIWidget.h"
|
#include "nsIWidget.h"
|
||||||
#include "nsIViewManager.h"
|
#include "nsIViewManager.h"
|
||||||
|
|
||||||
nsRootAccessibleWrap::
|
using namespace mozilla::a11y;
|
||||||
nsRootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
|
||||||
|
RootAccessibleWrap::
|
||||||
|
RootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
||||||
nsIPresShell* aPresShell) :
|
nsIPresShell* aPresShell) :
|
||||||
nsRootAccessible(aDocument, aRootContent, aPresShell)
|
RootAccessible(aDocument, aRootContent, aPresShell)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRootAccessibleWrap::~nsRootAccessibleWrap()
|
RootAccessibleWrap::~RootAccessibleWrap()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Class
|
Class
|
||||||
nsRootAccessibleWrap::GetNativeType ()
|
RootAccessibleWrap::GetNativeType()
|
||||||
{
|
{
|
||||||
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
|
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NIL;
|
||||||
|
|
||||||
@ -67,7 +69,7 @@ nsRootAccessibleWrap::GetNativeType ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessibleWrap::GetNativeWidget (void **aOutView)
|
RootAccessibleWrap::GetNativeWidget(void** aOutView)
|
||||||
{
|
{
|
||||||
nsIFrame *frame = GetFrame();
|
nsIFrame *frame = GetFrame();
|
||||||
if (frame) {
|
if (frame) {
|
@ -45,9 +45,9 @@
|
|||||||
#include "nsIAccessibleRelation.h"
|
#include "nsIAccessibleRelation.h"
|
||||||
#include "nsIAccessibleText.h"
|
#include "nsIAccessibleText.h"
|
||||||
#include "nsIAccessibleEditableText.h"
|
#include "nsIAccessibleEditableText.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "Relation.h"
|
#include "Relation.h"
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
#include "mozilla/Services.h"
|
#include "mozilla/Services.h"
|
||||||
#include "nsRect.h"
|
#include "nsRect.h"
|
||||||
@ -353,7 +353,7 @@ GetNativeFromGeckoAccessible(nsIAccessible *anAccessible)
|
|||||||
// (which might be the owning NSWindow in the application, for example).
|
// (which might be the owning NSWindow in the application, for example).
|
||||||
//
|
//
|
||||||
// get the native root accessible, and tell it to return its first parent unignored accessible.
|
// get the native root accessible, and tell it to return its first parent unignored accessible.
|
||||||
nsRootAccessible* root = mGeckoAccessible->RootAccessible();
|
RootAccessible* root = mGeckoAccessible->RootAccessible();
|
||||||
id nativeParent = GetNativeFromGeckoAccessible(static_cast<nsIAccessible*>(root));
|
id nativeParent = GetNativeFromGeckoAccessible(static_cast<nsIAccessible*>(root));
|
||||||
NSAssert1 (nativeParent, @"!!! we can't find a parent for %@", self);
|
NSAssert1 (nativeParent, @"!!! we can't find a parent for %@", self);
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
The root accessible. There is one per window.
|
The root accessible. There is one per window.
|
||||||
Created by the nsRootAccessibleWrap.
|
Created by the RootAccessibleWrap.
|
||||||
*/
|
*/
|
||||||
@interface mozRootAccessible : mozAccessible
|
@interface mozRootAccessible : mozAccessible
|
||||||
{
|
{
|
||||||
|
@ -36,16 +36,20 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include "nsRootAccessibleWrap.h"
|
|
||||||
#include "nsObjCExceptions.h"
|
#include "nsObjCExceptions.h"
|
||||||
|
#include "RootAccessibleWrap.h"
|
||||||
|
|
||||||
#import "mozDocAccessible.h"
|
#import "mozDocAccessible.h"
|
||||||
|
|
||||||
#import "mozView.h"
|
#import "mozView.h"
|
||||||
|
|
||||||
static id <mozAccessible, mozView> getNativeViewFromRootAccessible (nsAccessible *accessible)
|
using namespace mozilla::a11y;
|
||||||
|
|
||||||
|
static id <mozAccessible, mozView>
|
||||||
|
getNativeViewFromRootAccessible(nsAccessible* aAccessible)
|
||||||
{
|
{
|
||||||
nsRootAccessibleWrap *root = static_cast<nsRootAccessibleWrap*>(accessible);
|
RootAccessibleWrap* root =
|
||||||
|
static_cast<RootAccessibleWrap*>(aAccessible->AsRoot());
|
||||||
id <mozAccessible, mozView> nativeView = nil;
|
id <mozAccessible, mozView> nativeView = nil;
|
||||||
root->GetNativeWidget ((void**)&nativeView);
|
root->GetNativeWidget ((void**)&nativeView);
|
||||||
return nativeView;
|
return nativeView;
|
||||||
|
@ -55,7 +55,6 @@ CPPSRCS = \
|
|||||||
nsTextAccessibleWrap.cpp \
|
nsTextAccessibleWrap.cpp \
|
||||||
nsDocAccessibleWrap.cpp \
|
nsDocAccessibleWrap.cpp \
|
||||||
nsHTMLWin32ObjectAccessible.cpp \
|
nsHTMLWin32ObjectAccessible.cpp \
|
||||||
nsRootAccessibleWrap.cpp \
|
|
||||||
nsXULMenuAccessibleWrap.cpp \
|
nsXULMenuAccessibleWrap.cpp \
|
||||||
nsXULListboxAccessibleWrap.cpp \
|
nsXULListboxAccessibleWrap.cpp \
|
||||||
nsXULTreeGridAccessibleWrap.cpp \
|
nsXULTreeGridAccessibleWrap.cpp \
|
||||||
@ -75,6 +74,7 @@ CPPSRCS = \
|
|||||||
CAccessibleTableCell.cpp \
|
CAccessibleTableCell.cpp \
|
||||||
CAccessibleValue.cpp \
|
CAccessibleValue.cpp \
|
||||||
Compatibility.cpp \
|
Compatibility.cpp \
|
||||||
|
RootAccessibleWrap.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
@ -83,7 +83,6 @@ EXPORTS = \
|
|||||||
nsAccessibleWrap.h \
|
nsAccessibleWrap.h \
|
||||||
nsTextAccessibleWrap.h \
|
nsTextAccessibleWrap.h \
|
||||||
nsDocAccessibleWrap.h \
|
nsDocAccessibleWrap.h \
|
||||||
nsRootAccessibleWrap.h \
|
|
||||||
nsHTMLWin32ObjectAccessible.h \
|
nsHTMLWin32ObjectAccessible.h \
|
||||||
nsXULMenuAccessibleWrap.h \
|
nsXULMenuAccessibleWrap.h \
|
||||||
nsXULListboxAccessibleWrap.h \
|
nsXULListboxAccessibleWrap.h \
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#include "nsRootAccessibleWrap.h"
|
#include "RootAccessibleWrap.h"
|
||||||
|
|
||||||
#include "Compatibility.h"
|
#include "Compatibility.h"
|
||||||
#include "nsWinUtils.h"
|
#include "nsWinUtils.h"
|
||||||
@ -49,22 +49,22 @@ using namespace mozilla::a11y;
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor/desctructor
|
// Constructor/desctructor
|
||||||
|
|
||||||
nsRootAccessibleWrap::
|
RootAccessibleWrap::
|
||||||
nsRootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
RootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
||||||
nsIPresShell* aPresShell) :
|
nsIPresShell* aPresShell) :
|
||||||
nsRootAccessible(aDocument, aRootContent, aPresShell)
|
RootAccessible(aDocument, aRootContent, aPresShell)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
nsRootAccessibleWrap::~nsRootAccessibleWrap()
|
RootAccessibleWrap::~RootAccessibleWrap()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// nsRootAccessible
|
// RootAccessible
|
||||||
|
|
||||||
void
|
void
|
||||||
nsRootAccessibleWrap::DocumentActivated(nsDocAccessible* aDocument)
|
RootAccessibleWrap::DocumentActivated(nsDocAccessible* aDocument)
|
||||||
{
|
{
|
||||||
if (Compatibility::IsDolphin() &&
|
if (Compatibility::IsDolphin() &&
|
||||||
nsCoreUtils::IsTabDocument(aDocument->GetDocumentNode())) {
|
nsCoreUtils::IsTabDocument(aDocument->GetDocumentNode())) {
|
@ -37,20 +37,26 @@
|
|||||||
*
|
*
|
||||||
* ***** END LICENSE BLOCK ***** */
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
#ifndef _nsRootAccessibleWrap_H_
|
#ifndef mozilla_a11y_RootAccessibleWrap_h__
|
||||||
#define _nsRootAccessibleWrap_H_
|
#define mozilla_a11y_RootAccessibleWrap_h__
|
||||||
|
|
||||||
#include "nsRootAccessible.h"
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
class nsRootAccessibleWrap : public nsRootAccessible
|
namespace mozilla {
|
||||||
|
namespace a11y {
|
||||||
|
|
||||||
|
class RootAccessibleWrap : public RootAccessible
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsRootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
RootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
||||||
nsIPresShell* aPresShell);
|
nsIPresShell* aPresShell);
|
||||||
virtual ~nsRootAccessibleWrap();
|
virtual ~RootAccessibleWrap();
|
||||||
|
|
||||||
// nsRootAccessible
|
// RootAccessible
|
||||||
virtual void DocumentActivated(nsDocAccessible* aDocument);
|
virtual void DocumentActivated(nsDocAccessible* aDocument);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace a11y
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -45,8 +45,8 @@
|
|||||||
#include "Compatibility.h"
|
#include "Compatibility.h"
|
||||||
#include "nsAccessibilityService.h"
|
#include "nsAccessibilityService.h"
|
||||||
#include "nsCoreUtils.h"
|
#include "nsCoreUtils.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsWinUtils.h"
|
#include "nsWinUtils.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
#include "Statistics.h"
|
#include "Statistics.h"
|
||||||
|
|
||||||
#include "nsAttrName.h"
|
#include "nsAttrName.h"
|
||||||
|
@ -54,6 +54,7 @@
|
|||||||
#include "Accessible2_i.c"
|
#include "Accessible2_i.c"
|
||||||
#include "AccessibleRole.h"
|
#include "AccessibleRole.h"
|
||||||
#include "AccessibleStates.h"
|
#include "AccessibleStates.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
#include "nsIMutableArray.h"
|
#include "nsIMutableArray.h"
|
||||||
#include "nsIDOMDocument.h"
|
#include "nsIDOMDocument.h"
|
||||||
@ -61,7 +62,6 @@
|
|||||||
#include "nsIScrollableFrame.h"
|
#include "nsIScrollableFrame.h"
|
||||||
#include "nsINameSpaceManager.h"
|
#include "nsINameSpaceManager.h"
|
||||||
#include "nsINodeInfo.h"
|
#include "nsINodeInfo.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsTextFormatter.h"
|
#include "nsTextFormatter.h"
|
||||||
#include "nsIView.h"
|
#include "nsIView.h"
|
||||||
@ -76,19 +76,6 @@ using namespace mozilla::a11y;
|
|||||||
|
|
||||||
const PRUint32 USE_ROLE_STRING = 0;
|
const PRUint32 USE_ROLE_STRING = 0;
|
||||||
|
|
||||||
#ifndef ROLE_SYSTEM_SPLITBUTTON
|
|
||||||
const PRUint32 ROLE_SYSTEM_SPLITBUTTON = 0x3e; // Not defined in all oleacc.h versions
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ROLE_SYSTEM_IPADDRESS
|
|
||||||
const PRUint32 ROLE_SYSTEM_IPADDRESS = 0x3f; // Not defined in all oleacc.h versions
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ROLE_SYSTEM_OUTLINEBUTTON
|
|
||||||
const PRUint32 ROLE_SYSTEM_OUTLINEBUTTON = 0x40; // Not defined in all oleacc.h versions
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* For documentation of the accessibility architecture,
|
/* For documentation of the accessibility architecture,
|
||||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||||
*/
|
*/
|
||||||
@ -1893,7 +1880,7 @@ void nsAccessibleWrap::UpdateSystemCaret()
|
|||||||
// off-screen model can follow the caret
|
// off-screen model can follow the caret
|
||||||
::DestroyCaret();
|
::DestroyCaret();
|
||||||
|
|
||||||
nsRootAccessible* rootAccessible = RootAccessible();
|
a11y::RootAccessible* rootAccessible = RootAccessible();
|
||||||
if (!rootAccessible) {
|
if (!rootAccessible) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -42,9 +42,9 @@
|
|||||||
#include "nsDocAccessibleWrap.h"
|
#include "nsDocAccessibleWrap.h"
|
||||||
#include "ISimpleDOMDocument_i.c"
|
#include "ISimpleDOMDocument_i.c"
|
||||||
#include "nsIAccessibilityService.h"
|
#include "nsIAccessibilityService.h"
|
||||||
#include "nsRootAccessible.h"
|
|
||||||
#include "nsWinUtils.h"
|
#include "nsWinUtils.h"
|
||||||
#include "Role.h"
|
#include "Role.h"
|
||||||
|
#include "RootAccessible.h"
|
||||||
#include "Statistics.h"
|
#include "Statistics.h"
|
||||||
|
|
||||||
#include "nsIDocShell.h"
|
#include "nsIDocShell.h"
|
||||||
@ -57,6 +57,7 @@
|
|||||||
#include "nsIViewManager.h"
|
#include "nsIViewManager.h"
|
||||||
#include "nsIWebNavigation.h"
|
#include "nsIWebNavigation.h"
|
||||||
|
|
||||||
|
using namespace mozilla;
|
||||||
using namespace mozilla::a11y;
|
using namespace mozilla::a11y;
|
||||||
|
|
||||||
/* For documentation of the accessibility architecture,
|
/* For documentation of the accessibility architecture,
|
||||||
@ -280,7 +281,7 @@ nsDocAccessibleWrap::DoInitialUpdate()
|
|||||||
mozilla::dom::TabChild* tabChild =
|
mozilla::dom::TabChild* tabChild =
|
||||||
mozilla::dom::GetTabChildFrom(mDocument->GetShell());
|
mozilla::dom::GetTabChildFrom(mDocument->GetShell());
|
||||||
|
|
||||||
nsRootAccessible* rootDocument = RootAccessible();
|
a11y::RootAccessible* rootDocument = RootAccessible();
|
||||||
|
|
||||||
mozilla::WindowsHandle nativeData = nsnull;
|
mozilla::WindowsHandle nativeData = nsnull;
|
||||||
if (tabChild)
|
if (tabChild)
|
||||||
|
@ -41,8 +41,8 @@
|
|||||||
#include "nsWinUtils.h"
|
#include "nsWinUtils.h"
|
||||||
|
|
||||||
#include "Compatibility.h"
|
#include "Compatibility.h"
|
||||||
#include "nsIWinAccessNode.h"
|
#include "nsDocAccessible.h"
|
||||||
#include "nsRootAccessible.h"
|
#include "nsCoreUtils.h"
|
||||||
|
|
||||||
#include "mozilla/Preferences.h"
|
#include "mozilla/Preferences.h"
|
||||||
#include "nsArrayUtils.h"
|
#include "nsArrayUtils.h"
|
||||||
|
@ -50,7 +50,6 @@ LIBXUL_LIBRARY = 1
|
|||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
nsAccessNodeWrap.cpp \
|
nsAccessNodeWrap.cpp \
|
||||||
nsAccessibleWrap.cpp \
|
nsAccessibleWrap.cpp \
|
||||||
nsRootAccessibleWrap.cpp \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
EXPORTS = \
|
EXPORTS = \
|
||||||
@ -59,7 +58,6 @@ EXPORTS = \
|
|||||||
nsTextAccessibleWrap.h \
|
nsTextAccessibleWrap.h \
|
||||||
nsAccessibleWrap.h \
|
nsAccessibleWrap.h \
|
||||||
nsDocAccessibleWrap.h \
|
nsDocAccessibleWrap.h \
|
||||||
nsRootAccessibleWrap.h \
|
|
||||||
nsXULMenuAccessibleWrap.h \
|
nsXULMenuAccessibleWrap.h \
|
||||||
nsXULListboxAccessibleWrap.h \
|
nsXULListboxAccessibleWrap.h \
|
||||||
nsXULTreeGridAccessibleWrap.h \
|
nsXULTreeGridAccessibleWrap.h \
|
||||||
|
@ -40,18 +40,17 @@
|
|||||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _nsRootAccessibleWrap_H_
|
#ifndef mozilla_a11y_RootAccessibleWrap_h__
|
||||||
#define _nsRootAccessibleWrap_H_
|
#define mozilla_a11y_RootAccessibleWrap_h__
|
||||||
|
|
||||||
#include "nsRootAccessible.h"
|
#include "RootAccessible.h"
|
||||||
|
|
||||||
class nsRootAccessibleWrap: public nsRootAccessible
|
namespace mozilla {
|
||||||
{
|
namespace a11y {
|
||||||
public:
|
|
||||||
nsRootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
|
||||||
nsIPresShell* aPresShell);
|
|
||||||
virtual ~nsRootAccessibleWrap();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
typedef RootAccessible RootAccessibleWrap;
|
||||||
|
|
||||||
|
} // namespace a11y
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -1,58 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
||||||
*
|
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
|
||||||
* 1.1 (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.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
||||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
||||||
* for the specific language governing rights and limitations under the
|
|
||||||
* License.
|
|
||||||
*
|
|
||||||
* The Original Code is mozilla.org code.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is
|
|
||||||
* Netscape Communications Corporation.
|
|
||||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
* Original Author: Aaron Leventhal (aaronl@netscape.com)
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the terms of
|
|
||||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
||||||
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
||||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
||||||
* of those above. If you wish to allow use of your version of this file only
|
|
||||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
||||||
* use your version of this file under the terms of the MPL, indicate your
|
|
||||||
* decision by deleting the provisions above and replace them with the notice
|
|
||||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
||||||
* the provisions above, a recipient may use your version of this file under
|
|
||||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
||||||
*
|
|
||||||
* ***** END LICENSE BLOCK ***** */
|
|
||||||
|
|
||||||
#include "nsCOMPtr.h"
|
|
||||||
#include "nsRootAccessibleWrap.h"
|
|
||||||
#include "nsIServiceManager.h"
|
|
||||||
#include "nsIAccessibilityService.h"
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// nsRootAccessibleWrap
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
nsRootAccessibleWrap::
|
|
||||||
nsRootAccessibleWrap(nsIDocument* aDocument, nsIContent* aRootContent,
|
|
||||||
nsIPresShell* aPresShell) :
|
|
||||||
nsRootAccessible(aDocument, aRootContent, aPresShell)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
nsRootAccessibleWrap::~nsRootAccessibleWrap()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
@ -201,10 +201,14 @@ else
|
|||||||
APPFILES = MacOS
|
APPFILES = MacOS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
libs repackage:: $(PROGRAM)
|
libs-preqs = \
|
||||||
$(MKDIR) -p $(dist_dest)/Contents/MacOS
|
$(call mkdir_deps,$(dist_dest)/Contents/MacOS) \
|
||||||
|
$(call mkdir_deps,$(dist_dest)/Contents/Resources/$(AB).lproj) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
.PHONY: repackage
|
||||||
|
libs repackage:: $(PROGRAM) $(libs-preqs)
|
||||||
rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents $(dist_dest) --exclude English.lproj
|
rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents $(dist_dest) --exclude English.lproj
|
||||||
$(MKDIR) -p $(dist_dest)/Contents/Resources/$(AB).lproj
|
|
||||||
rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(dist_dest)/Contents/Resources/$(AB).lproj
|
rsync -a --exclude "*.in" $(srcdir)/macbuild/Contents/Resources/English.lproj/ $(dist_dest)/Contents/Resources/$(AB).lproj
|
||||||
sed -e "s/%APP_VERSION%/$(MOZ_APP_VERSION)/" -e "s/%MAC_APP_NAME%/$(MAC_APP_NAME)/" -e "s/%LOWER_MAC_APP_NAME%/$(LOWER_MAC_APP_NAME)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(dist_dest)/Contents/Info.plist
|
sed -e "s/%APP_VERSION%/$(MOZ_APP_VERSION)/" -e "s/%MAC_APP_NAME%/$(MAC_APP_NAME)/" -e "s/%LOWER_MAC_APP_NAME%/$(LOWER_MAC_APP_NAME)/" $(srcdir)/macbuild/Contents/Info.plist.in > $(dist_dest)/Contents/Info.plist
|
||||||
sed -e "s/%MAC_APP_NAME%/$(MAC_APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(dist_dest)/Contents/Resources/$(AB).lproj/InfoPlist.strings
|
sed -e "s/%MAC_APP_NAME%/$(MAC_APP_NAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | iconv -f UTF-8 -t UTF-16 > $(dist_dest)/Contents/Resources/$(AB).lproj/InfoPlist.strings
|
||||||
|
@ -1058,9 +1058,14 @@ pref("devtools.layoutview.open", false);
|
|||||||
|
|
||||||
// Enable the Debugger
|
// Enable the Debugger
|
||||||
pref("devtools.debugger.enabled", false);
|
pref("devtools.debugger.enabled", false);
|
||||||
|
pref("devtools.debugger.remote-enabled", false);
|
||||||
|
pref("devtools.debugger.remote-host", "localhost");
|
||||||
|
pref("devtools.debugger.remote-port", 6000);
|
||||||
|
|
||||||
// The default Debugger UI height
|
// The default Debugger UI height
|
||||||
pref("devtools.debugger.ui.height", 250);
|
pref("devtools.debugger.ui.height", 250);
|
||||||
|
pref("devtools.debugger.ui.remote-win.width", 900);
|
||||||
|
pref("devtools.debugger.ui.remote-win.height", 400);
|
||||||
|
|
||||||
// Enable the style inspector
|
// Enable the style inspector
|
||||||
pref("devtools.styleinspector.enabled", true);
|
pref("devtools.styleinspector.enabled", true);
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 438 B After Width: | Height: | Size: 961 B |
Binary file not shown.
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 3.9 KiB |
@ -194,6 +194,14 @@
|
|||||||
label="&debuggerMenu.label;"
|
label="&debuggerMenu.label;"
|
||||||
key="key_debugger"
|
key="key_debugger"
|
||||||
command="Tools:Debugger"/>
|
command="Tools:Debugger"/>
|
||||||
|
<menuitem id="appmenu_remoteDebugger"
|
||||||
|
hidden="true"
|
||||||
|
label="&remoteDebuggerMenu.label;"
|
||||||
|
command="Tools:RemoteDebugger"/>
|
||||||
|
<menuitem id="appmenu_chromeDebugger"
|
||||||
|
hidden="true"
|
||||||
|
label="&chromeDebuggerMenu.label;"
|
||||||
|
command="Tools:ChromeDebugger"/>
|
||||||
<menuitem id="appmenu_scratchpad"
|
<menuitem id="appmenu_scratchpad"
|
||||||
hidden="true"
|
hidden="true"
|
||||||
label="&scratchpad.label;"
|
label="&scratchpad.label;"
|
||||||
|
@ -225,7 +225,7 @@ var FullZoom = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Avoid the cps roundtrip and apply the default/global pref.
|
// Avoid the cps roundtrip and apply the default/global pref.
|
||||||
if (isBlankPageURL(aURI.spec)) {
|
if (aURI.spec == "about:blank") {
|
||||||
this._applyPrefToSetting(undefined, aBrowser);
|
this._applyPrefToSetting(undefined, aBrowser);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -551,6 +551,14 @@
|
|||||||
label="&debuggerMenu.label;"
|
label="&debuggerMenu.label;"
|
||||||
key="key_debugger"
|
key="key_debugger"
|
||||||
command="Tools:Debugger"/>
|
command="Tools:Debugger"/>
|
||||||
|
<menuitem id="menu_remoteDebugger"
|
||||||
|
hidden="true"
|
||||||
|
label="&remoteDebuggerMenu.label;"
|
||||||
|
command="Tools:RemoteDebugger"/>
|
||||||
|
<menuitem id="menu_chromeDebugger"
|
||||||
|
hidden="true"
|
||||||
|
label="&chromeDebuggerMenu.label;"
|
||||||
|
command="Tools:ChromeDebugger"/>
|
||||||
<menuitem id="menu_scratchpad"
|
<menuitem id="menu_scratchpad"
|
||||||
hidden="true"
|
hidden="true"
|
||||||
label="&scratchpad.label;"
|
label="&scratchpad.label;"
|
||||||
|
@ -129,6 +129,8 @@
|
|||||||
<command id="Tools:WebConsole" oncommand="HUDConsoleUI.toggleHUD();"/>
|
<command id="Tools:WebConsole" oncommand="HUDConsoleUI.toggleHUD();"/>
|
||||||
<command id="Tools:Inspect" oncommand="InspectorUI.toggleInspectorUI();" disabled="true"/>
|
<command id="Tools:Inspect" oncommand="InspectorUI.toggleInspectorUI();" disabled="true"/>
|
||||||
<command id="Tools:Debugger" oncommand="DebuggerUI.toggleDebugger();" disabled="true"/>
|
<command id="Tools:Debugger" oncommand="DebuggerUI.toggleDebugger();" disabled="true"/>
|
||||||
|
<command id="Tools:RemoteDebugger" oncommand="DebuggerUI.toggleRemoteDebugger();" disabled="true"/>
|
||||||
|
<command id="Tools:ChromeDebugger" oncommand="DebuggerUI.toggleChromeDebugger();" disabled="true"/>
|
||||||
<command id="Tools:Scratchpad" oncommand="Scratchpad.openScratchpad();" disabled="true"/>
|
<command id="Tools:Scratchpad" oncommand="Scratchpad.openScratchpad();" disabled="true"/>
|
||||||
<command id="Tools:StyleEditor" oncommand="StyleEditor.openChrome();" disabled="true"/>
|
<command id="Tools:StyleEditor" oncommand="StyleEditor.openChrome();" disabled="true"/>
|
||||||
<command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
|
<command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
|
||||||
|
@ -430,20 +430,11 @@ window[chromehidden~="toolbar"] toolbar:not(.toolbar-primary):not(.chromeclass-m
|
|||||||
/* notification anchors should only be visible when their associated
|
/* notification anchors should only be visible when their associated
|
||||||
notifications are */
|
notifications are */
|
||||||
.notification-anchor-icon {
|
.notification-anchor-icon {
|
||||||
display: none;
|
|
||||||
-moz-user-focus: normal;
|
-moz-user-focus: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We use the iconBox as the notification anchor when a popup notification is
|
.notification-anchor-icon:not([showing]) {
|
||||||
created with a null anchorID, so in that case use a default anchor icon. */
|
display: none;
|
||||||
#notification-popup-box[anchorid="notification-popup-box"] > #default-notification-icon,
|
|
||||||
#notification-popup-box[anchorid="geo-notification-icon"] > #geo-notification-icon,
|
|
||||||
#notification-popup-box[anchorid="indexedDB-notification-icon"] > #indexedDB-notification-icon,
|
|
||||||
#notification-popup-box[anchorid="addons-notification-icon"] > #addons-notification-icon,
|
|
||||||
#notification-popup-box[anchorid="password-notification-icon"] > #password-notification-icon,
|
|
||||||
#notification-popup-box[anchorid="webapps-notification-icon"] > #webapps-notification-icon,
|
|
||||||
#notification-popup-box[anchorid="plugins-notification-icon"] > #plugins-notification-icon {
|
|
||||||
display: -moz-box;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#invalid-form-popup > description {
|
#invalid-form-popup > description {
|
||||||
|
@ -1716,6 +1716,26 @@ function delayedStartup(isLoadingBlank, mustLoadSidebar) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable Remote Debugger?
|
||||||
|
let enabled = gPrefService.getBoolPref("devtools.debugger.remote-enabled");
|
||||||
|
if (enabled) {
|
||||||
|
document.getElementById("menu_remoteDebugger").hidden = false;
|
||||||
|
document.getElementById("Tools:RemoteDebugger").removeAttribute("disabled");
|
||||||
|
#ifdef MENUBAR_CAN_AUTOHIDE
|
||||||
|
document.getElementById("appmenu_remoteDebugger").hidden = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable Chrome Debugger?
|
||||||
|
let enabled = gPrefService.getBoolPref("devtools.chrome.enabled");
|
||||||
|
if (enabled) {
|
||||||
|
document.getElementById("menu_chromeDebugger").hidden = false;
|
||||||
|
document.getElementById("Tools:ChromeDebugger").removeAttribute("disabled");
|
||||||
|
#ifdef MENUBAR_CAN_AUTOHIDE
|
||||||
|
document.getElementById("appmenu_chromeDebugger").hidden = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Enable Error Console?
|
// Enable Error Console?
|
||||||
// XXX Temporarily always-enabled, see bug 601201
|
// XXX Temporarily always-enabled, see bug 601201
|
||||||
let consoleEnabled = true || gPrefService.getBoolPref("devtools.errorconsole.enabled");
|
let consoleEnabled = true || gPrefService.getBoolPref("devtools.errorconsole.enabled");
|
||||||
|
@ -642,6 +642,84 @@ var tests = [
|
|||||||
ok(this.notifyObj.removedCallbackTriggered, "removed callback triggered");
|
ok(this.notifyObj.removedCallbackTriggered, "removed callback triggered");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// Test multiple notification icons are shown
|
||||||
|
{ // Test #21
|
||||||
|
run: function () {
|
||||||
|
this.notifyObj1 = new basicNotification();
|
||||||
|
this.notifyObj1.id += "_1";
|
||||||
|
this.notifyObj1.anchorID = "default-notification-icon";
|
||||||
|
this.notification1 = showNotification(this.notifyObj1);
|
||||||
|
|
||||||
|
this.notifyObj2 = new basicNotification();
|
||||||
|
this.notifyObj2.id += "_2";
|
||||||
|
this.notifyObj2.anchorID = "geo-notification-icon";
|
||||||
|
this.notification2 = showNotification(this.notifyObj2);
|
||||||
|
},
|
||||||
|
onShown: function (popup) {
|
||||||
|
checkPopup(popup, this.notifyObj2);
|
||||||
|
|
||||||
|
// check notifyObj1 anchor icon is showing
|
||||||
|
isnot(document.getElementById("default-notification-icon").boxObject.width, 0,
|
||||||
|
"default anchor should be visible");
|
||||||
|
// check notifyObj2 anchor icon is showing
|
||||||
|
isnot(document.getElementById("geo-notification-icon").boxObject.width, 0,
|
||||||
|
"geo anchor should be visible");
|
||||||
|
|
||||||
|
dismissNotification(popup);
|
||||||
|
},
|
||||||
|
onHidden: [
|
||||||
|
function (popup) {
|
||||||
|
},
|
||||||
|
function (popup) {
|
||||||
|
this.notification1.remove();
|
||||||
|
ok(this.notifyObj1.removedCallbackTriggered, "removed callback triggered");
|
||||||
|
|
||||||
|
this.notification2.remove();
|
||||||
|
ok(this.notifyObj2.removedCallbackTriggered, "removed callback triggered");
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// Test that multiple notification icons are removed when switching tabs
|
||||||
|
{ // Test #22
|
||||||
|
run: function () {
|
||||||
|
// show the notification on old tab.
|
||||||
|
this.notifyObjOld = new basicNotification();
|
||||||
|
this.notifyObjOld.anchorID = "default-notification-icon";
|
||||||
|
this.notificationOld = showNotification(this.notifyObjOld);
|
||||||
|
|
||||||
|
// switch tab
|
||||||
|
this.oldSelectedTab = gBrowser.selectedTab;
|
||||||
|
gBrowser.selectedTab = gBrowser.addTab("about:blank");
|
||||||
|
|
||||||
|
// show the notification on new tab.
|
||||||
|
this.notifyObjNew = new basicNotification();
|
||||||
|
this.notifyObjNew.anchorID = "geo-notification-icon";
|
||||||
|
this.notificationNew = showNotification(this.notifyObjNew);
|
||||||
|
},
|
||||||
|
onShown: function (popup) {
|
||||||
|
checkPopup(popup, this.notifyObjNew);
|
||||||
|
|
||||||
|
// check notifyObjOld anchor icon is removed
|
||||||
|
is(document.getElementById("default-notification-icon").boxObject.width, 0,
|
||||||
|
"default anchor shouldn't be visible");
|
||||||
|
// check notifyObjNew anchor icon is showing
|
||||||
|
isnot(document.getElementById("geo-notification-icon").boxObject.width, 0,
|
||||||
|
"geo anchor should be visible");
|
||||||
|
|
||||||
|
dismissNotification(popup);
|
||||||
|
},
|
||||||
|
onHidden: [
|
||||||
|
function (popup) {
|
||||||
|
},
|
||||||
|
function (popup) {
|
||||||
|
this.notificationNew.remove();
|
||||||
|
gBrowser.removeTab(gBrowser.selectedTab);
|
||||||
|
|
||||||
|
gBrowser.selectedTab = this.oldSelectedTab;
|
||||||
|
this.notificationOld.remove();
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
function showNotification(notifyObj) {
|
function showNotification(notifyObj) {
|
||||||
|
@ -241,16 +241,13 @@ var PlacesOrganizer = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update the selected folder title where it appears in the UI: the folder
|
// Update the selected folder title where it appears in the UI: the folder
|
||||||
// scope button, "Find in <current collection>" command, and the search box
|
// scope button, and the search box emptytext.
|
||||||
// emptytext. They must be updated even if the selection hasn't changed --
|
// They must be updated even if the selection hasn't changed --
|
||||||
// specifically when node's title changes. In that case a selection event
|
// specifically when node's title changes. In that case a selection event
|
||||||
// is generated, this method is called, but the selection does not change.
|
// is generated, this method is called, but the selection does not change.
|
||||||
var folderButton = document.getElementById("scopeBarFolder");
|
var folderButton = document.getElementById("scopeBarFolder");
|
||||||
var folderTitle = node.title || folderButton.getAttribute("emptytitle");
|
var folderTitle = node.title || folderButton.getAttribute("emptytitle");
|
||||||
folderButton.setAttribute("label", folderTitle);
|
folderButton.setAttribute("label", folderTitle);
|
||||||
var cmd = document.getElementById("OrganizerCommand_find:current");
|
|
||||||
var label = PlacesUIUtils.getFormattedString("findInPrefix", [folderTitle]);
|
|
||||||
cmd.setAttribute("label", label);
|
|
||||||
if (PlacesSearchBox.filterCollection == "collection")
|
if (PlacesSearchBox.filterCollection == "collection")
|
||||||
PlacesSearchBox.updateCollectionTitle(folderTitle);
|
PlacesSearchBox.updateCollectionTitle(folderTitle);
|
||||||
|
|
||||||
@ -925,18 +922,20 @@ var PlacesSearchBox = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds across all bookmarks
|
* Finds across all history, downloads or all bookmarks.
|
||||||
*/
|
*/
|
||||||
findAll: function PSB_findAll() {
|
findAll: function PSB_findAll() {
|
||||||
|
switch (this.filterCollection) {
|
||||||
|
case "history":
|
||||||
|
PlacesQueryBuilder.setScope("history");
|
||||||
|
break;
|
||||||
|
case "downloads":
|
||||||
|
PlacesQueryBuilder.setScope("downloads");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
PlacesQueryBuilder.setScope("bookmarks");
|
PlacesQueryBuilder.setScope("bookmarks");
|
||||||
this.focus();
|
break;
|
||||||
},
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds in the currently selected Place.
|
|
||||||
*/
|
|
||||||
findCurrent: function PSB_findCurrent() {
|
|
||||||
PlacesQueryBuilder.setScope("collection");
|
|
||||||
this.focus();
|
this.focus();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -947,6 +946,9 @@ var PlacesSearchBox = {
|
|||||||
*/
|
*/
|
||||||
updateCollectionTitle: function PSB_updateCollectionTitle(aTitle) {
|
updateCollectionTitle: function PSB_updateCollectionTitle(aTitle) {
|
||||||
let title = "";
|
let title = "";
|
||||||
|
// This is needed when a user performs a folder-specific search
|
||||||
|
// using the scope bar, removes the search-string, and unfocuses
|
||||||
|
// the search box, at least until the removal of the scope bar.
|
||||||
if (aTitle) {
|
if (aTitle) {
|
||||||
title = PlacesUIUtils.getFormattedString("searchCurrentDefault",
|
title = PlacesUIUtils.getFormattedString("searchCurrentDefault",
|
||||||
[aTitle]);
|
[aTitle]);
|
||||||
|
@ -99,13 +99,7 @@
|
|||||||
|
|
||||||
<commandset id="organizerCommandSet">
|
<commandset id="organizerCommandSet">
|
||||||
<command id="OrganizerCommand_find:all"
|
<command id="OrganizerCommand_find:all"
|
||||||
label="&cmd.findInBookmarks.label;"
|
|
||||||
accesskey="&cmd.findInBookmarks.accesskey;"
|
|
||||||
oncommand="PlacesSearchBox.findAll();"/>
|
oncommand="PlacesSearchBox.findAll();"/>
|
||||||
<command id="OrganizerCommand_find:current"
|
|
||||||
label="&cmd.findCurrent.label;"
|
|
||||||
accesskey="&cmd.findCurrent.accesskey;"
|
|
||||||
oncommand="PlacesSearchBox.findCurrent();"/>
|
|
||||||
<command id="OrganizerCommand_export"
|
<command id="OrganizerCommand_export"
|
||||||
oncommand="PlacesOrganizer.exportBookmarks();"/>
|
oncommand="PlacesOrganizer.exportBookmarks();"/>
|
||||||
<command id="OrganizerCommand_import"
|
<command id="OrganizerCommand_import"
|
||||||
@ -137,10 +131,6 @@
|
|||||||
command="OrganizerCommand_find:all"
|
command="OrganizerCommand_find:all"
|
||||||
key="&cmd.find.key;"
|
key="&cmd.find.key;"
|
||||||
modifiers="accel"/>
|
modifiers="accel"/>
|
||||||
<key id="placesKey_find:current"
|
|
||||||
command="OrganizerCommand_find:current"
|
|
||||||
key="&cmd.find.key;"
|
|
||||||
modifiers="accel,shift"/>
|
|
||||||
|
|
||||||
<!-- Back/Forward Keys Support -->
|
<!-- Back/Forward Keys Support -->
|
||||||
#ifndef XP_MACOSX
|
#ifndef XP_MACOSX
|
||||||
|
@ -45,7 +45,13 @@ const Cc = Components.classes;
|
|||||||
const Ci = Components.interfaces;
|
const Ci = Components.interfaces;
|
||||||
const Cu = Components.utils;
|
const Cu = Components.utils;
|
||||||
|
|
||||||
|
const DBG_XUL = "chrome://browser/content/debugger.xul";
|
||||||
|
const REMOTE_PROFILE_NAME = "_remote-debug";
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
|
||||||
Cu.import("resource://gre/modules/Services.jsm");
|
Cu.import("resource://gre/modules/Services.jsm");
|
||||||
|
Cu.import("resource://gre/modules/FileUtils.jsm");
|
||||||
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
|
|
||||||
let EXPORTED_SYMBOLS = ["DebuggerUI"];
|
let EXPORTED_SYMBOLS = ["DebuggerUI"];
|
||||||
|
|
||||||
@ -75,6 +81,36 @@ DebuggerUI.prototype = {
|
|||||||
return new DebuggerPane(tab);
|
return new DebuggerPane(tab);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a remote debugger in a new process, or stops it if already started.
|
||||||
|
* @see DebuggerProcess.constructor
|
||||||
|
* @return DebuggerProcess if the debugger is started, null if it's stopped.
|
||||||
|
*/
|
||||||
|
toggleRemoteDebugger: function DUI_toggleRemoteDebugger(aOnClose, aOnRun) {
|
||||||
|
let win = this.chromeWindow;
|
||||||
|
|
||||||
|
if (win._remoteDebugger) {
|
||||||
|
win._remoteDebugger.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new DebuggerProcess(win, aOnClose, aOnRun);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a chrome debugger in a new process, or stops it if already started.
|
||||||
|
* @see DebuggerProcess.constructor
|
||||||
|
* @return DebuggerProcess if the debugger is started, null if it's stopped.
|
||||||
|
*/
|
||||||
|
toggleChromeDebugger: function DUI_toggleChromeDebugger(aOnClose, aOnRun) {
|
||||||
|
let win = this.chromeWindow;
|
||||||
|
|
||||||
|
if (win._chromeDebugger) {
|
||||||
|
win._chromeDebugger.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new DebuggerProcess(win, aOnClose, aOnRun, true);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the debugger for a specified tab.
|
* Get the debugger for a specified tab.
|
||||||
* @return DebuggerPane if a debugger exists for the tab, null otherwise
|
* @return DebuggerPane if a debugger exists for the tab, null otherwise
|
||||||
@ -88,7 +124,7 @@ DebuggerUI.prototype = {
|
|||||||
* @return object
|
* @return object
|
||||||
*/
|
*/
|
||||||
get preferences() {
|
get preferences() {
|
||||||
return DebuggerUIPreferences;
|
return DebuggerPreferences;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -100,11 +136,23 @@ DebuggerUI.prototype = {
|
|||||||
*/
|
*/
|
||||||
function DebuggerPane(aTab) {
|
function DebuggerPane(aTab) {
|
||||||
this._tab = aTab;
|
this._tab = aTab;
|
||||||
|
|
||||||
|
this._initServer();
|
||||||
this._create();
|
this._create();
|
||||||
}
|
}
|
||||||
|
|
||||||
DebuggerPane.prototype = {
|
DebuggerPane.prototype = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the debugger server.
|
||||||
|
*/
|
||||||
|
_initServer: function DP__initServer() {
|
||||||
|
if (!DebuggerServer.initialized) {
|
||||||
|
DebuggerServer.init();
|
||||||
|
DebuggerServer.addBrowserActors();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates and initializes the widgets containing the debugger UI.
|
* Creates and initializes the widgets containing the debugger UI.
|
||||||
*/
|
*/
|
||||||
@ -118,7 +166,7 @@ DebuggerPane.prototype = {
|
|||||||
this._splitter.setAttribute("class", "hud-splitter");
|
this._splitter.setAttribute("class", "hud-splitter");
|
||||||
|
|
||||||
this._frame = ownerDocument.createElement("iframe");
|
this._frame = ownerDocument.createElement("iframe");
|
||||||
this._frame.height = DebuggerUIPreferences.height;
|
this._frame.height = DebuggerPreferences.height;
|
||||||
|
|
||||||
this._nbox = gBrowser.getNotificationBox(this._tab.linkedBrowser);
|
this._nbox = gBrowser.getNotificationBox(this._tab.linkedBrowser);
|
||||||
this._nbox.appendChild(this._splitter);
|
this._nbox.appendChild(this._splitter);
|
||||||
@ -139,7 +187,7 @@ DebuggerPane.prototype = {
|
|||||||
self.getBreakpoint = bkp.getBreakpoint;
|
self.getBreakpoint = bkp.getBreakpoint;
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
this._frame.setAttribute("src", "chrome://browser/content/debugger.xul");
|
this._frame.setAttribute("src", DBG_XUL);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -149,10 +197,10 @@ DebuggerPane.prototype = {
|
|||||||
if (!this._tab) {
|
if (!this._tab) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._tab._scriptDebugger = null;
|
delete this._tab._scriptDebugger;
|
||||||
this._tab = null;
|
this._tab = null;
|
||||||
|
|
||||||
DebuggerUIPreferences.height = this._frame.height;
|
DebuggerPreferences.height = this._frame.height;
|
||||||
this._frame.removeEventListener("Debugger:Close", this.close, true);
|
this._frame.removeEventListener("Debugger:Close", this.close, true);
|
||||||
this._frame.removeEventListener("unload", this.close, true);
|
this._frame.removeEventListener("unload", this.close, true);
|
||||||
|
|
||||||
@ -186,9 +234,117 @@ DebuggerPane.prototype = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Various debugger UI preferences (currently just the pane height).
|
* Creates a process that will hold the remote debugger.
|
||||||
|
*
|
||||||
|
* @param function aOnClose
|
||||||
|
* Optional, a function called when the process exits.
|
||||||
|
* @param function aOnRun
|
||||||
|
* Optional, a function called when the process starts running.
|
||||||
|
* @param boolean aInitServerFlag
|
||||||
|
* True to initialize the server. This should happen only in the chrome
|
||||||
|
* debugging case. This should also be true by default after bug #747429.
|
||||||
|
* @param nsIDOMWindow aWindow
|
||||||
|
* The chrome window for which the remote debugger instance is created.
|
||||||
*/
|
*/
|
||||||
let DebuggerUIPreferences = {
|
function DebuggerProcess(aWindow, aOnClose, aOnRun, aInitServerFlag) {
|
||||||
|
this._win = aWindow;
|
||||||
|
this._closeCallback = aOnClose;
|
||||||
|
this._runCallback = aOnRun;
|
||||||
|
|
||||||
|
aInitServerFlag && this._initServer();
|
||||||
|
this._initProfile();
|
||||||
|
this._create();
|
||||||
|
}
|
||||||
|
|
||||||
|
DebuggerProcess.prototype = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the debugger server.
|
||||||
|
*/
|
||||||
|
_initServer: function RDP__initServer() {
|
||||||
|
if (!DebuggerServer.initialized) {
|
||||||
|
DebuggerServer.init();
|
||||||
|
DebuggerServer.addBrowserActors();
|
||||||
|
}
|
||||||
|
DebuggerServer.closeListener();
|
||||||
|
DebuggerServer.openListener(DebuggerPreferences.remotePort, false);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a profile for the remote debugger process.
|
||||||
|
*/
|
||||||
|
_initProfile: function RDP__initProfile() {
|
||||||
|
let profileService = Cc["@mozilla.org/toolkit/profile-service;1"]
|
||||||
|
.createInstance(Ci.nsIToolkitProfileService);
|
||||||
|
|
||||||
|
let dbgProfileName;
|
||||||
|
try {
|
||||||
|
dbgProfileName = profileService.selectedProfile.name + REMOTE_PROFILE_NAME;
|
||||||
|
} catch(e) {
|
||||||
|
dbgProfileName = REMOTE_PROFILE_NAME;
|
||||||
|
Cu.reportError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dbgProfile = profileService.createProfile(null, null, dbgProfileName);
|
||||||
|
profileService.flush();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and initializes the profile & process for the remote debugger.
|
||||||
|
*/
|
||||||
|
_create: function RDP__create() {
|
||||||
|
this._win._remoteDebugger = this;
|
||||||
|
|
||||||
|
let file = FileUtils.getFile("CurProcD",
|
||||||
|
[Services.appinfo.OS == "WINNT" ? "firefox.exe"
|
||||||
|
: "firefox-bin"]);
|
||||||
|
|
||||||
|
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
|
||||||
|
process.init(file);
|
||||||
|
|
||||||
|
let args = [
|
||||||
|
"-no-remote", "-P", this._dbgProfile.name,
|
||||||
|
"-chrome", DBG_XUL,
|
||||||
|
"-width", DebuggerPreferences.remoteWinWidth,
|
||||||
|
"-height", DebuggerPreferences.remoteWinHeight];
|
||||||
|
|
||||||
|
process.runwAsync(args, args.length, { observe: this.close.bind(this) });
|
||||||
|
this._dbgProcess = process;
|
||||||
|
|
||||||
|
if (typeof this._runCallback === "function") {
|
||||||
|
this._runCallback.call({}, this);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the remote debugger, removing the profile and killing the process.
|
||||||
|
*/
|
||||||
|
close: function RDP_close() {
|
||||||
|
if (!this._win) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
delete this._win._remoteDebugger;
|
||||||
|
this._win = null;
|
||||||
|
|
||||||
|
if (this._dbgProcess.isRunning) {
|
||||||
|
this._dbgProcess.kill();
|
||||||
|
}
|
||||||
|
if (this._dbgProfile) {
|
||||||
|
this._dbgProfile.remove(false);
|
||||||
|
}
|
||||||
|
if (typeof this._closeCallback === "function") {
|
||||||
|
this._closeCallback.call({}, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dbgProcess = null;
|
||||||
|
this._dbgProfile = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Various debugger preferences.
|
||||||
|
*/
|
||||||
|
let DebuggerPreferences = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the preferred height of the debugger pane.
|
* Gets the preferred height of the debugger pane.
|
||||||
@ -210,3 +366,35 @@ let DebuggerUIPreferences = {
|
|||||||
this._height = value;
|
this._height = value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred width of the remote debugger window.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remoteWinWidth", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.ui.remote-win.width");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred height of the remote debugger window.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remoteWinHeight", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.ui.remote-win.height");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging host.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remoteHost", function() {
|
||||||
|
return Services.prefs.getCharPref("devtools.debugger.remote-host");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging port.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remotePort", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.remote-port");
|
||||||
|
});
|
||||||
|
@ -114,6 +114,7 @@ let DebuggerController = {
|
|||||||
|
|
||||||
this.dispatchEvent("Debugger:Unloaded");
|
this.dispatchEvent("Debugger:Unloaded");
|
||||||
this._disconnect();
|
this._disconnect();
|
||||||
|
this._isRemote && this._quitApp();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,12 +122,10 @@ let DebuggerController = {
|
|||||||
* wiring event handlers as necessary.
|
* wiring event handlers as necessary.
|
||||||
*/
|
*/
|
||||||
_connect: function DC__connect() {
|
_connect: function DC__connect() {
|
||||||
if (!DebuggerServer.initialized) {
|
let transport =
|
||||||
DebuggerServer.init();
|
this._isRemote ? debuggerSocketConnect(Prefs.remoteHost, Prefs.remotePort)
|
||||||
DebuggerServer.addBrowserActors();
|
: DebuggerServer.connectPipe();
|
||||||
}
|
|
||||||
|
|
||||||
let transport = DebuggerServer.connectPipe();
|
|
||||||
let client = this.client = new DebuggerClient(transport);
|
let client = this.client = new DebuggerClient(transport);
|
||||||
|
|
||||||
client.addListener("tabNavigated", this._onTabNavigated);
|
client.addListener("tabNavigated", this._onTabNavigated);
|
||||||
@ -220,6 +219,31 @@ let DebuggerController = {
|
|||||||
}.bind(this));
|
}.bind(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this is a remote debugger instance.
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
get _isRemote() {
|
||||||
|
return !window.parent.content;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to quit the current process if allowed.
|
||||||
|
*/
|
||||||
|
_quitApp: function DC__quitApp() {
|
||||||
|
let canceled = Cc["@mozilla.org/supports-PRBool;1"]
|
||||||
|
.createInstance(Ci.nsISupportsPRBool);
|
||||||
|
|
||||||
|
Services.obs.notifyObservers(canceled, "quit-application-requested", null);
|
||||||
|
|
||||||
|
// Somebody canceled our quit request.
|
||||||
|
if (canceled.data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience method, dispatching a custom event.
|
* Convenience method, dispatching a custom event.
|
||||||
*
|
*
|
||||||
@ -470,6 +494,38 @@ StackFrames.prototype = {
|
|||||||
this._addExpander(thisVar, frame.this);
|
this._addExpander(thisVar, frame.this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (frame.environment) {
|
||||||
|
// Add nodes for every argument.
|
||||||
|
let variables = frame.environment.bindings.arguments;
|
||||||
|
for each (let variable in variables) {
|
||||||
|
let name = Object.getOwnPropertyNames(variable)[0];
|
||||||
|
let paramVar = localScope.addVar(name);
|
||||||
|
let paramVal = variable[name].value;
|
||||||
|
paramVar.setGrip(paramVal);
|
||||||
|
this._addExpander(paramVar, paramVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add nodes for every other variable in scope.
|
||||||
|
variables = frame.environment.bindings.variables;
|
||||||
|
for (let variable in variables) {
|
||||||
|
let paramVar = localScope.addVar(variable);
|
||||||
|
let paramVal = variables[variable].value;
|
||||||
|
paramVar.setGrip(paramVal);
|
||||||
|
this._addExpander(paramVar, paramVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we already found 'arguments', we are done here.
|
||||||
|
if ("arguments" in frame.environment.bindings.variables) {
|
||||||
|
// Signal that variables have been fetched.
|
||||||
|
DebuggerController.dispatchEvent("Debugger:FetchedVariables");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sometimes in call frames with arguments we don't get 'arguments' in the
|
||||||
|
// environment (bug 746601) and we have to construct it manually. Note, that
|
||||||
|
// in this case arguments.callee will be absent, even in the cases where it
|
||||||
|
// shouldn't be.
|
||||||
if (frame.arguments && frame.arguments.length > 0) {
|
if (frame.arguments && frame.arguments.length > 0) {
|
||||||
// Add "arguments".
|
// Add "arguments".
|
||||||
let argsVar = localScope.addVar("arguments");
|
let argsVar = localScope.addVar("arguments");
|
||||||
@ -479,33 +535,20 @@ StackFrames.prototype = {
|
|||||||
});
|
});
|
||||||
this._addExpander(argsVar, frame.arguments);
|
this._addExpander(argsVar, frame.arguments);
|
||||||
|
|
||||||
// Add variables for every argument.
|
// Signal that variables have been fetched.
|
||||||
let objClient = this.activeThread.pauseGrip(frame.callee);
|
DebuggerController.dispatchEvent("Debugger:FetchedVariables");
|
||||||
objClient.getSignature(function SF_getSignature(aResponse) {
|
|
||||||
for (let i = 0, l = aResponse.parameters.length; i < l; i++) {
|
|
||||||
let param = aResponse.parameters[i];
|
|
||||||
let paramVar = localScope.addVar(param);
|
|
||||||
let paramVal = frame.arguments[i];
|
|
||||||
|
|
||||||
paramVar.setGrip(paramVal);
|
|
||||||
this._addExpander(paramVar, paramVal);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signal that call parameters have been fetched.
|
|
||||||
DebuggerController.dispatchEvent("Debugger:FetchedParameters");
|
|
||||||
|
|
||||||
}.bind(this));
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a onexpand callback for a variable, lazily handling the addition of
|
* Adds an 'onexpand' callback for a variable, lazily handling the addition of
|
||||||
* new properties.
|
* new properties.
|
||||||
*/
|
*/
|
||||||
_addExpander: function SF__addExpander(aVar, aObject) {
|
_addExpander: function SF__addExpander(aVar, aObject) {
|
||||||
// No need for expansion for null and undefined values, but we do need them
|
// No need for expansion for null and undefined values, but we do need them
|
||||||
// for frame.arguments which is a regular array.
|
// for frame.arguments which is a regular array.
|
||||||
if (!aObject || typeof aObject !== "object" ||
|
if (!aVar || !aObject || typeof aObject !== "object" ||
|
||||||
(aObject.type !== "object" && !Array.isArray(aObject))) {
|
(aObject.type !== "object" && !Array.isArray(aObject))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -686,7 +729,7 @@ SourceScripts.prototype = {
|
|||||||
* Handler for the debugger client's unsolicited newScript notification.
|
* Handler for the debugger client's unsolicited newScript notification.
|
||||||
*/
|
*/
|
||||||
_onNewScript: function SS__onNewScript(aNotification, aPacket) {
|
_onNewScript: function SS__onNewScript(aNotification, aPacket) {
|
||||||
this._addScript({ url: aPacket.url, startLine: aPacket.startLine });
|
this._addScript({ url: aPacket.url, startLine: aPacket.startLine }, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -694,8 +737,9 @@ SourceScripts.prototype = {
|
|||||||
*/
|
*/
|
||||||
_onScriptsAdded: function SS__onScriptsAdded() {
|
_onScriptsAdded: function SS__onScriptsAdded() {
|
||||||
for each (let script in this.activeThread.cachedScripts) {
|
for each (let script in this.activeThread.cachedScripts) {
|
||||||
this._addScript(script);
|
this._addScript(script, false);
|
||||||
}
|
}
|
||||||
|
DebuggerView.Scripts.commitScripts();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -747,6 +791,22 @@ SourceScripts.prototype = {
|
|||||||
return aUrl;
|
return aUrl;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the prePath for a script URL.
|
||||||
|
*
|
||||||
|
* @param string aUrl
|
||||||
|
* The script url.
|
||||||
|
* @return string
|
||||||
|
* The script prePath if the url is valid, null otherwise.
|
||||||
|
*/
|
||||||
|
_getScriptPrePath: function SS__getScriptDomain(aUrl) {
|
||||||
|
try {
|
||||||
|
return Services.io.newURI(aUrl, null, null).prePath + "/";
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a unique, simplified label from a script url.
|
* Gets a unique, simplified label from a script url.
|
||||||
* ex: a). ici://some.address.com/random/subrandom/
|
* ex: a). ici://some.address.com/random/subrandom/
|
||||||
@ -763,7 +823,7 @@ SourceScripts.prototype = {
|
|||||||
* The script url.
|
* The script url.
|
||||||
* @param string aHref
|
* @param string aHref
|
||||||
* The content location href to be used. If unspecified, it will
|
* The content location href to be used. If unspecified, it will
|
||||||
* defalult to debugged panrent window location.
|
* default to the script url prepath.
|
||||||
* @return string
|
* @return string
|
||||||
* The simplified label.
|
* The simplified label.
|
||||||
*/
|
*/
|
||||||
@ -774,15 +834,18 @@ SourceScripts.prototype = {
|
|||||||
return this._labelsCache[url];
|
return this._labelsCache[url];
|
||||||
}
|
}
|
||||||
|
|
||||||
let href = aHref || window.parent.content.location.href;
|
let content = window.parent.content;
|
||||||
|
let domain = content ? content.location.href : this._getScriptPrePath(aUrl);
|
||||||
|
|
||||||
|
let href = aHref || domain;
|
||||||
let pathElements = url.split("/");
|
let pathElements = url.split("/");
|
||||||
let label = pathElements.pop() || (pathElements.pop() + "/");
|
let label = pathElements.pop() || (pathElements.pop() + "/");
|
||||||
|
|
||||||
// if the label as a leaf name is alreay present in the scripts list
|
// If the label as a leaf name is already present in the scripts list.
|
||||||
if (DebuggerView.Scripts.containsLabel(label)) {
|
if (DebuggerView.Scripts.containsLabel(label)) {
|
||||||
label = url.replace(href.substring(0, href.lastIndexOf("/") + 1), "");
|
label = url.replace(href.substring(0, href.lastIndexOf("/") + 1), "");
|
||||||
|
|
||||||
// if the path/to/script is exactly the same, we're in different domains
|
// If the path/to/script is exactly the same, we're in different domains.
|
||||||
if (DebuggerView.Scripts.containsLabel(label)) {
|
if (DebuggerView.Scripts.containsLabel(label)) {
|
||||||
label = url;
|
label = url;
|
||||||
}
|
}
|
||||||
@ -800,15 +863,16 @@ SourceScripts.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the specified script to the list and display it in the editor if the
|
* Add the specified script to the list.
|
||||||
* editor is empty.
|
*
|
||||||
|
* @param object aScript
|
||||||
|
* The script object coming from the active thread.
|
||||||
|
* @param boolean aForceFlag
|
||||||
|
* True to force the script to be immediately added.
|
||||||
*/
|
*/
|
||||||
_addScript: function SS__addScript(aScript) {
|
_addScript: function SS__addScript(aScript, aForceFlag) {
|
||||||
DebuggerView.Scripts.addScript(this._getScriptLabel(aScript.url), aScript);
|
DebuggerView.Scripts.addScript(
|
||||||
|
this._getScriptLabel(aScript.url), aScript, aForceFlag);
|
||||||
if (DebuggerView.editor.getCharCount() == 0) {
|
|
||||||
this.showScript(aScript);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -876,7 +940,7 @@ SourceScripts.prototype = {
|
|||||||
* Handles notifications to load a source script from the cache or from a
|
* Handles notifications to load a source script from the cache or from a
|
||||||
* local file.
|
* local file.
|
||||||
*
|
*
|
||||||
* XXX: Tt may be better to use nsITraceableChannel to get to the sources
|
* XXX: It may be better to use nsITraceableChannel to get to the sources
|
||||||
* without relying on caching when we can (not for eval, etc.):
|
* without relying on caching when we can (not for eval, etc.):
|
||||||
* http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/
|
* http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/
|
||||||
*/
|
*/
|
||||||
@ -967,7 +1031,7 @@ SourceScripts.prototype = {
|
|||||||
* The failure status code.
|
* The failure status code.
|
||||||
*/
|
*/
|
||||||
_logError: function SS__logError(aUrl, aStatus) {
|
_logError: function SS__logError(aUrl, aStatus) {
|
||||||
Components.utils.reportError(L10N.getFormatStr("loadingError", [aUrl, aStatus]));
|
Cu.reportError(L10N.getFormatStr("loadingError", [aUrl, aStatus]));
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1258,6 +1322,27 @@ XPCOMUtils.defineLazyGetter(L10N, "stringBundle", function() {
|
|||||||
return Services.strings.createBundle(DBG_STRINGS_URI);
|
return Services.strings.createBundle(DBG_STRINGS_URI);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shortcuts for accessing various debugger preferences.
|
||||||
|
*/
|
||||||
|
let Prefs = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging host.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(Prefs, "remoteHost", function() {
|
||||||
|
return Services.prefs.getCharPref("devtools.debugger.remote-host");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging port.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(Prefs, "remotePort", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.remote-port");
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preliminary setup for the DebuggerController object.
|
* Preliminary setup for the DebuggerController object.
|
||||||
*/
|
*/
|
||||||
|
@ -90,6 +90,7 @@ let DebuggerView = {
|
|||||||
*/
|
*/
|
||||||
function ScriptsView() {
|
function ScriptsView() {
|
||||||
this._onScriptsChange = this._onScriptsChange.bind(this);
|
this._onScriptsChange = this._onScriptsChange.bind(this);
|
||||||
|
this._onScriptsSearch = this._onScriptsSearch.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptsView.prototype = {
|
ScriptsView.prototype = {
|
||||||
@ -103,6 +104,14 @@ ScriptsView.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the input in the searchbox and unhides all the scripts.
|
||||||
|
*/
|
||||||
|
clearSearch: function DVS_clearSearch() {
|
||||||
|
this._searchbox.value = "";
|
||||||
|
this._onScriptsSearch({});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the script with the specified URL is among the scripts
|
* Checks whether the script with the specified URL is among the scripts
|
||||||
* known to the debugger and shown in the list.
|
* known to the debugger and shown in the list.
|
||||||
@ -112,6 +121,11 @@ ScriptsView.prototype = {
|
|||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
contains: function DVS_contains(aUrl) {
|
contains: function DVS_contains(aUrl) {
|
||||||
|
if (this._tmpScripts.some(function(element) {
|
||||||
|
return element.script.url == aUrl;
|
||||||
|
})) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (this._scripts.getElementsByAttribute("value", aUrl).length > 0) {
|
if (this._scripts.getElementsByAttribute("value", aUrl).length > 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -127,6 +141,11 @@ ScriptsView.prototype = {
|
|||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
containsLabel: function DVS_containsLabel(aLabel) {
|
containsLabel: function DVS_containsLabel(aLabel) {
|
||||||
|
if (this._tmpScripts.some(function(element) {
|
||||||
|
return element.label == aLabel;
|
||||||
|
})) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (this._scripts.getElementsByAttribute("label", aLabel).length > 0) {
|
if (this._scripts.getElementsByAttribute("label", aLabel).length > 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -171,6 +190,18 @@ ScriptsView.prototype = {
|
|||||||
this._scripts.selectedItem.value : null;
|
this._scripts.selectedItem.value : null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the list of labels in the scripts container.
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
get scriptLabels() {
|
||||||
|
let labels = [];
|
||||||
|
for (let i = 0, l = this._scripts.itemCount; i < l; i++) {
|
||||||
|
labels.push(this._scripts.getItemAtIndex(i).label);
|
||||||
|
}
|
||||||
|
return labels;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the list of URIs for scripts in the page.
|
* Returns the list of URIs for scripts in the page.
|
||||||
* @return array
|
* @return array
|
||||||
@ -184,50 +215,212 @@ ScriptsView.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a script to the scripts container.
|
* Gets the number of visible (hidden=false) scripts in the container.
|
||||||
* If the script already exists (was previously added), null is returned.
|
* @return number
|
||||||
* Otherwise, the newly created element is returned.
|
*/
|
||||||
|
get visibleItemsCount() {
|
||||||
|
let count = 0;
|
||||||
|
for (let i = 0, l = this._scripts.itemCount; i < l; i++) {
|
||||||
|
count += this._scripts.getItemAtIndex(i).hidden ? 0 : 1;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares a script to be added to the scripts container. This allows
|
||||||
|
* for a large number of scripts to be batched up before being
|
||||||
|
* alphabetically sorted and added in the container.
|
||||||
|
* @see ScriptsView.commitScripts
|
||||||
|
*
|
||||||
|
* If aForceFlag is true, the script will be immediately inserted at the
|
||||||
|
* necessary position in the container so that all the scripts remain sorted.
|
||||||
|
* This can be much slower than batching up multiple scripts.
|
||||||
*
|
*
|
||||||
* @param string aLabel
|
* @param string aLabel
|
||||||
* The simplified script location to be shown.
|
* The simplified script location to be shown.
|
||||||
* @param string aScript
|
* @param string aScript
|
||||||
* The source script.
|
* The source script.
|
||||||
* @return object
|
* @param boolean aForceFlag
|
||||||
* The newly created html node representing the added script.
|
* True to force the script to be immediately added.
|
||||||
*/
|
*/
|
||||||
addScript: function DVS_addScript(aLabel, aScript) {
|
addScript: function DVS_addScript(aLabel, aScript, aForceFlag) {
|
||||||
// Make sure we don't duplicate anything.
|
// Batch the script to be added later.
|
||||||
if (this.containsLabel(aLabel)) {
|
if (!aForceFlag) {
|
||||||
return null;
|
this._tmpScripts.push({ label: aLabel, script: aScript });
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let script = this._scripts.appendItem(aLabel, aScript.url);
|
// Find the target position in the menulist and insert the script there.
|
||||||
script.setAttribute("tooltiptext", aScript.url);
|
for (let i = 0, l = this._scripts.itemCount; i < l; i++) {
|
||||||
script.setUserData("sourceScript", aScript, null);
|
if (this._scripts.getItemAtIndex(i).label > aLabel) {
|
||||||
|
this._createScriptElement(aLabel, aScript, i);
|
||||||
this._scripts.selectedItem = script;
|
return;
|
||||||
return script;
|
}
|
||||||
|
}
|
||||||
|
// The script is alphabetically the last one.
|
||||||
|
this._createScriptElement(aLabel, aScript, -1, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The cached click listener for the scripts container.
|
* Adds all the prepared scripts to the scripts container.
|
||||||
|
* If a script already exists (was previously added), nothing happens.
|
||||||
|
*/
|
||||||
|
commitScripts: function DVS_commitScripts() {
|
||||||
|
let newScripts = this._tmpScripts;
|
||||||
|
this._tmpScripts = [];
|
||||||
|
|
||||||
|
if (!newScripts || !newScripts.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newScripts.sort(function(a, b) {
|
||||||
|
return a.label.toLowerCase() > b.label.toLowerCase();
|
||||||
|
});
|
||||||
|
|
||||||
|
for (let i = 0, l = newScripts.length; i < l; i++) {
|
||||||
|
let item = newScripts[i];
|
||||||
|
this._createScriptElement(item.label, item.script, -1, true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a custom script element and adds it to the scripts container.
|
||||||
|
* If the script with the specified label already exists, nothing happens.
|
||||||
|
*
|
||||||
|
* @param string aLabel
|
||||||
|
* The simplified script location to be shown.
|
||||||
|
* @param string aScript
|
||||||
|
* The source script.
|
||||||
|
* @param number aIndex
|
||||||
|
* The index where to insert to new script in the container.
|
||||||
|
* Pass -1 to append the script at the end.
|
||||||
|
* @param boolean aSelectIfEmptyFlag
|
||||||
|
* True to set the newly created script as the currently selected item
|
||||||
|
* if there are no other existing scripts in the container.
|
||||||
|
*/
|
||||||
|
_createScriptElement: function DVS__createScriptElement(
|
||||||
|
aLabel, aScript, aIndex, aSelectIfEmptyFlag)
|
||||||
|
{
|
||||||
|
// Make sure we don't duplicate anything.
|
||||||
|
if (aLabel == "null" || this.containsLabel(aLabel)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let scriptItem =
|
||||||
|
aIndex == -1 ? this._scripts.appendItem(aLabel, aScript.url)
|
||||||
|
: this._scripts.insertItemAt(aIndex, aLabel, aScript.url);
|
||||||
|
|
||||||
|
scriptItem.setAttribute("tooltiptext", aScript.url);
|
||||||
|
scriptItem.setUserData("sourceScript", aScript, null);
|
||||||
|
|
||||||
|
if (this._scripts.itemCount == 1 && aSelectIfEmptyFlag) {
|
||||||
|
this._scripts.selectedItem = scriptItem;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The click listener for the scripts container.
|
||||||
*/
|
*/
|
||||||
_onScriptsChange: function DVS__onScriptsChange() {
|
_onScriptsChange: function DVS__onScriptsChange() {
|
||||||
let script = this._scripts.selectedItem.getUserData("sourceScript");
|
let script = this._scripts.selectedItem.getUserData("sourceScript");
|
||||||
|
this._preferredScript = script;
|
||||||
DebuggerController.SourceScripts.showScript(script);
|
DebuggerController.SourceScripts.showScript(script);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The cached scripts container.
|
* The search listener for the scripts search box.
|
||||||
|
*/
|
||||||
|
_onScriptsSearch: function DVS__onScriptsSearch(e) {
|
||||||
|
let editor = DebuggerView.editor;
|
||||||
|
let scripts = this._scripts;
|
||||||
|
let rawValue = this._searchbox.value.toLowerCase();
|
||||||
|
|
||||||
|
let rawLength = rawValue.length;
|
||||||
|
let lastColon = rawValue.lastIndexOf(":");
|
||||||
|
let lastAt = rawValue.lastIndexOf("@");
|
||||||
|
|
||||||
|
let fileEnd = lastColon != -1 ? lastColon : lastAt != -1 ? lastAt : rawLength;
|
||||||
|
let lineEnd = lastAt != -1 ? lastAt : rawLength;
|
||||||
|
|
||||||
|
let file = rawValue.slice(0, fileEnd);
|
||||||
|
let line = window.parseInt(rawValue.slice(fileEnd + 1, lineEnd)) || -1;
|
||||||
|
let token = rawValue.slice(lineEnd + 1);
|
||||||
|
|
||||||
|
// Presume we won't find anything.
|
||||||
|
scripts.selectedItem = this._preferredScript;
|
||||||
|
|
||||||
|
// If we're not searching for a file anymore, unhide all the scripts.
|
||||||
|
if (!file) {
|
||||||
|
for (let i = 0, l = scripts.itemCount; i < l; i++) {
|
||||||
|
scripts.getItemAtIndex(i).hidden = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (let i = 0, l = scripts.itemCount, found = false; i < l; i++) {
|
||||||
|
let item = scripts.getItemAtIndex(i);
|
||||||
|
let target = item.value.toLowerCase();
|
||||||
|
|
||||||
|
// Search is not case sensitive, and is tied to the url not the label.
|
||||||
|
if (target.match(file)) {
|
||||||
|
item.hidden = false;
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
found = true;
|
||||||
|
scripts.selectedItem = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Hide what doesn't match our search.
|
||||||
|
else {
|
||||||
|
item.hidden = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (line > -1) {
|
||||||
|
editor.setCaretPosition(line - 1);
|
||||||
|
}
|
||||||
|
if (token) {
|
||||||
|
let offset = editor.find(token, { ignoreCase: true });
|
||||||
|
if (offset > -1) {
|
||||||
|
editor.setCaretPosition(0);
|
||||||
|
editor.setCaretOffset(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The keyup listener for the scripts search box.
|
||||||
|
*/
|
||||||
|
_onScriptsKeyUp: function DVS__onScriptsKeyUp(e) {
|
||||||
|
if (e.keyCode === e.DOM_VK_ESCAPE) {
|
||||||
|
DebuggerView.editor.focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.keyCode === e.DOM_VK_RETURN || e.keyCode === e.DOM_VK_ENTER) {
|
||||||
|
let editor = DebuggerView.editor;
|
||||||
|
let offset = editor.findNext(true);
|
||||||
|
if (offset > -1) {
|
||||||
|
editor.setCaretPosition(0);
|
||||||
|
editor.setCaretOffset(offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The cached scripts container and search box.
|
||||||
*/
|
*/
|
||||||
_scripts: null,
|
_scripts: null,
|
||||||
|
_searchbox: null,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization function, called when the debugger is initialized.
|
* Initialization function, called when the debugger is initialized.
|
||||||
*/
|
*/
|
||||||
initialize: function DVS_initialize() {
|
initialize: function DVS_initialize() {
|
||||||
this._scripts = document.getElementById("scripts");
|
this._scripts = document.getElementById("scripts");
|
||||||
|
this._searchbox = document.getElementById("scripts-search");
|
||||||
this._scripts.addEventListener("select", this._onScriptsChange, false);
|
this._scripts.addEventListener("select", this._onScriptsChange, false);
|
||||||
|
this._searchbox.addEventListener("select", this._onScriptsSearch, false);
|
||||||
|
this._searchbox.addEventListener("input", this._onScriptsSearch, false);
|
||||||
|
this._searchbox.addEventListener("keyup", this._onScriptsKeyUp, false);
|
||||||
|
this.commitScripts();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -235,7 +428,11 @@ ScriptsView.prototype = {
|
|||||||
*/
|
*/
|
||||||
destroy: function DVS_destroy() {
|
destroy: function DVS_destroy() {
|
||||||
this._scripts.removeEventListener("select", this._onScriptsChange, false);
|
this._scripts.removeEventListener("select", this._onScriptsChange, false);
|
||||||
|
this._searchbox.removeEventListener("select", this._onScriptsSearch, false);
|
||||||
|
this._searchbox.removeEventListener("input", this._onScriptsSearch, false);
|
||||||
|
this._searchbox.removeEventListener("keyup", this._onScriptsKeyUp, false);
|
||||||
this._scripts = null;
|
this._scripts = null;
|
||||||
|
this._searchbox = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -277,6 +474,8 @@ StackFramesView.prototype = {
|
|||||||
else {
|
else {
|
||||||
status.textContent = "";
|
status.textContent = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DebuggerView.Scripts.clearSearch();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -300,7 +499,7 @@ StackFramesView.prototype = {
|
|||||||
|
|
||||||
// The empty node should look grayed out to avoid confusion.
|
// The empty node should look grayed out to avoid confusion.
|
||||||
item.className = "empty list-item";
|
item.className = "empty list-item";
|
||||||
item.appendChild(document.createTextNode(L10N.getStr("emptyText")));
|
item.appendChild(document.createTextNode(L10N.getStr("emptyStackText")));
|
||||||
|
|
||||||
this._frames.appendChild(item);
|
this._frames.appendChild(item);
|
||||||
},
|
},
|
||||||
@ -381,7 +580,7 @@ StackFramesView.prototype = {
|
|||||||
* The frame depth specified by the debugger.
|
* The frame depth specified by the debugger.
|
||||||
*/
|
*/
|
||||||
unhighlightFrame: function DVF_unhighlightFrame(aDepth) {
|
unhighlightFrame: function DVF_unhighlightFrame(aDepth) {
|
||||||
this.highlightFrame(aDepth, true)
|
this.highlightFrame(aDepth, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,6 +81,8 @@
|
|||||||
<xul:button id="step-in">&debuggerUI.stepInButton;</xul:button>
|
<xul:button id="step-in">&debuggerUI.stepInButton;</xul:button>
|
||||||
<xul:button id="step-out">&debuggerUI.stepOutButton;</xul:button>
|
<xul:button id="step-out">&debuggerUI.stepOutButton;</xul:button>
|
||||||
<xul:menulist id="scripts"/>
|
<xul:menulist id="scripts"/>
|
||||||
|
<xul:textbox id="scripts-search" type="search"
|
||||||
|
emptytext="&debuggerUI.emptyFilterText;"/>
|
||||||
</xul:toolbar>
|
</xul:toolbar>
|
||||||
<div id="dbg-content" class="hbox flex">
|
<div id="dbg-content" class="hbox flex">
|
||||||
<div id="stack" class="vbox">
|
<div id="stack" class="vbox">
|
||||||
|
@ -46,6 +46,7 @@ include $(DEPTH)/config/autoconf.mk
|
|||||||
include $(topsrcdir)/config/rules.mk
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
||||||
_BROWSER_TEST_FILES = \
|
_BROWSER_TEST_FILES = \
|
||||||
|
browser_dbg_createRemote.js \
|
||||||
browser_dbg_debuggerstatement.js \
|
browser_dbg_debuggerstatement.js \
|
||||||
browser_dbg_listtabs.js \
|
browser_dbg_listtabs.js \
|
||||||
browser_dbg_tabactor-01.js \
|
browser_dbg_tabactor-01.js \
|
||||||
@ -70,6 +71,9 @@ _BROWSER_TEST_FILES = \
|
|||||||
browser_dbg_stack-05.js \
|
browser_dbg_stack-05.js \
|
||||||
browser_dbg_location-changes.js \
|
browser_dbg_location-changes.js \
|
||||||
browser_dbg_script-switching.js \
|
browser_dbg_script-switching.js \
|
||||||
|
browser_dbg_scripts-sorting.js \
|
||||||
|
browser_dbg_scripts-searching-01.js \
|
||||||
|
browser_dbg_scripts-searching-02.js \
|
||||||
browser_dbg_pause-resume.js \
|
browser_dbg_pause-resume.js \
|
||||||
browser_dbg_update-editor-mode.js \
|
browser_dbg_update-editor-mode.js \
|
||||||
$(warning browser_dbg_select-line.js temporarily disabled due to oranges, see bug 726609) \
|
$(warning browser_dbg_select-line.js temporarily disabled due to oranges, see bug 726609) \
|
||||||
|
@ -23,37 +23,44 @@ function test()
|
|||||||
let SourceEditor = tempScope.SourceEditor;
|
let SourceEditor = tempScope.SourceEditor;
|
||||||
let scriptShown = false;
|
let scriptShown = false;
|
||||||
let framesAdded = false;
|
let framesAdded = false;
|
||||||
|
let resumed = false;
|
||||||
|
let testStarted = false;
|
||||||
|
|
||||||
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
||||||
gTab = aTab;
|
gTab = aTab;
|
||||||
gDebuggee = aDebuggee;
|
gDebuggee = aDebuggee;
|
||||||
gPane = aPane;
|
gPane = aPane;
|
||||||
gDebugger = gPane.debuggerWindow;
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
resumed = true;
|
||||||
|
|
||||||
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
framesAdded = true;
|
framesAdded = true;
|
||||||
runTest();
|
executeSoon(startTest);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
gDebuggee.firstCall();
|
gDebuggee.firstCall();
|
||||||
});
|
});
|
||||||
|
|
||||||
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
|
||||||
let url = aEvent.detail.url;
|
|
||||||
if (url.indexOf("-02.js") != -1) {
|
|
||||||
scriptShown = true;
|
|
||||||
window.removeEventListener(aEvent.type, _onEvent);
|
|
||||||
runTest();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function runTest()
|
function onScriptShown(aEvent)
|
||||||
{
|
{
|
||||||
if (scriptShown && framesAdded) {
|
scriptShown = aEvent.detail.url.indexOf("-02.js") != -1;
|
||||||
Services.tm.currentThread.dispatch({ run: onScriptShown }, 0);
|
executeSoon(startTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
|
||||||
|
function startTest()
|
||||||
|
{
|
||||||
|
if (scriptShown && framesAdded && resumed && !testStarted) {
|
||||||
|
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
testStarted = true;
|
||||||
|
Services.tm.currentThread.dispatch({ run: performTest }, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onScriptShown()
|
function performTest()
|
||||||
{
|
{
|
||||||
gScripts = gDebugger.DebuggerView.Scripts;
|
gScripts = gDebugger.DebuggerView.Scripts;
|
||||||
|
|
||||||
|
@ -21,37 +21,43 @@ function test()
|
|||||||
let contextMenu = null;
|
let contextMenu = null;
|
||||||
let scriptShown = false;
|
let scriptShown = false;
|
||||||
let framesAdded = false;
|
let framesAdded = false;
|
||||||
|
let resumed = false;
|
||||||
|
let testStarted = false;
|
||||||
|
|
||||||
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
||||||
gTab = aTab;
|
gTab = aTab;
|
||||||
gDebuggee = aDebuggee;
|
gDebuggee = aDebuggee;
|
||||||
gPane = aPane;
|
gPane = aPane;
|
||||||
gDebugger = gPane.debuggerWindow;
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
resumed = true;
|
||||||
|
|
||||||
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
framesAdded = true;
|
framesAdded = true;
|
||||||
runTest();
|
executeSoon(startTest);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
gDebuggee.firstCall();
|
gDebuggee.firstCall();
|
||||||
});
|
});
|
||||||
|
|
||||||
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
|
||||||
let url = aEvent.detail.url;
|
|
||||||
if (url.indexOf("-02.js") != -1) {
|
|
||||||
scriptShown = true;
|
|
||||||
window.removeEventListener(aEvent.type, _onEvent);
|
|
||||||
runTest();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function runTest()
|
function onScriptShown(aEvent) {
|
||||||
|
scriptShown = aEvent.detail.url.indexOf("-02.js") != -1;
|
||||||
|
executeSoon(startTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
|
||||||
|
function startTest()
|
||||||
{
|
{
|
||||||
if (scriptShown && framesAdded) {
|
if (scriptShown && framesAdded && resumed && !testStarted) {
|
||||||
Services.tm.currentThread.dispatch({ run: onScriptShown }, 0);
|
testStarted = true;
|
||||||
|
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
Services.tm.currentThread.dispatch({ run: performTest }, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onScriptShown()
|
function performTest()
|
||||||
{
|
{
|
||||||
let scripts = gDebugger.DebuggerView.Scripts._scripts;
|
let scripts = gDebugger.DebuggerView.Scripts._scripts;
|
||||||
|
|
||||||
|
86
browser/devtools/debugger/test/browser_dbg_createRemote.js
Normal file
86
browser/devtools/debugger/test/browser_dbg_createRemote.js
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||||
|
/*
|
||||||
|
* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
*/
|
||||||
|
var gProcess = null;
|
||||||
|
var gTab = null;
|
||||||
|
var gDebuggee = null;
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
remote_debug_tab_pane(STACK_URL, aOnClosing, function(aTab, aDebuggee, aProcess) {
|
||||||
|
gTab = aTab;
|
||||||
|
gDebuggee = aDebuggee;
|
||||||
|
gProcess = aProcess;
|
||||||
|
|
||||||
|
testSimpleCall();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testSimpleCall() {
|
||||||
|
Services.tm.currentThread.dispatch({ run: function() {
|
||||||
|
|
||||||
|
ok(gProcess._dbgProcess,
|
||||||
|
"The remote debugger process wasn't created properly!");
|
||||||
|
ok(gProcess._dbgProcess.isRunning,
|
||||||
|
"The remote debugger process isn't running!");
|
||||||
|
is(typeof gProcess._dbgProcess.pid, "number",
|
||||||
|
"The remote debugger process doesn't have a pid (?!)");
|
||||||
|
|
||||||
|
info("process location: " + gProcess._dbgProcess.location);
|
||||||
|
info("process pid: " + gProcess._dbgProcess.pid);
|
||||||
|
info("process name: " + gProcess._dbgProcess.processName);
|
||||||
|
info("process sig: " + gProcess._dbgProcess.processSignature);
|
||||||
|
|
||||||
|
ok(gProcess._dbgProfile,
|
||||||
|
"The remote debugger profile wasn't created properly!");
|
||||||
|
ok(gProcess._dbgProfile.localDir,
|
||||||
|
"The remote debugger profile doesn't have a localDir...");
|
||||||
|
ok(gProcess._dbgProfile.rootDir,
|
||||||
|
"The remote debugger profile doesn't have a rootDir...");
|
||||||
|
ok(gProcess._dbgProfile.name,
|
||||||
|
"The remote debugger profile doesn't have a name...");
|
||||||
|
|
||||||
|
info("profile localDir: " + gProcess._dbgProfile.localDir);
|
||||||
|
info("profile rootDir: " + gProcess._dbgProfile.rootDir);
|
||||||
|
info("profile name: " + gProcess._dbgProfile.name);
|
||||||
|
|
||||||
|
let profileService = Cc["@mozilla.org/toolkit/profile-service;1"]
|
||||||
|
.createInstance(Ci.nsIToolkitProfileService);
|
||||||
|
|
||||||
|
let profile = profileService.getProfileByName(gProcess._dbgProfile.name);
|
||||||
|
|
||||||
|
ok(profile,
|
||||||
|
"The remote debugger profile wasn't *actually* created properly!");
|
||||||
|
is(profile.localDir.path, gProcess._dbgProfile.localDir.path,
|
||||||
|
"The remote debugger profile doesn't have the correct localDir!");
|
||||||
|
is(profile.rootDir.path, gProcess._dbgProfile.rootDir.path,
|
||||||
|
"The remote debugger profile doesn't have the correct rootDir!");
|
||||||
|
|
||||||
|
DebuggerUI.toggleRemoteDebugger();
|
||||||
|
}}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function aOnClosing() {
|
||||||
|
ok(!gProcess._dbgProcess.isRunning,
|
||||||
|
"The remote debugger process isn't closed as it should be!");
|
||||||
|
is(gProcess._dbgProcess.exitValue, (Services.appinfo.OS == "WINNT" ? 0 : 256),
|
||||||
|
"The remote debugger process didn't die cleanly.");
|
||||||
|
|
||||||
|
info("process exit value: " + gProcess._dbgProcess.exitValue);
|
||||||
|
|
||||||
|
info("profile localDir: " + gProcess._dbgProfile.localDir.path);
|
||||||
|
info("profile rootDir: " + gProcess._dbgProfile.rootDir.path);
|
||||||
|
info("profile name: " + gProcess._dbgProfile.name);
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCleanupFunction(function() {
|
||||||
|
removeTab(gTab);
|
||||||
|
gProcess = null;
|
||||||
|
gTab = null;
|
||||||
|
gDebuggee = null;
|
||||||
|
});
|
@ -85,7 +85,8 @@ function resumeAndFinish() {
|
|||||||
gDebugger.DebuggerController.activeThread.resume(function() {
|
gDebugger.DebuggerController.activeThread.resume(function() {
|
||||||
let vs = gDebugger.DebuggerView.Scripts;
|
let vs = gDebugger.DebuggerView.Scripts;
|
||||||
let ss = gDebugger.DebuggerController.SourceScripts;
|
let ss = gDebugger.DebuggerController.SourceScripts;
|
||||||
ss._onScriptsCleared();
|
vs.empty();
|
||||||
|
vs._scripts.removeEventListener("select", vs._onScriptsChange, false);
|
||||||
|
|
||||||
is(ss._trimUrlQuery("a/b/c.d?test=1&random=4"), "a/b/c.d",
|
is(ss._trimUrlQuery("a/b/c.d?test=1&random=4"), "a/b/c.d",
|
||||||
"Trimming the url query isn't done properly.");
|
"Trimming the url query isn't done properly.");
|
||||||
@ -101,12 +102,11 @@ function resumeAndFinish() {
|
|||||||
{ href: "si://interesting.address.moc/random/x/y/", leaf: "script.js?a=1&b=2&c=3" }
|
{ href: "si://interesting.address.moc/random/x/y/", leaf: "script.js?a=1&b=2&c=3" }
|
||||||
];
|
];
|
||||||
|
|
||||||
vs._scripts.removeEventListener("select", vs._onScriptsChange, false);
|
|
||||||
|
|
||||||
urls.forEach(function(url) {
|
urls.forEach(function(url) {
|
||||||
executeSoon(function() {
|
executeSoon(function() {
|
||||||
let loc = url.href + url.leaf;
|
let loc = url.href + url.leaf;
|
||||||
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
|
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
|
||||||
|
vs.commitScripts();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -27,10 +27,10 @@ function testFrameParameters()
|
|||||||
{
|
{
|
||||||
dump("Started testFrameParameters!\n");
|
dump("Started testFrameParameters!\n");
|
||||||
|
|
||||||
gDebugger.addEventListener("Debugger:FetchedParameters", function test() {
|
gDebugger.addEventListener("Debugger:FetchedVariables", function test() {
|
||||||
dump("Entered Debugger:FetchedParameters!\n");
|
dump("Entered Debugger:FetchedVariables!\n");
|
||||||
|
|
||||||
gDebugger.removeEventListener("Debugger:FetchedParameters", test, false);
|
gDebugger.removeEventListener("Debugger:FetchedVariables", test, false);
|
||||||
Services.tm.currentThread.dispatch({ run: function() {
|
Services.tm.currentThread.dispatch({ run: function() {
|
||||||
|
|
||||||
dump("After currentThread.dispatch!\n");
|
dump("After currentThread.dispatch!\n");
|
||||||
@ -52,33 +52,42 @@ function testFrameParameters()
|
|||||||
is(frames.querySelectorAll(".dbg-stackframe").length, 3,
|
is(frames.querySelectorAll(".dbg-stackframe").length, 3,
|
||||||
"Should have three frames.");
|
"Should have three frames.");
|
||||||
|
|
||||||
is(localNodes.length, 8,
|
is(localNodes.length, 11,
|
||||||
"The localScope should contain all the created variable elements.");
|
"The localScope should contain all the created variable elements.");
|
||||||
|
|
||||||
is(localNodes[0].querySelector(".info").textContent, "[object Proxy]",
|
is(localNodes[0].querySelector(".info").textContent, "[object Proxy]",
|
||||||
"Should have the right property value for 'this'.");
|
"Should have the right property value for 'this'.");
|
||||||
|
|
||||||
is(localNodes[1].querySelector(".info").textContent, "[object Arguments]",
|
is(localNodes[1].querySelector(".info").textContent, "[object Object]",
|
||||||
"Should have the right property value for 'arguments'.");
|
|
||||||
|
|
||||||
is(localNodes[2].querySelector(".info").textContent, "[object Object]",
|
|
||||||
"Should have the right property value for 'aArg'.");
|
"Should have the right property value for 'aArg'.");
|
||||||
|
|
||||||
is(localNodes[3].querySelector(".info").textContent, '"beta"',
|
is(localNodes[2].querySelector(".info").textContent, '"beta"',
|
||||||
"Should have the right property value for 'bArg'.");
|
"Should have the right property value for 'bArg'.");
|
||||||
|
|
||||||
is(localNodes[4].querySelector(".info").textContent, "3",
|
is(localNodes[3].querySelector(".info").textContent, "3",
|
||||||
"Should have the right property value for 'cArg'.");
|
"Should have the right property value for 'cArg'.");
|
||||||
|
|
||||||
is(localNodes[5].querySelector(".info").textContent, "false",
|
is(localNodes[4].querySelector(".info").textContent, "false",
|
||||||
"Should have the right property value for 'dArg'.");
|
"Should have the right property value for 'dArg'.");
|
||||||
|
|
||||||
is(localNodes[6].querySelector(".info").textContent, "null",
|
is(localNodes[5].querySelector(".info").textContent, "null",
|
||||||
"Should have the right property value for 'eArg'.");
|
"Should have the right property value for 'eArg'.");
|
||||||
|
|
||||||
is(localNodes[7].querySelector(".info").textContent, "undefined",
|
is(localNodes[6].querySelector(".info").textContent, "undefined",
|
||||||
"Should have the right property value for 'fArg'.");
|
"Should have the right property value for 'fArg'.");
|
||||||
|
|
||||||
|
is(localNodes[7].querySelector(".info").textContent, "1",
|
||||||
|
"Should have the right property value for 'a'.");
|
||||||
|
|
||||||
|
is(localNodes[8].querySelector(".info").textContent, "[object Object]",
|
||||||
|
"Should have the right property value for 'b'.");
|
||||||
|
|
||||||
|
is(localNodes[9].querySelector(".info").textContent, "[object Object]",
|
||||||
|
"Should have the right property value for 'c'.");
|
||||||
|
|
||||||
|
is(localNodes[10].querySelector(".info").textContent, "[object Arguments]",
|
||||||
|
"Should have the right property value for 'arguments'.");
|
||||||
|
|
||||||
resumeAndFinish();
|
resumeAndFinish();
|
||||||
}}, 0);
|
}}, 0);
|
||||||
}, false);
|
}, false);
|
||||||
|
@ -27,10 +27,10 @@ function testFrameParameters()
|
|||||||
{
|
{
|
||||||
dump("Started testFrameParameters!\n");
|
dump("Started testFrameParameters!\n");
|
||||||
|
|
||||||
gDebugger.addEventListener("Debugger:FetchedParameters", function test() {
|
gDebugger.addEventListener("Debugger:FetchedVariables", function test() {
|
||||||
dump("Entered Debugger:FetchedParameters!\n");
|
dump("Entered Debugger:FetchedVariables!\n");
|
||||||
|
|
||||||
gDebugger.removeEventListener("Debugger:FetchedParameters", test, false);
|
gDebugger.removeEventListener("Debugger:FetchedVariables", test, false);
|
||||||
Services.tm.currentThread.dispatch({ run: function() {
|
Services.tm.currentThread.dispatch({ run: function() {
|
||||||
|
|
||||||
dump("After currentThread.dispatch!\n");
|
dump("After currentThread.dispatch!\n");
|
||||||
@ -50,16 +50,17 @@ function testFrameParameters()
|
|||||||
is(frames.querySelectorAll(".dbg-stackframe").length, 3,
|
is(frames.querySelectorAll(".dbg-stackframe").length, 3,
|
||||||
"Should have three frames.");
|
"Should have three frames.");
|
||||||
|
|
||||||
is(localNodes.length, 8,
|
is(localNodes.length, 11,
|
||||||
"The localScope should contain all the created variable elements.");
|
"The localScope should contain all the created variable elements.");
|
||||||
|
|
||||||
is(localNodes[0].querySelector(".info").textContent, "[object Proxy]",
|
is(localNodes[0].querySelector(".info").textContent, "[object Proxy]",
|
||||||
"Should have the right property value for 'this'.");
|
"Should have the right property value for 'this'.");
|
||||||
|
|
||||||
// Expand the __proto__ and arguments tree nodes. This causes their
|
// Expand the '__proto__', 'arguments' and 'a' tree nodes. This causes
|
||||||
// properties to be retrieved and displayed.
|
// their properties to be retrieved and displayed.
|
||||||
localNodes[0].expand();
|
localNodes[0].expand();
|
||||||
localNodes[1].expand();
|
localNodes[9].expand();
|
||||||
|
localNodes[10].expand();
|
||||||
|
|
||||||
// Poll every few milliseconds until the properties are retrieved.
|
// Poll every few milliseconds until the properties are retrieved.
|
||||||
// It's important to set the timer in the chrome window, because the
|
// It's important to set the timer in the chrome window, because the
|
||||||
@ -70,7 +71,9 @@ function testFrameParameters()
|
|||||||
ok(false, "Timed out while polling for the properties.");
|
ok(false, "Timed out while polling for the properties.");
|
||||||
resumeAndFinish();
|
resumeAndFinish();
|
||||||
}
|
}
|
||||||
if (!localNodes[0].fetched || !localNodes[1].fetched) {
|
if (!localNodes[0].fetched ||
|
||||||
|
!localNodes[9].fetched ||
|
||||||
|
!localNodes[10].fetched) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
window.clearInterval(intervalID);
|
window.clearInterval(intervalID);
|
||||||
@ -82,14 +85,26 @@ function testFrameParameters()
|
|||||||
.textContent.search(/object/) != -1,
|
.textContent.search(/object/) != -1,
|
||||||
"__proto__ should be an object.");
|
"__proto__ should be an object.");
|
||||||
|
|
||||||
is(localNodes[1].querySelector(".info").textContent, "[object Arguments]",
|
is(localNodes[9].querySelector(".info").textContent, "[object Object]",
|
||||||
|
"Should have the right property value for 'c'.");
|
||||||
|
|
||||||
|
is(localNodes[9].querySelectorAll(".property > .title > .key")[1]
|
||||||
|
.textContent, "a",
|
||||||
|
"Should have the right property name for 'a'.");
|
||||||
|
|
||||||
|
is(localNodes[9].querySelectorAll(".property > .title > .value")[1]
|
||||||
|
.textContent, 1,
|
||||||
|
"Should have the right value for 'c.a'.");
|
||||||
|
|
||||||
|
is(localNodes[10].querySelector(".info").textContent,
|
||||||
|
"[object Arguments]",
|
||||||
"Should have the right property value for 'arguments'.");
|
"Should have the right property value for 'arguments'.");
|
||||||
|
|
||||||
is(localNodes[1].querySelector(".property > .title > .key")
|
is(localNodes[10].querySelector(".property > .title > .key")
|
||||||
.textContent, "length",
|
.textContent, "length",
|
||||||
"Should have the right property name for length.");
|
"Should have the right property name for 'length'.");
|
||||||
|
|
||||||
is(localNodes[1].querySelector(".property > .title > .value")
|
is(localNodes[10].querySelector(".property > .title > .value")
|
||||||
.textContent, 5,
|
.textContent, 5,
|
||||||
"Should have the right argument length.");
|
"Should have the right argument length.");
|
||||||
|
|
||||||
@ -104,7 +119,8 @@ function testFrameParameters()
|
|||||||
}
|
}
|
||||||
|
|
||||||
function resumeAndFinish() {
|
function resumeAndFinish() {
|
||||||
gDebugger.DebuggerController.activeThread.addOneTimeListener("framescleared", function() {
|
let thread = gDebugger.DebuggerController.activeThread;
|
||||||
|
thread.addOneTimeListener("framescleared", function() {
|
||||||
Services.tm.currentThread.dispatch({ run: function() {
|
Services.tm.currentThread.dispatch({ run: function() {
|
||||||
var frames = gDebugger.DebuggerView.StackFrames._frames;
|
var frames = gDebugger.DebuggerView.StackFrames._frames;
|
||||||
|
|
||||||
@ -115,7 +131,7 @@ function resumeAndFinish() {
|
|||||||
}}, 0);
|
}}, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
gDebugger.DebuggerController.activeThread.resume();
|
thread.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
registerCleanupFunction(function() {
|
registerCleanupFunction(function() {
|
||||||
|
@ -8,10 +8,6 @@
|
|||||||
|
|
||||||
const TAB_URL = EXAMPLE_URL + "browser_dbg_script-switching.html";
|
const TAB_URL = EXAMPLE_URL + "browser_dbg_script-switching.html";
|
||||||
|
|
||||||
let tempScope = {};
|
|
||||||
Cu.import("resource:///modules/source-editor.jsm", tempScope);
|
|
||||||
let SourceEditor = tempScope.SourceEditor;
|
|
||||||
|
|
||||||
var gPane = null;
|
var gPane = null;
|
||||||
var gTab = null;
|
var gTab = null;
|
||||||
var gDebuggee = null;
|
var gDebuggee = null;
|
||||||
@ -22,33 +18,39 @@ function test()
|
|||||||
{
|
{
|
||||||
let scriptShown = false;
|
let scriptShown = false;
|
||||||
let framesAdded = false;
|
let framesAdded = false;
|
||||||
|
let resumed = false;
|
||||||
|
let testStarted = false;
|
||||||
|
|
||||||
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
||||||
gTab = aTab;
|
gTab = aTab;
|
||||||
gDebuggee = aDebuggee;
|
gDebuggee = aDebuggee;
|
||||||
gPane = aPane;
|
gPane = aPane;
|
||||||
gDebugger = gPane.debuggerWindow;
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
resumed = true;
|
||||||
|
|
||||||
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
framesAdded = true;
|
framesAdded = true;
|
||||||
runTest();
|
executeSoon(startTest);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
gDebuggee.firstCall();
|
gDebuggee.firstCall();
|
||||||
});
|
});
|
||||||
|
|
||||||
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
|
||||||
let url = aEvent.detail.url;
|
|
||||||
if (url.indexOf("-02.js") != -1) {
|
|
||||||
scriptShown = true;
|
|
||||||
window.removeEventListener(aEvent.type, _onEvent);
|
|
||||||
runTest();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function runTest()
|
function onScriptShown(aEvent)
|
||||||
{
|
{
|
||||||
if (scriptShown && framesAdded) {
|
scriptShown = aEvent.detail.url.indexOf("-02.js") != -1;
|
||||||
|
executeSoon(startTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
|
||||||
|
function startTest()
|
||||||
|
{
|
||||||
|
if (scriptShown && framesAdded && resumed && !testStarted) {
|
||||||
|
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
testStarted = true;
|
||||||
Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0);
|
Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,8 +81,6 @@ function testScriptsDisplay() {
|
|||||||
ok(gDebugger.DebuggerView.Scripts.containsLabel(
|
ok(gDebugger.DebuggerView.Scripts.containsLabel(
|
||||||
label2), "Second script label is incorrect.");
|
label2), "Second script label is incorrect.");
|
||||||
|
|
||||||
dump("Debugger editor text:\n" + gDebugger.editor.getText() + "\n");
|
|
||||||
|
|
||||||
ok(gDebugger.editor.getText().search(/debugger/) != -1,
|
ok(gDebugger.editor.getText().search(/debugger/) != -1,
|
||||||
"The correct script was loaded initially.");
|
"The correct script was loaded initially.");
|
||||||
|
|
||||||
@ -100,8 +100,6 @@ function testScriptsDisplay() {
|
|||||||
|
|
||||||
function testSwitchPaused()
|
function testSwitchPaused()
|
||||||
{
|
{
|
||||||
dump("Debugger editor text:\n" + gDebugger.editor.getText() + "\n");
|
|
||||||
|
|
||||||
ok(gDebugger.editor.getText().search(/debugger/) == -1,
|
ok(gDebugger.editor.getText().search(/debugger/) == -1,
|
||||||
"The second script is no longer displayed.");
|
"The second script is no longer displayed.");
|
||||||
|
|
||||||
@ -127,6 +125,8 @@ function testSwitchPaused()
|
|||||||
|
|
||||||
function testSwitchRunning()
|
function testSwitchRunning()
|
||||||
{
|
{
|
||||||
|
dump("Debugger editor text:\n" + gDebugger.editor.getText() + "\n");
|
||||||
|
|
||||||
ok(gDebugger.editor.getText().search(/debugger/) != -1,
|
ok(gDebugger.editor.getText().search(/debugger/) != -1,
|
||||||
"The second script is displayed again.");
|
"The second script is displayed again.");
|
||||||
|
|
||||||
|
@ -0,0 +1,188 @@
|
|||||||
|
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
var gPane = null;
|
||||||
|
var gTab = null;
|
||||||
|
var gDebuggee = null;
|
||||||
|
var gDebugger = null;
|
||||||
|
var gEditor = null;
|
||||||
|
var gScripts = null;
|
||||||
|
var gSearchBox = null;
|
||||||
|
var gMenulist = null;
|
||||||
|
|
||||||
|
function test()
|
||||||
|
{
|
||||||
|
let scriptShown = false;
|
||||||
|
let framesAdded = false;
|
||||||
|
|
||||||
|
debug_tab_pane(STACK_URL, function(aTab, aDebuggee, aPane) {
|
||||||
|
gTab = aTab;
|
||||||
|
gDebuggee = aDebuggee;
|
||||||
|
gPane = aPane;
|
||||||
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
|
||||||
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
|
framesAdded = true;
|
||||||
|
runTest();
|
||||||
|
});
|
||||||
|
|
||||||
|
gDebuggee.simpleCall();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
||||||
|
window.removeEventListener(aEvent.type, _onEvent);
|
||||||
|
scriptShown = true;
|
||||||
|
runTest();
|
||||||
|
});
|
||||||
|
|
||||||
|
function runTest()
|
||||||
|
{
|
||||||
|
if (scriptShown && framesAdded) {
|
||||||
|
Services.tm.currentThread.dispatch({ run: testScriptSearching }, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function testScriptSearching() {
|
||||||
|
gDebugger.DebuggerController.activeThread.resume(function() {
|
||||||
|
gEditor = gDebugger.DebuggerView.editor;
|
||||||
|
gScripts = gDebugger.DebuggerView.Scripts;
|
||||||
|
gSearchBox = gScripts._searchbox;
|
||||||
|
gMenulist = gScripts._scripts;
|
||||||
|
|
||||||
|
write(":12");
|
||||||
|
ok(gEditor.getCaretPosition().line == 11 &&
|
||||||
|
gEditor.getCaretPosition().col == 0,
|
||||||
|
"The editor didn't jump to the correct line.");
|
||||||
|
|
||||||
|
write("@debugger");
|
||||||
|
ok(gEditor.getCaretPosition().line == 2 &&
|
||||||
|
gEditor.getCaretPosition().col == 44,
|
||||||
|
"The editor didn't jump to the correct token. (1)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("RETURN");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (2)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("ENTER");
|
||||||
|
ok(gEditor.getCaretPosition().line == 12 &&
|
||||||
|
gEditor.getCaretPosition().col == 8,
|
||||||
|
"The editor didn't jump to the correct token. (3)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("ENTER");
|
||||||
|
ok(gEditor.getCaretPosition().line == 19 &&
|
||||||
|
gEditor.getCaretPosition().col == 4,
|
||||||
|
"The editor didn't jump to the correct token. (4)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("RETURN");
|
||||||
|
ok(gEditor.getCaretPosition().line == 2 &&
|
||||||
|
gEditor.getCaretPosition().col == 44,
|
||||||
|
"The editor didn't jump to the correct token. (5)");
|
||||||
|
|
||||||
|
|
||||||
|
write(":bogus@debugger;");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (7)");
|
||||||
|
|
||||||
|
write(":13@debugger;");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (7)");
|
||||||
|
|
||||||
|
write(":@debugger;");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (8)");
|
||||||
|
|
||||||
|
write("::@debugger;");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (9)");
|
||||||
|
|
||||||
|
write(":::@debugger;");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (10)");
|
||||||
|
|
||||||
|
|
||||||
|
write(":i am not a number");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't remain at the correct token. (11)");
|
||||||
|
|
||||||
|
write("@__i do not exist__");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't remain at the correct token. (12)");
|
||||||
|
|
||||||
|
|
||||||
|
write(":1:2:3:a:b:c:::12");
|
||||||
|
ok(gEditor.getCaretPosition().line == 11 &&
|
||||||
|
gEditor.getCaretPosition().col == 0,
|
||||||
|
"The editor didn't jump to the correct line. (13)");
|
||||||
|
|
||||||
|
write("@don't@find@me@instead@find@debugger");
|
||||||
|
ok(gEditor.getCaretPosition().line == 2 &&
|
||||||
|
gEditor.getCaretPosition().col == 44,
|
||||||
|
"The editor didn't jump to the correct token. (14)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("RETURN");
|
||||||
|
ok(gEditor.getCaretPosition().line == 8 &&
|
||||||
|
gEditor.getCaretPosition().col == 2,
|
||||||
|
"The editor didn't jump to the correct token. (15)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("ENTER");
|
||||||
|
ok(gEditor.getCaretPosition().line == 12 &&
|
||||||
|
gEditor.getCaretPosition().col == 8,
|
||||||
|
"The editor didn't jump to the correct token. (16)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("RETURN");
|
||||||
|
ok(gEditor.getCaretPosition().line == 19 &&
|
||||||
|
gEditor.getCaretPosition().col == 4,
|
||||||
|
"The editor didn't jump to the correct token. (17)");
|
||||||
|
|
||||||
|
EventUtils.sendKey("ENTER");
|
||||||
|
ok(gEditor.getCaretPosition().line == 2 &&
|
||||||
|
gEditor.getCaretPosition().col == 44,
|
||||||
|
"The editor didn't jump to the correct token. (18)");
|
||||||
|
|
||||||
|
|
||||||
|
clear();
|
||||||
|
ok(gEditor.getCaretPosition().line == 2 &&
|
||||||
|
gEditor.getCaretPosition().col == 44,
|
||||||
|
"The editor didn't remain at the correct token. (19)");
|
||||||
|
is(gScripts.visibleItemsCount, 1,
|
||||||
|
"Not all the scripts are shown after the search. (20)");
|
||||||
|
|
||||||
|
closeDebuggerAndFinish(gTab);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear() {
|
||||||
|
gSearchBox.focus();
|
||||||
|
gSearchBox.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function write(text) {
|
||||||
|
clear();
|
||||||
|
|
||||||
|
for (let i = 0; i < text.length; i++) {
|
||||||
|
EventUtils.sendChar(text[i]);
|
||||||
|
}
|
||||||
|
dump("editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCleanupFunction(function() {
|
||||||
|
removeTab(gTab);
|
||||||
|
gPane = null;
|
||||||
|
gTab = null;
|
||||||
|
gDebuggee = null;
|
||||||
|
gDebugger = null;
|
||||||
|
gEditor = null;
|
||||||
|
gScripts = null;
|
||||||
|
gSearchBox = null;
|
||||||
|
gMenulist = null;
|
||||||
|
});
|
@ -0,0 +1,146 @@
|
|||||||
|
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
const TAB_URL = EXAMPLE_URL + "browser_dbg_script-switching.html";
|
||||||
|
|
||||||
|
var gPane = null;
|
||||||
|
var gTab = null;
|
||||||
|
var gDebuggee = null;
|
||||||
|
var gDebugger = null;
|
||||||
|
var gEditor = null;
|
||||||
|
var gScripts = null;
|
||||||
|
var gSearchBox = null;
|
||||||
|
var gMenulist = null;
|
||||||
|
|
||||||
|
function test()
|
||||||
|
{
|
||||||
|
let scriptShown = false;
|
||||||
|
let framesAdded = false;
|
||||||
|
|
||||||
|
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
||||||
|
gTab = aTab;
|
||||||
|
gDebuggee = aDebuggee;
|
||||||
|
gPane = aPane;
|
||||||
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
|
||||||
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
|
framesAdded = true;
|
||||||
|
runTest();
|
||||||
|
});
|
||||||
|
|
||||||
|
gDebuggee.firstCall();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
||||||
|
let url = aEvent.detail.url;
|
||||||
|
if (url.indexOf("-02.js") != -1) {
|
||||||
|
scriptShown = true;
|
||||||
|
window.removeEventListener(aEvent.type, _onEvent);
|
||||||
|
runTest();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function runTest()
|
||||||
|
{
|
||||||
|
if (scriptShown && framesAdded) {
|
||||||
|
Services.tm.currentThread.dispatch({ run: testScriptSearching }, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function testScriptSearching() {
|
||||||
|
gDebugger.DebuggerController.activeThread.resume(function() {
|
||||||
|
gEditor = gDebugger.DebuggerView.editor;
|
||||||
|
gScripts = gDebugger.DebuggerView.Scripts;
|
||||||
|
gSearchBox = gScripts._searchbox;
|
||||||
|
gMenulist = gScripts._scripts;
|
||||||
|
|
||||||
|
firstSearch();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function firstSearch() {
|
||||||
|
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
||||||
|
dump("Current script url:\n" + aEvent.detail.url + "\n");
|
||||||
|
dump("Debugger editor text:\n" + gEditor.getText() + "\n");
|
||||||
|
|
||||||
|
let url = aEvent.detail.url;
|
||||||
|
if (url.indexOf("-01.js") != -1) {
|
||||||
|
window.removeEventListener(aEvent.type, _onEvent);
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
|
dump("Editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
|
||||||
|
ok(gEditor.getCaretPosition().line == 4 &&
|
||||||
|
gEditor.getCaretPosition().col == 0,
|
||||||
|
"The editor didn't jump to the correct line. (1)");
|
||||||
|
is(gScripts.visibleItemsCount, 1,
|
||||||
|
"Not all the correct scripts are shown after the search. (1)");
|
||||||
|
|
||||||
|
secondSearch();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
write(".*-01\.js:5");
|
||||||
|
}
|
||||||
|
|
||||||
|
function secondSearch() {
|
||||||
|
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
||||||
|
dump("Current script url:\n" + aEvent.detail.url + "\n");
|
||||||
|
dump("Debugger editor text:\n" + gEditor.getText() + "\n");
|
||||||
|
|
||||||
|
let url = aEvent.detail.url;
|
||||||
|
if (url.indexOf("-02.js") != -1) {
|
||||||
|
window.removeEventListener(aEvent.type, _onEvent);
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
|
dump("Editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
|
||||||
|
ok(gEditor.getCaretPosition().line == 5 &&
|
||||||
|
gEditor.getCaretPosition().col == 8,
|
||||||
|
"The editor didn't jump to the correct line. (2)");
|
||||||
|
is(gScripts.visibleItemsCount, 1,
|
||||||
|
"Not all the correct scripts are shown after the search. (2)");
|
||||||
|
|
||||||
|
finalCheck();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
write(".*-02\.js@debugger;");
|
||||||
|
}
|
||||||
|
|
||||||
|
function finalCheck() {
|
||||||
|
clear();
|
||||||
|
ok(gEditor.getCaretPosition().line == 5 &&
|
||||||
|
gEditor.getCaretPosition().col == 8,
|
||||||
|
"The editor didn't remain at the correct token. (3)");
|
||||||
|
is(gScripts.visibleItemsCount, 2,
|
||||||
|
"Not all the scripts are shown after the search. (3)");
|
||||||
|
|
||||||
|
closeDebuggerAndFinish(gTab);
|
||||||
|
}
|
||||||
|
|
||||||
|
function clear() {
|
||||||
|
gSearchBox.focus();
|
||||||
|
gSearchBox.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function write(text) {
|
||||||
|
clear();
|
||||||
|
|
||||||
|
for (let i = 0; i < text.length; i++) {
|
||||||
|
EventUtils.sendChar(text[i]);
|
||||||
|
}
|
||||||
|
dump("editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCleanupFunction(function() {
|
||||||
|
removeTab(gTab);
|
||||||
|
gPane = null;
|
||||||
|
gTab = null;
|
||||||
|
gDebuggee = null;
|
||||||
|
gDebugger = null;
|
||||||
|
gEditor = null;
|
||||||
|
gScripts = null;
|
||||||
|
gSearchBox = null;
|
||||||
|
gMenulist = null;
|
||||||
|
});
|
124
browser/devtools/debugger/test/browser_dbg_scripts-sorting.js
Normal file
124
browser/devtools/debugger/test/browser_dbg_scripts-sorting.js
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||||
|
/*
|
||||||
|
* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
*/
|
||||||
|
var gPane = null;
|
||||||
|
var gTab = null;
|
||||||
|
var gDebuggee = null;
|
||||||
|
var gDebugger = null;
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
debug_tab_pane(STACK_URL, function(aTab, aDebuggee, aPane) {
|
||||||
|
gTab = aTab;
|
||||||
|
gDebuggee = aDebuggee;
|
||||||
|
gPane = aPane;
|
||||||
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
|
||||||
|
testSimpleCall();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testSimpleCall() {
|
||||||
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
|
Services.tm.currentThread.dispatch({ run: function() {
|
||||||
|
resumeAndFinish();
|
||||||
|
}}, 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
gDebuggee.simpleCall();
|
||||||
|
}
|
||||||
|
|
||||||
|
function resumeAndFinish() {
|
||||||
|
gDebugger.DebuggerController.activeThread.resume(function() {
|
||||||
|
checkScriptsOrder();
|
||||||
|
addScriptsAndCheckOrder(1, function() {
|
||||||
|
addScriptsAndCheckOrder(2, function() {
|
||||||
|
addScriptsAndCheckOrder(3, function() {
|
||||||
|
closeDebuggerAndFinish(gTab);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function addScriptsAndCheckOrder(method, callback) {
|
||||||
|
let vs = gDebugger.DebuggerView.Scripts;
|
||||||
|
let ss = gDebugger.DebuggerController.SourceScripts;
|
||||||
|
vs.empty();
|
||||||
|
vs._scripts.removeEventListener("select", vs._onScriptsChange, false);
|
||||||
|
|
||||||
|
let urls = [
|
||||||
|
{ href: "ici://some.address.com/random/", leaf: "subrandom/" },
|
||||||
|
{ href: "ni://another.address.org/random/subrandom/", leaf: "page.html" },
|
||||||
|
{ href: "san://interesting.address.gro/random/", leaf: "script.js" },
|
||||||
|
{ href: "si://interesting.address.moc/random/", leaf: "script.js" },
|
||||||
|
{ href: "si://interesting.address.moc/random/", leaf: "x/script.js" },
|
||||||
|
{ href: "si://interesting.address.moc/random/", leaf: "x/y/script.js?a=1" },
|
||||||
|
{ href: "si://interesting.address.moc/random/x/", leaf: "y/script.js?a=1&b=2" },
|
||||||
|
{ href: "si://interesting.address.moc/random/x/y/", leaf: "script.js?a=1&b=2&c=3" }
|
||||||
|
];
|
||||||
|
|
||||||
|
urls.sort(function(a, b) {
|
||||||
|
return Math.random() - 0.5;
|
||||||
|
});
|
||||||
|
|
||||||
|
switch (method) {
|
||||||
|
case 1:
|
||||||
|
urls.forEach(function(url) {
|
||||||
|
let loc = url.href + url.leaf;
|
||||||
|
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
|
||||||
|
});
|
||||||
|
vs.commitScripts();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
urls.forEach(function(url) {
|
||||||
|
let loc = url.href + url.leaf;
|
||||||
|
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc }, true);
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
let i = 0
|
||||||
|
for (; i < urls.length / 2; i++) {
|
||||||
|
let url = urls[i];
|
||||||
|
let loc = url.href + url.leaf;
|
||||||
|
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
|
||||||
|
}
|
||||||
|
vs.commitScripts();
|
||||||
|
|
||||||
|
for (; i < urls.length; i++) {
|
||||||
|
let url = urls[i];
|
||||||
|
let loc = url.href + url.leaf;
|
||||||
|
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc }, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
|
checkScriptsOrder(method);
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkScriptsOrder(method) {
|
||||||
|
let labels = gDebugger.DebuggerView.Scripts.scriptLabels;
|
||||||
|
let sorted = labels.reduce(function(prev, curr, index, array) {
|
||||||
|
return array[index - 1] < array[index];
|
||||||
|
});
|
||||||
|
|
||||||
|
ok(sorted,
|
||||||
|
"Using method " + method + ", " +
|
||||||
|
"the scripts weren't in the correct order: " + labels.toSource());
|
||||||
|
|
||||||
|
return sorted;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCleanupFunction(function() {
|
||||||
|
removeTab(gTab);
|
||||||
|
gPane = null;
|
||||||
|
gTab = null;
|
||||||
|
gDebuggee = null;
|
||||||
|
gDebugger = null;
|
||||||
|
});
|
@ -22,32 +22,38 @@ function test()
|
|||||||
{
|
{
|
||||||
let scriptShown = false;
|
let scriptShown = false;
|
||||||
let framesAdded = false;
|
let framesAdded = false;
|
||||||
|
let testStarted = false;
|
||||||
|
let resumed = false;
|
||||||
|
|
||||||
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
|
||||||
gTab = aTab;
|
gTab = aTab;
|
||||||
gDebuggee = aDebuggee;
|
gDebuggee = aDebuggee;
|
||||||
gPane = aPane;
|
gPane = aPane;
|
||||||
gDebugger = gPane.debuggerWindow;
|
gDebugger = gPane.debuggerWindow;
|
||||||
|
resumed = true;
|
||||||
|
|
||||||
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
|
||||||
framesAdded = true;
|
framesAdded = true;
|
||||||
runTest();
|
executeSoon(startTest);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
gDebuggee.firstCall();
|
gDebuggee.firstCall();
|
||||||
});
|
});
|
||||||
|
|
||||||
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
|
|
||||||
let url = aEvent.detail.url;
|
|
||||||
if (url.indexOf("editor-mode") != -1) {
|
|
||||||
scriptShown = true;
|
|
||||||
window.removeEventListener(aEvent.type, _onEvent);
|
|
||||||
runTest();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function runTest()
|
function onScriptShown(aEvent) {
|
||||||
|
scriptShown = aEvent.detail.url.indexOf("test-editor-mode") != -1;
|
||||||
|
executeSoon(startTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
|
||||||
|
function startTest()
|
||||||
{
|
{
|
||||||
if (scriptShown && framesAdded) {
|
if (scriptShown && framesAdded && resumed && !testStarted) {
|
||||||
|
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
|
||||||
|
testStarted = true;
|
||||||
Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0);
|
Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,6 @@ function debug_tab_pane(aURL, aOnDebugging)
|
|||||||
{
|
{
|
||||||
let tab = addTab(aURL, function() {
|
let tab = addTab(aURL, function() {
|
||||||
gBrowser.selectedTab = gTab;
|
gBrowser.selectedTab = gTab;
|
||||||
|
|
||||||
let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject;
|
let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject;
|
||||||
|
|
||||||
let pane = DebuggerUI.toggleDebugger();
|
let pane = DebuggerUI.toggleDebugger();
|
||||||
@ -106,3 +105,17 @@ function debug_tab_pane(aURL, aOnDebugging)
|
|||||||
}, true);
|
}, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function remote_debug_tab_pane(aURL, aOnClosing, aOnDebugging)
|
||||||
|
{
|
||||||
|
let tab = addTab(aURL, function() {
|
||||||
|
gBrowser.selectedTab = gTab;
|
||||||
|
let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject;
|
||||||
|
|
||||||
|
DebuggerUI.toggleRemoteDebugger(aOnClosing, function dbgRan(process) {
|
||||||
|
|
||||||
|
// Wait for the remote debugging process to start...
|
||||||
|
aOnDebugging(tab, debuggee, process);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -293,11 +293,15 @@ InspectorUI.prototype = {
|
|||||||
buildButtonsTooltip: function IUI_buildButtonsTooltip()
|
buildButtonsTooltip: function IUI_buildButtonsTooltip()
|
||||||
{
|
{
|
||||||
let keysbundle = Services.strings.createBundle("chrome://global-platform/locale/platformKeys.properties");
|
let keysbundle = Services.strings.createBundle("chrome://global-platform/locale/platformKeys.properties");
|
||||||
|
let separator = keysbundle.GetStringFromName("MODIFIER_SEPARATOR");
|
||||||
|
|
||||||
|
let button, tooltip;
|
||||||
|
|
||||||
// Inspect Button - the shortcut string is built from the <key> element
|
// Inspect Button - the shortcut string is built from the <key> element
|
||||||
|
|
||||||
let key = this.chromeDoc.getElementById("key_inspect");
|
let key = this.chromeDoc.getElementById("key_inspect");
|
||||||
|
|
||||||
|
if (key) {
|
||||||
let modifiersAttr = key.getAttribute("modifiers");
|
let modifiersAttr = key.getAttribute("modifiers");
|
||||||
|
|
||||||
let combo = [];
|
let combo = [];
|
||||||
@ -319,11 +323,13 @@ InspectorUI.prototype = {
|
|||||||
|
|
||||||
combo.push(key.getAttribute("key"));
|
combo.push(key.getAttribute("key"));
|
||||||
|
|
||||||
let separator = keysbundle.GetStringFromName("MODIFIER_SEPARATOR");
|
tooltip = this.strings.formatStringFromName("inspectButtonWithShortcutKey.tooltip",
|
||||||
|
|
||||||
let tooltip = this.strings.formatStringFromName("inspectButton.tooltiptext",
|
|
||||||
[combo.join(separator)], 1);
|
[combo.join(separator)], 1);
|
||||||
let button = this.chromeDoc.getElementById("inspector-inspect-toolbutton");
|
} else {
|
||||||
|
tooltip = this.strings.GetStringFromName("inspectButton.tooltip");
|
||||||
|
}
|
||||||
|
|
||||||
|
button = this.chromeDoc.getElementById("inspector-inspect-toolbutton");
|
||||||
button.setAttribute("tooltiptext", tooltip);
|
button.setAttribute("tooltiptext", tooltip);
|
||||||
|
|
||||||
// Markup Button - the shortcut string is built from the accesskey attribute
|
// Markup Button - the shortcut string is built from the accesskey attribute
|
||||||
@ -335,7 +341,6 @@ InspectorUI.prototype = {
|
|||||||
#else
|
#else
|
||||||
let altString = keysbundle.GetStringFromName("VK_ALT");
|
let altString = keysbundle.GetStringFromName("VK_ALT");
|
||||||
let accesskey = button.getAttribute("accesskey");
|
let accesskey = button.getAttribute("accesskey");
|
||||||
let separator = keysbundle.GetStringFromName("MODIFIER_SEPARATOR");
|
|
||||||
let shortcut = altString + separator + accesskey;
|
let shortcut = altString + separator + accesskey;
|
||||||
tooltip = this.strings.formatStringFromName("markupButton.tooltipWithAccesskey",
|
tooltip = this.strings.formatStringFromName("markupButton.tooltipWithAccesskey",
|
||||||
[shortcut], 1);
|
[shortcut], 1);
|
||||||
|
@ -42,6 +42,11 @@ var EXPORTED_SYMBOLS = [ "Templater", "template" ];
|
|||||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||||
const Node = Components.interfaces.nsIDOMNode;
|
const Node = Components.interfaces.nsIDOMNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For full documentation, see:
|
||||||
|
* https://github.com/mozilla/domtemplate/blob/master/README.md
|
||||||
|
*/
|
||||||
|
|
||||||
// WARNING: do not 'use_strict' without reading the notes in _envEval();
|
// WARNING: do not 'use_strict' without reading the notes in _envEval();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,8 +55,16 @@ const Node = Components.interfaces.nsIDOMNode;
|
|||||||
* @param data Data to use in filling out the template
|
* @param data Data to use in filling out the template
|
||||||
* @param options Options to customize the template processing. One of:
|
* @param options Options to customize the template processing. One of:
|
||||||
* - allowEval: boolean (default false) Basic template interpolations are
|
* - allowEval: boolean (default false) Basic template interpolations are
|
||||||
* either property paths (e.g. ${a.b.c.d}), however if allowEval=true then we
|
* either property paths (e.g. ${a.b.c.d}), or if allowEval=true then we
|
||||||
* allow arbitrary JavaScript
|
* allow arbitrary JavaScript
|
||||||
|
* - stack: string or array of strings (default empty array) The template
|
||||||
|
* engine maintains a stack of tasks to help debug where it is. This allows
|
||||||
|
* this stack to be prefixed with a template name
|
||||||
|
* - blankNullUndefined: By default DOMTemplate exports null and undefined
|
||||||
|
* values using the strings 'null' and 'undefined', which can be helpful for
|
||||||
|
* debugging, but can introduce unnecessary extra logic in a template to
|
||||||
|
* convert null/undefined to ''. By setting blankNullUndefined:true, this
|
||||||
|
* conversion is handled by DOMTemplate
|
||||||
*/
|
*/
|
||||||
function template(node, data, options) {
|
function template(node, data, options) {
|
||||||
var template = new Templater(options || {});
|
var template = new Templater(options || {});
|
||||||
@ -68,8 +81,16 @@ function Templater(options) {
|
|||||||
options = { allowEval: true };
|
options = { allowEval: true };
|
||||||
}
|
}
|
||||||
this.options = options;
|
this.options = options;
|
||||||
|
if (options.stack && Array.isArray(options.stack)) {
|
||||||
|
this.stack = options.stack;
|
||||||
|
}
|
||||||
|
else if (typeof options.stack === 'string') {
|
||||||
|
this.stack = [ options.stack ];
|
||||||
|
}
|
||||||
|
else {
|
||||||
this.stack = [];
|
this.stack = [];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cached regex used to find ${...} sections in some text.
|
* Cached regex used to find ${...} sections in some text.
|
||||||
@ -90,7 +111,7 @@ Templater.prototype._splitSpecial = /\uF001|\uF002/;
|
|||||||
* Cached regex used to detect if a script is capable of being interpreted
|
* Cached regex used to detect if a script is capable of being interpreted
|
||||||
* using Template._property() or if we need to use Template._envEval()
|
* using Template._property() or if we need to use Template._envEval()
|
||||||
*/
|
*/
|
||||||
Templater.prototype._isPropertyScript = /^[a-zA-Z0-9.]*$/;
|
Templater.prototype._isPropertyScript = /^[_a-zA-Z0-9.]*$/;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursive function to walk the tree processing the attributes as it goes.
|
* Recursive function to walk the tree processing the attributes as it goes.
|
||||||
@ -153,7 +174,11 @@ Templater.prototype.processNode = function(node, data) {
|
|||||||
} else {
|
} else {
|
||||||
// Replace references in all other attributes
|
// Replace references in all other attributes
|
||||||
var newValue = value.replace(this._templateRegion, function(path) {
|
var newValue = value.replace(this._templateRegion, function(path) {
|
||||||
return this._envEval(path.slice(2, -1), data, value);
|
var insert = this._envEval(path.slice(2, -1), data, value);
|
||||||
|
if (this.options.blankNullUndefined && insert == null) {
|
||||||
|
insert = '';
|
||||||
|
}
|
||||||
|
return insert;
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
// Remove '_' prefix of attribute names so the DOM won't try
|
// Remove '_' prefix of attribute names so the DOM won't try
|
||||||
// to use them before we've processed the template
|
// to use them before we've processed the template
|
||||||
@ -177,7 +202,7 @@ Templater.prototype.processNode = function(node, data) {
|
|||||||
this.processNode(childNodes[j], data);
|
this.processNode(childNodes[j], data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.nodeType === Node.TEXT_NODE) {
|
if (node.nodeType === 3 /*Node.TEXT_NODE*/) {
|
||||||
this._processTextNode(node, data);
|
this._processTextNode(node, data);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@ -347,8 +372,27 @@ Templater.prototype._processTextNode = function(node, data) {
|
|||||||
part = this._envEval(part.slice(1), data, node.data);
|
part = this._envEval(part.slice(1), data, node.data);
|
||||||
}
|
}
|
||||||
this._handleAsync(part, node, function(reply, siblingNode) {
|
this._handleAsync(part, node, function(reply, siblingNode) {
|
||||||
reply = this._toNode(reply, siblingNode.ownerDocument);
|
var doc = siblingNode.ownerDocument;
|
||||||
|
if (reply == null) {
|
||||||
|
reply = this.options.blankNullUndefined ? '' : '' + reply;
|
||||||
|
}
|
||||||
|
if (typeof reply.cloneNode === 'function') {
|
||||||
|
// i.e. if (reply instanceof Element) { ...
|
||||||
|
reply = this._maybeImportNode(reply, doc);
|
||||||
siblingNode.parentNode.insertBefore(reply, siblingNode);
|
siblingNode.parentNode.insertBefore(reply, siblingNode);
|
||||||
|
} else if (typeof reply.item === 'function' && reply.length) {
|
||||||
|
// if thing is a NodeList, then import the children
|
||||||
|
for (var i = 0; i < reply.length; i++) {
|
||||||
|
var child = this._maybeImportNode(reply.item(i), doc);
|
||||||
|
siblingNode.parentNode.insertBefore(child, siblingNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// if thing isn't a DOM element then wrap its string value in one
|
||||||
|
reply = doc.createTextNode(reply.toString());
|
||||||
|
siblingNode.parentNode.insertBefore(reply, siblingNode);
|
||||||
|
}
|
||||||
|
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
}, this);
|
}, this);
|
||||||
node.parentNode.removeChild(node);
|
node.parentNode.removeChild(node);
|
||||||
@ -356,21 +400,13 @@ Templater.prototype._processTextNode = function(node, data) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to convert a 'thing' to a DOM Node.
|
* Return node or a import of node, if it's not in the given document
|
||||||
* This is (obviously) a no-op for DOM Elements (which are detected using
|
* @param node The node that we want to be properly owned
|
||||||
* 'typeof thing.cloneNode !== "function"' (is there a better way that will
|
* @param doc The document that the given node should belong to
|
||||||
* work in all environments, including a .jsm?)
|
* @return A node that belongs to the given document
|
||||||
* Non DOM elements are converted to a string and wrapped in a TextNode.
|
|
||||||
*/
|
*/
|
||||||
Templater.prototype._toNode = function(thing, document) {
|
Templater.prototype._maybeImportNode = function(node, doc) {
|
||||||
if (thing == null) {
|
return node.ownerDocument === doc ? node : doc.importNode(node, true);
|
||||||
thing = '' + thing;
|
|
||||||
}
|
|
||||||
// if thing isn't a DOM element then wrap its string value in one
|
|
||||||
if (typeof thing.cloneNode !== 'function') {
|
|
||||||
thing = document.createTextNode(thing.toString());
|
|
||||||
}
|
|
||||||
return thing;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -429,7 +465,6 @@ Templater.prototype._stripBraces = function(str) {
|
|||||||
* <tt>newValue</tt> is applied.
|
* <tt>newValue</tt> is applied.
|
||||||
*/
|
*/
|
||||||
Templater.prototype._property = function(path, data, newValue) {
|
Templater.prototype._property = function(path, data, newValue) {
|
||||||
this.stack.push(path);
|
|
||||||
try {
|
try {
|
||||||
if (typeof path === 'string') {
|
if (typeof path === 'string') {
|
||||||
path = path.split('.');
|
path = path.split('.');
|
||||||
@ -445,12 +480,13 @@ Templater.prototype._property = function(path, data, newValue) {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
if (!value) {
|
if (!value) {
|
||||||
this._handleError('Can\'t find path=' + path);
|
this._handleError('"' + path[0] + '" is undefined');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return this._property(path.slice(1), value, newValue);
|
return this._property(path.slice(1), value, newValue);
|
||||||
} finally {
|
} catch (ex) {
|
||||||
this.stack.pop();
|
this._handleError('Path error with \'' + path + '\'', ex);
|
||||||
|
return '${' + path + '}';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -469,7 +505,7 @@ Templater.prototype._property = function(path, data, newValue) {
|
|||||||
*/
|
*/
|
||||||
Templater.prototype._envEval = function(script, data, frame) {
|
Templater.prototype._envEval = function(script, data, frame) {
|
||||||
try {
|
try {
|
||||||
this.stack.push(frame);
|
this.stack.push(frame.replace(/\s+/g, ' '));
|
||||||
if (this._isPropertyScript.test(script)) {
|
if (this._isPropertyScript.test(script)) {
|
||||||
return this._property(script, data);
|
return this._property(script, data);
|
||||||
} else {
|
} else {
|
||||||
@ -483,8 +519,7 @@ Templater.prototype._envEval = function(script, data, frame) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
this._handleError('Template error evaluating \'' + script + '\'' +
|
this._handleError('Template error evaluating \'' + script + '\'', ex);
|
||||||
' environment=' + Object.keys(data).join(', '), ex);
|
|
||||||
return '${' + script + '}';
|
return '${' + script + '}';
|
||||||
} finally {
|
} finally {
|
||||||
this.stack.pop();
|
this.stack.pop();
|
||||||
@ -498,8 +533,7 @@ Templater.prototype._envEval = function(script, data, frame) {
|
|||||||
* @param ex optional associated exception.
|
* @param ex optional associated exception.
|
||||||
*/
|
*/
|
||||||
Templater.prototype._handleError = function(message, ex) {
|
Templater.prototype._handleError = function(message, ex) {
|
||||||
this._logError(message);
|
this._logError(message + ' (In: ' + this.stack.join(' > ') + ')');
|
||||||
this._logError('In: ' + this.stack.join(' > '));
|
|
||||||
if (ex) {
|
if (ex) {
|
||||||
this._logError(ex);
|
this._logError(ex);
|
||||||
}
|
}
|
||||||
|
@ -3,11 +3,15 @@
|
|||||||
|
|
||||||
// Tests that the DOM Template engine works properly
|
// Tests that the DOM Template engine works properly
|
||||||
|
|
||||||
let tempScope = {};
|
/*
|
||||||
Cu.import("resource:///modules/devtools/Templater.jsm", tempScope);
|
* These tests run both in Mozilla/Mochitest and plain browsers (as does
|
||||||
Cu.import("resource:///modules/devtools/Promise.jsm", tempScope);
|
* domtemplate)
|
||||||
let template = tempScope.template;
|
* We should endevour to keep the source in sync.
|
||||||
let Promise = tempScope.Promise;
|
*/
|
||||||
|
|
||||||
|
var imports = {};
|
||||||
|
Cu.import("resource:///modules/devtools/Templater.jsm", imports);
|
||||||
|
Cu.import("resource:///modules/devtools/Promise.jsm", imports);
|
||||||
|
|
||||||
function test() {
|
function test() {
|
||||||
addTab("http://example.com/browser/browser/devtools/shared/test/browser_templater_basic.html", function() {
|
addTab("http://example.com/browser/browser/devtools/shared/test/browser_templater_basic.html", function() {
|
||||||
@ -25,7 +29,7 @@ function runTest(index) {
|
|||||||
holder.innerHTML = options.template;
|
holder.innerHTML = options.template;
|
||||||
|
|
||||||
info('Running ' + options.name);
|
info('Running ' + options.name);
|
||||||
template(holder, options.data, options.options);
|
imports.template(holder, options.data, options.options);
|
||||||
|
|
||||||
if (typeof options.result == 'string') {
|
if (typeof options.result == 'string') {
|
||||||
is(holder.innerHTML, options.result, options.name);
|
is(holder.innerHTML, options.result, options.name);
|
||||||
@ -238,11 +242,43 @@ var tests = [
|
|||||||
name: 'propertyFail',
|
name: 'propertyFail',
|
||||||
template: '<p>${Math.max(1, 2)}</p>',
|
template: '<p>${Math.max(1, 2)}</p>',
|
||||||
result: '<p>${Math.max(1, 2)}</p>'
|
result: '<p>${Math.max(1, 2)}</p>'
|
||||||
|
};},
|
||||||
|
|
||||||
|
// Bug 723431: DOMTemplate should allow customisation of display of
|
||||||
|
// null/undefined values
|
||||||
|
function() { return {
|
||||||
|
name: 'propertyUndefAttrFull',
|
||||||
|
template: '<p>${nullvar}|${undefinedvar1}|${undefinedvar2}</p>',
|
||||||
|
data: { nullvar: null, undefinedvar1: undefined },
|
||||||
|
result: '<p>null|undefined|undefined</p>'
|
||||||
|
};},
|
||||||
|
|
||||||
|
function() { return {
|
||||||
|
name: 'propertyUndefAttrBlank',
|
||||||
|
template: '<p>${nullvar}|${undefinedvar1}|${undefinedvar2}</p>',
|
||||||
|
data: { nullvar: null, undefinedvar1: undefined },
|
||||||
|
options: { blankNullUndefined: true },
|
||||||
|
result: '<p>||</p>'
|
||||||
|
};},
|
||||||
|
|
||||||
|
function() { return {
|
||||||
|
name: 'propertyUndefAttrFull',
|
||||||
|
template: '<div><p value="${nullvar}"></p><p value="${undefinedvar1}"></p><p value="${undefinedvar2}"></p></div>',
|
||||||
|
data: { nullvar: null, undefinedvar1: undefined },
|
||||||
|
result: '<div><p value="null"></p><p value="undefined"></p><p value="undefined"></p></div>'
|
||||||
|
};},
|
||||||
|
|
||||||
|
function() { return {
|
||||||
|
name: 'propertyUndefAttrBlank',
|
||||||
|
template: '<div><p value="${nullvar}"></p><p value="${undefinedvar1}"></p><p value="${undefinedvar2}"></p></div>',
|
||||||
|
data: { nullvar: null, undefinedvar1: undefined },
|
||||||
|
options: { blankNullUndefined: true },
|
||||||
|
result: '<div><p value=""></p><p value=""></p><p value=""></p></div>'
|
||||||
};}
|
};}
|
||||||
];
|
];
|
||||||
|
|
||||||
function delayReply(data) {
|
function delayReply(data) {
|
||||||
var p = new Promise();
|
var p = new imports.Promise();
|
||||||
executeSoon(function() {
|
executeSoon(function() {
|
||||||
p.resolve(data);
|
p.resolve(data);
|
||||||
});
|
});
|
||||||
|
@ -11,6 +11,14 @@
|
|||||||
- application menu item that opens the debugger UI. -->
|
- application menu item that opens the debugger UI. -->
|
||||||
<!ENTITY debuggerMenu.label "Script Debugger">
|
<!ENTITY debuggerMenu.label "Script Debugger">
|
||||||
|
|
||||||
|
<!-- LOCALIZATION NOTE (remoteDebuggerMenu.label): This is the label for the
|
||||||
|
- application menu item that opens the remote debugger UI. -->
|
||||||
|
<!ENTITY remoteDebuggerMenu.label "Remote Debugger">
|
||||||
|
|
||||||
|
<!-- LOCALIZATION NOTE (chromeDebuggerMenu.label): This is the label for the
|
||||||
|
- application menu item that opens the browser debugger UI. -->
|
||||||
|
<!ENTITY chromeDebuggerMenu.label "Browser Debugger">
|
||||||
|
|
||||||
<!-- LOCALIZATION NOTE (debuggerMenu.commandkey): This is the command key that
|
<!-- LOCALIZATION NOTE (debuggerMenu.commandkey): This is the command key that
|
||||||
- launches the debugger UI. Do not translate this one! -->
|
- launches the debugger UI. Do not translate this one! -->
|
||||||
<!ENTITY debuggerMenu.commandkey "S">
|
<!ENTITY debuggerMenu.commandkey "S">
|
||||||
@ -44,3 +52,7 @@
|
|||||||
- widget that displays the variables in the various available scopes in the
|
- widget that displays the variables in the various available scopes in the
|
||||||
- debugger. -->
|
- debugger. -->
|
||||||
<!ENTITY debuggerUI.propertiesTitle "Scope variables">
|
<!ENTITY debuggerUI.propertiesTitle "Scope variables">
|
||||||
|
|
||||||
|
<!-- LOCALIZATION NOTE (debuggerUI.emptyFilterText): This is the text that
|
||||||
|
- appears in the filter text box when it is empty. -->
|
||||||
|
<!ENTITY debuggerUI.emptyFilterText "Filter scripts">
|
||||||
|
@ -38,9 +38,9 @@ withScope=With block
|
|||||||
# pane as a header on container for identifiers in a closure scope.
|
# pane as a header on container for identifiers in a closure scope.
|
||||||
closureScope=Closure
|
closureScope=Closure
|
||||||
|
|
||||||
# LOCALIZATION NOTE (emptyText): The text that is displayed in the stack frames
|
# LOCALIZATION NOTE (emptyStackText): The text that is displayed in the stack
|
||||||
# list when there are no frames to display.
|
# frames list when there are no frames to display.
|
||||||
emptyText=Empty
|
emptyStackText=No stacks to display.
|
||||||
|
|
||||||
# LOCALIZATION NOTE (loadingText): The text that is displayed in the script
|
# LOCALIZATION NOTE (loadingText): The text that is displayed in the script
|
||||||
# editor when the laoding process has started but there is no file to display
|
# editor when the laoding process has started but there is no file to display
|
||||||
|
@ -20,11 +20,16 @@ breadcrumbs.siblings=Siblings
|
|||||||
# LOCALIZATION NOTE (htmlPanel): Used in the Inspector tool's openInspectorUI
|
# LOCALIZATION NOTE (htmlPanel): Used in the Inspector tool's openInspectorUI
|
||||||
# method when registering the HTML panel.
|
# method when registering the HTML panel.
|
||||||
|
|
||||||
# LOCALIZATION NOTE (inspectButton.tooltiptext):
|
# LOCALIZATION NOTE (inspectButtonWithShortcutKey.tooltip):
|
||||||
# This button appears in the Inspector Toolbar. inspectButton is stateful,
|
# This button appears in the Inspector Toolbar. inspectButton is stateful,
|
||||||
# if it's pressed users can select an element with the mouse.
|
# if it's pressed users can select an element with the mouse.
|
||||||
# %S is the keyboard shortcut.
|
# %S is the keyboard shortcut.
|
||||||
inspectButton.tooltiptext=Select element with mouse (%S)
|
inspectButtonWithShortcutKey.tooltip=Select element with mouse (%S)
|
||||||
|
|
||||||
|
# LOCALIZATION NOTE (inspectButton.tooltip):
|
||||||
|
# Same as inspectButtonWithShortcutKey.tooltip but used when an add-on
|
||||||
|
# overrides the shortcut key.
|
||||||
|
inspectButton.tooltip=Select element with mouse
|
||||||
|
|
||||||
# LOCALIZATION NOTE (markupButton.*):
|
# LOCALIZATION NOTE (markupButton.*):
|
||||||
# This button is the button located at the beginning of the breadcrumbs
|
# This button is the button located at the beginning of the breadcrumbs
|
||||||
|
@ -23,11 +23,6 @@
|
|||||||
<!ENTITY view.sortDescending.label "Z > A Sort Order">
|
<!ENTITY view.sortDescending.label "Z > A Sort Order">
|
||||||
<!ENTITY view.sortDescending.accesskey "Z">
|
<!ENTITY view.sortDescending.accesskey "Z">
|
||||||
|
|
||||||
<!ENTITY cmd.findInBookmarks.label "Find in Bookmarks…">
|
|
||||||
<!ENTITY cmd.findInBookmarks.accesskey "F">
|
|
||||||
<!ENTITY cmd.findCurrent.label "Find in Current Collection…">
|
|
||||||
<!ENTITY cmd.findCurrent.accesskey "i">
|
|
||||||
|
|
||||||
<!ENTITY importBookmarksFromHTML.label "Import Bookmarks from HTML…">
|
<!ENTITY importBookmarksFromHTML.label "Import Bookmarks from HTML…">
|
||||||
<!ENTITY importBookmarksFromHTML.accesskey "I">
|
<!ENTITY importBookmarksFromHTML.accesskey "I">
|
||||||
<!ENTITY exportBookmarksToHTML.label "Export Bookmarks to HTML…">
|
<!ENTITY exportBookmarksToHTML.label "Export Bookmarks to HTML…">
|
||||||
|
@ -44,7 +44,6 @@ searchBookmarks=Search Bookmarks
|
|||||||
searchHistory=Search History
|
searchHistory=Search History
|
||||||
searchDownloads=Search Downloads
|
searchDownloads=Search Downloads
|
||||||
searchCurrentDefault=Search in '%S'
|
searchCurrentDefault=Search in '%S'
|
||||||
findInPrefix=Find in '%S'…
|
|
||||||
|
|
||||||
tabs.openWarningTitle=Confirm open
|
tabs.openWarningTitle=Confirm open
|
||||||
tabs.openWarningMultipleBranded=You are about to open %S tabs. This might slow down %S while the pages are loading. Are you sure you want to continue?
|
tabs.openWarningMultipleBranded=You are about to open %S tabs. This might slow down %S while the pages are loading. Are you sure you want to continue?
|
||||||
|
@ -1260,6 +1260,7 @@ toolbar[iconsize="small"] #feed-button {
|
|||||||
.notification-anchor-icon {
|
.notification-anchor-icon {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
|
margin: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-anchor-icon:-moz-focusring {
|
.notification-anchor-icon:-moz-focusring {
|
||||||
|
@ -2321,6 +2321,7 @@ toolbarbutton.bookmark-item[dragover="true"][open="true"] {
|
|||||||
.notification-anchor-icon {
|
.notification-anchor-icon {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
|
margin: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-anchor-icon:-moz-focusring {
|
.notification-anchor-icon:-moz-focusring {
|
||||||
|
@ -1,5 +1,53 @@
|
|||||||
dnl Add compiler specific options
|
dnl Add compiler specific options
|
||||||
|
|
||||||
|
AC_DEFUN([MOZ_DEFAULT_COMPILER],
|
||||||
|
[
|
||||||
|
dnl Default to MSVC for win32 and gcc-4.2 for darwin
|
||||||
|
dnl ==============================================================
|
||||||
|
if test -z "$CROSS_COMPILE"; then
|
||||||
|
case "$target" in
|
||||||
|
*-mingw*)
|
||||||
|
if test -z "$CC"; then CC=cl; fi
|
||||||
|
if test -z "$CXX"; then CXX=cl; fi
|
||||||
|
if test -z "$CPP"; then CPP="cl -E -nologo"; fi
|
||||||
|
if test -z "$CXXCPP"; then CXXCPP="cl -TP -E -nologo"; ac_cv_prog_CXXCPP="$CXXCPP"; fi
|
||||||
|
if test -z "$LD"; then LD=link; fi
|
||||||
|
if test -z "$AS"; then
|
||||||
|
case "${target_cpu}" in
|
||||||
|
i*86)
|
||||||
|
AS=ml;
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
AS=ml64;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
if test -z "$MIDL"; then MIDL=midl; fi
|
||||||
|
|
||||||
|
# need override this flag since we don't use $(LDFLAGS) for this.
|
||||||
|
if test -z "$HOST_LDFLAGS" ; then
|
||||||
|
HOST_LDFLAGS=" "
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*-darwin*)
|
||||||
|
# we prefer gcc-4.2 over gcc on older darwin, so
|
||||||
|
# use that specific version if it's available.
|
||||||
|
# On newer versions of darwin, gcc is llvm-gcc while gcc-4.2 is the plain
|
||||||
|
# one, so we also try that first. If that fails, we fall back to clang
|
||||||
|
# as llvm-gcc is an unsupported dead end.
|
||||||
|
MOZ_PATH_PROGS(CC, $CC gcc-4.2 clang gcc)
|
||||||
|
MOZ_PATH_PROGS(CXX, $CXX g++-4.2 clang++ g++)
|
||||||
|
IS_LLVM_GCC=$($CC -v 2>&1 | grep llvm-gcc)
|
||||||
|
if test -n "$IS_LLVM_GCC"
|
||||||
|
then
|
||||||
|
echo llvm-gcc is known to be broken, please use gcc-4.2 or clang.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
AC_DEFUN([MOZ_COMPILER_OPTS],
|
AC_DEFUN([MOZ_COMPILER_OPTS],
|
||||||
[
|
[
|
||||||
if test "$CLANG_CXX"; then
|
if test "$CLANG_CXX"; then
|
||||||
|
@ -70,7 +70,7 @@ import org.json.*;
|
|||||||
import com.jayway.android.robotium.solo.Solo;
|
import com.jayway.android.robotium.solo.Solo;
|
||||||
|
|
||||||
public class FennecNativeDriver implements Driver {
|
public class FennecNativeDriver implements Driver {
|
||||||
private static final int FRAME_TIME_THRESHOLD = 17; // allow 17ms per frame (~60fps)
|
private static final int FRAME_TIME_THRESHOLD = 25; // allow 25ms per frame (40fps)
|
||||||
|
|
||||||
// Map of IDs to element names.
|
// Map of IDs to element names.
|
||||||
private HashMap mLocators = null;
|
private HashMap mLocators = null;
|
||||||
@ -231,20 +231,27 @@ public class FennecNativeDriver implements Driver {
|
|||||||
try {
|
try {
|
||||||
Object [] params = null;
|
Object [] params = null;
|
||||||
List<Long> frames = (List<Long>)_stopFrameRecording.invoke(null, params);
|
List<Long> frames = (List<Long>)_stopFrameRecording.invoke(null, params);
|
||||||
int numDelays = 0;
|
int badness = 0;
|
||||||
for (int i = 1; i < frames.size(); i++) {
|
for (int i = 1; i < frames.size(); i++) {
|
||||||
if (frames.get(i) - frames.get(i-1) > FRAME_TIME_THRESHOLD) {
|
long frameTime = frames.get(i) - frames.get(i - 1);
|
||||||
numDelays++;
|
int delay = (int)(frameTime - FRAME_TIME_THRESHOLD);
|
||||||
|
// for each frame we miss, add the square of the delay. This
|
||||||
|
// makes large delays much worse than small delays.
|
||||||
|
if (delay > 0) {
|
||||||
|
badness += delay * delay;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return numDelays;
|
// Don't do any averaging of the numbers because really we want to
|
||||||
|
// know how bad the jank was at its worst
|
||||||
|
return badness;
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
log(LogLevel.ERROR, e);
|
log(LogLevel.ERROR, e);
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
log(LogLevel.ERROR, e);
|
log(LogLevel.ERROR, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
// higher values are worse, and the test failing is the worst!
|
||||||
|
return Integer.MAX_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startCheckerboardRecording() {
|
public void startCheckerboardRecording() {
|
||||||
|
@ -92,7 +92,7 @@ def build_linux_headers_aux(inst_dir):
|
|||||||
run_in(linux_source_dir, [old_make, "headers_check"])
|
run_in(linux_source_dir, [old_make, "headers_check"])
|
||||||
run_in(linux_source_dir, [old_make, "INSTALL_HDR_PATH=dest",
|
run_in(linux_source_dir, [old_make, "INSTALL_HDR_PATH=dest",
|
||||||
"headers_install"])
|
"headers_install"])
|
||||||
shutil.move(linux_source_dir + "/dest", inst_dir)
|
shutil.move(linux_source_dir + "/dest/include", inst_dir + '/include')
|
||||||
|
|
||||||
def build_linux_headers(inst_dir):
|
def build_linux_headers(inst_dir):
|
||||||
def f():
|
def f():
|
||||||
@ -151,6 +151,10 @@ def build_one_stage_aux(stage_dir, is_stage_one):
|
|||||||
"--with-mpfr=%s" % lib_inst_dir])
|
"--with-mpfr=%s" % lib_inst_dir])
|
||||||
|
|
||||||
tool_inst_dir = stage_dir + '/inst'
|
tool_inst_dir = stage_dir + '/inst'
|
||||||
|
os.mkdir(tool_inst_dir)
|
||||||
|
os.mkdir(tool_inst_dir + '/lib64')
|
||||||
|
os.symlink('lib64', tool_inst_dir + '/lib')
|
||||||
|
|
||||||
build_linux_headers(tool_inst_dir)
|
build_linux_headers(tool_inst_dir)
|
||||||
|
|
||||||
binutils_build_dir = stage_dir + '/binutils'
|
binutils_build_dir = stage_dir + '/binutils'
|
||||||
|
12
build/win32/mozconfig.vs2010-win64
Normal file
12
build/win32/mozconfig.vs2010-win64
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
export INCLUDE=/c/tools/msvs10/vc/include:/c/tools/msvs10/vc/atlmfc/include:/c/tools/sdks/v7.0/include:/c/tools/sdks/v7.0/include/atl:/c/tools/sdks/dx10/include
|
||||||
|
export LIBPATH=/c/tools/msvs10/vc/lib:/c/tools/msvs10/vc/atlmfc/lib
|
||||||
|
export LIB=/c/tools/msvs10/vc/lib:/c/tools/msvs10/vc/atlmfc/lib:/c/tools/sdks/v7.0/lib:/c/tools/sdks/dx10/lib
|
||||||
|
export PATH="/c/tools/msvs10/Common7/IDE:/c/tools/msvs10/VC/BIN:/c/tools/msvs10/Common7/Tools:/c/tools/msvs10/VC/VCPackages:${PATH}"
|
||||||
|
export WIN32_REDIST_DIR=/c/tools/msvs10/VC/redist/x86/Microsoft.VC100.CRT
|
||||||
|
|
||||||
|
|
||||||
|
mk_add_options "export LIB=$LIB"
|
||||||
|
mk_add_options "export LIBPATH=$LIBPATH"
|
||||||
|
mk_add_options "export PATH=$PATH"
|
||||||
|
mk_add_options "export INCLUDE=$INCLUDE"
|
||||||
|
mk_add_options "export WIN32_REDIST_DIR=$WIN32_REDIST_DIR"
|
@ -94,7 +94,7 @@
|
|||||||
#include "nsIContentSecurityPolicy.h"
|
#include "nsIContentSecurityPolicy.h"
|
||||||
#include "nsIAsyncVerifyRedirectCallback.h"
|
#include "nsIAsyncVerifyRedirectCallback.h"
|
||||||
#include "mozilla/Preferences.h"
|
#include "mozilla/Preferences.h"
|
||||||
#include "mozilla/dom/bindings/Utils.h"
|
#include "mozilla/dom/BindingUtils.h"
|
||||||
#include "mozilla/StandardInteger.h"
|
#include "mozilla/StandardInteger.h"
|
||||||
|
|
||||||
using namespace mozilla;
|
using namespace mozilla;
|
||||||
@ -2483,8 +2483,8 @@ nsScriptSecurityManager::doGetObjectPrincipal(JSObject *aObj
|
|||||||
JSCLASS_PRIVATE_IS_NSISUPPORTS))) {
|
JSCLASS_PRIVATE_IS_NSISUPPORTS))) {
|
||||||
priv = (nsISupports *) js::GetObjectPrivate(aObj);
|
priv = (nsISupports *) js::GetObjectPrivate(aObj);
|
||||||
} else if ((jsClass->flags & JSCLASS_IS_DOMJSCLASS) &&
|
} else if ((jsClass->flags & JSCLASS_IS_DOMJSCLASS) &&
|
||||||
bindings::DOMJSClass::FromJSClass(jsClass)->mDOMObjectIsISupports) {
|
DOMJSClass::FromJSClass(jsClass)->mDOMObjectIsISupports) {
|
||||||
priv = bindings::UnwrapDOMObject<nsISupports>(aObj, jsClass);
|
priv = UnwrapDOMObject<nsISupports>(aObj, jsClass);
|
||||||
} else {
|
} else {
|
||||||
priv = nsnull;
|
priv = nsnull;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,13 @@
|
|||||||
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
ifndef INCLUDED_AUTOTARGETS_MK #{
|
||||||
|
|
||||||
|
# Conditional does not wrap the entire file so multiple
|
||||||
|
# includes will be able to accumulate dependencies.
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
# AUTO_DEPS - A list of deps/targets drived from other macros.
|
# AUTO_DEPS - A list of deps/targets drived from other macros.
|
||||||
# *_DEPS - Make dependencies derived from a given macro.
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
MKDIR ?= mkdir -p
|
MKDIR ?= mkdir -p
|
||||||
@ -20,15 +24,6 @@ TOUCH ?= touch
|
|||||||
###########################################################################
|
###########################################################################
|
||||||
mkdir_deps =$(foreach dir,$(getargv),$(dir)/.mkdir.done)
|
mkdir_deps =$(foreach dir,$(getargv),$(dir)/.mkdir.done)
|
||||||
|
|
||||||
ifneq (,$(GENERATED_DIRS))
|
|
||||||
tmpauto :=$(call mkdir_deps,GENERATED_DIRS)
|
|
||||||
GENERATED_DIRS_DEPS +=$(tmpauto)
|
|
||||||
GARBAGE_DIRS +=$(tmpauto)
|
|
||||||
endif
|
|
||||||
|
|
||||||
## Only define rules once
|
|
||||||
ifndef INCLUDED_AUTOTARGETS_MK
|
|
||||||
|
|
||||||
%/.mkdir.done: # mkdir -p -p => mkdir -p
|
%/.mkdir.done: # mkdir -p -p => mkdir -p
|
||||||
$(subst $(SPACE)-p,$(null),$(MKDIR)) -p $(dir $@)
|
$(subst $(SPACE)-p,$(null),$(MKDIR)) -p $(dir $@)
|
||||||
@$(TOUCH) $@
|
@$(TOUCH) $@
|
||||||
@ -40,6 +35,14 @@ ifndef INCLUDED_AUTOTARGETS_MK
|
|||||||
@$(TOUCH) $@
|
@$(TOUCH) $@
|
||||||
|
|
||||||
INCLUDED_AUTOTARGETS_MK = 1
|
INCLUDED_AUTOTARGETS_MK = 1
|
||||||
|
endif #}
|
||||||
|
|
||||||
|
|
||||||
|
## Accumulate deps and cleanup
|
||||||
|
ifneq (,$(GENERATED_DIRS))
|
||||||
|
tmpauto :=$(call mkdir_deps,GENERATED_DIRS)
|
||||||
|
GENERATED_DIRS_DEPS +=$(tmpauto)
|
||||||
|
GARBAGE_DIRS +=$(tmpauto)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#################################################################
|
#################################################################
|
||||||
|
46
configure.in
46
configure.in
@ -180,41 +180,7 @@ then
|
|||||||
fi
|
fi
|
||||||
MOZ_BUILD_ROOT=`pwd`
|
MOZ_BUILD_ROOT=`pwd`
|
||||||
|
|
||||||
dnl Default to MSVC for win32 and gcc for darwin
|
MOZ_DEFAULT_COMPILER
|
||||||
dnl ==============================================================
|
|
||||||
if test -z "$CROSS_COMPILE"; then
|
|
||||||
case "$target" in
|
|
||||||
*-mingw*)
|
|
||||||
if test -z "$CC"; then CC=cl; fi
|
|
||||||
if test -z "$CXX"; then CXX=cl; fi
|
|
||||||
if test -z "$CPP"; then CPP="cl -E -nologo"; fi
|
|
||||||
if test -z "$CXXCPP"; then CXXCPP="cl -TP -E -nologo"; ac_cv_prog_CXXCPP="$CXXCPP"; fi
|
|
||||||
if test -z "$LD"; then LD=link; fi
|
|
||||||
if test -z "$AS"; then
|
|
||||||
case "${target_cpu}" in
|
|
||||||
i*86)
|
|
||||||
AS=ml;
|
|
||||||
;;
|
|
||||||
x86_64)
|
|
||||||
AS=ml64;
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test -z "$MIDL"; then MIDL=midl; fi
|
|
||||||
|
|
||||||
# need override this flag since we don't use $(LDFLAGS) for this.
|
|
||||||
if test -z "$HOST_LDFLAGS" ; then
|
|
||||||
HOST_LDFLAGS=" "
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*-darwin*)
|
|
||||||
# we prefer gcc-4.2 over gcc on older darwin, so
|
|
||||||
# use that specific version if it's available.
|
|
||||||
MOZ_PATH_PROGS(CC, $CC gcc-4.2 gcc)
|
|
||||||
MOZ_PATH_PROGS(CXX, $CXX g++-4.2 g++)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
COMPILE_ENVIRONMENT=1
|
COMPILE_ENVIRONMENT=1
|
||||||
MOZ_ARG_DISABLE_BOOL(compile-environment,
|
MOZ_ARG_DISABLE_BOOL(compile-environment,
|
||||||
@ -2266,8 +2232,6 @@ case "$target" in
|
|||||||
if test "$HAVE_64BIT_OS"; then
|
if test "$HAVE_64BIT_OS"; then
|
||||||
MOZ_MEMORY=1
|
MOZ_MEMORY=1
|
||||||
fi
|
fi
|
||||||
CFLAGS="$CFLAGS -fno-common"
|
|
||||||
CXXFLAGS="$CXXFLAGS -fno-common"
|
|
||||||
DLL_SUFFIX=".dylib"
|
DLL_SUFFIX=".dylib"
|
||||||
DSO_LDOPTS=''
|
DSO_LDOPTS=''
|
||||||
STRIP="$STRIP -x -S"
|
STRIP="$STRIP -x -S"
|
||||||
@ -7187,7 +7151,13 @@ elif test "${OS_TARGET}" = "WINNT" -o "${OS_TARGET}" = "Darwin" -o "${OS_TARGET}
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
dnl On other Unix systems, we only want to link executables against mozglue
|
dnl On other Unix systems, we only want to link executables against mozglue
|
||||||
MOZ_GLUE_PROGRAM_LDFLAGS='$(MKSHLIB_FORCE_ALL) $(call EXPAND_LIBNAME_PATH,mozglue,$(LIBXUL_DIST)/lib) $(MKSHLIB_UNFORCE_ALL)'
|
MOZ_GLUE_PROGRAM_LDFLAGS='$(MKSHLIB_FORCE_ALL) $(call EXPAND_LIBNAME_PATH,mozglue,$(LIBXUL_DIST)/lib)'
|
||||||
|
dnl On other Unix systems, where mozglue is a static library, jemalloc is
|
||||||
|
dnl separated for the SDK, so we need to add it here.
|
||||||
|
if test "$MOZ_MEMORY" = 1; then
|
||||||
|
MOZ_GLUE_PROGRAM_LDFLAGS="$MOZ_GLUE_PROGRAM_LDFLAGS "'$(call EXPAND_LIBNAME_PATH,memory,$(LIBXUL_DIST)/lib)'
|
||||||
|
fi
|
||||||
|
MOZ_GLUE_PROGRAM_LDFLAGS="$MOZ_GLUE_PROGRAM_LDFLAGS "'$(MKSHLIB_UNFORCE_ALL)'
|
||||||
if test -n "$GNU_CC"; then
|
if test -n "$GNU_CC"; then
|
||||||
dnl And we need mozglue symbols to be exported.
|
dnl And we need mozglue symbols to be exported.
|
||||||
MOZ_GLUE_PROGRAM_LDFLAGS="$MOZ_GLUE_PROGRAM_LDFLAGS -rdynamic"
|
MOZ_GLUE_PROGRAM_LDFLAGS="$MOZ_GLUE_PROGRAM_LDFLAGS -rdynamic"
|
||||||
|
@ -6079,17 +6079,21 @@ public:
|
|||||||
const char *objName)
|
const char *objName)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports *root)
|
NS_IMETHOD_(void) NoteXPCOMRoot(nsISupports *root)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
NS_IMETHOD_(void) NoteRoot(PRUint32 langID, void* root,
|
NS_IMETHOD_(void) NoteJSRoot(void* root)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
NS_IMETHOD_(void) NoteNativeRoot(void* root,
|
||||||
nsCycleCollectionParticipant* helper)
|
nsCycleCollectionParticipant* helper)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
NS_IMETHOD_(void) NoteScriptChild(PRUint32 langID, void* child)
|
|
||||||
|
NS_IMETHOD_(void) NoteJSChild(void* child)
|
||||||
{
|
{
|
||||||
if (langID == nsIProgrammingLanguage::JAVASCRIPT &&
|
if (child == mWrapper) {
|
||||||
child == mWrapper) {
|
|
||||||
mFound = true;
|
mFound = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6116,12 +6120,11 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
DebugWrapperTraceCallback(PRUint32 langID, void *p, const char *name,
|
DebugWrapperTraceCallback(void *p, const char *name, void *closure)
|
||||||
void *closure)
|
|
||||||
{
|
{
|
||||||
DebugWrapperTraversalCallback* callback =
|
DebugWrapperTraversalCallback* callback =
|
||||||
static_cast<DebugWrapperTraversalCallback*>(closure);
|
static_cast<DebugWrapperTraversalCallback*>(closure);
|
||||||
callback->NoteScriptChild(langID, p);
|
callback->NoteJSChild(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@ -6639,8 +6642,7 @@ nsContentUtils::TraceWrapper(nsWrapperCache* aCache, TraceCallback aCallback,
|
|||||||
if (aCache->PreservingWrapper()) {
|
if (aCache->PreservingWrapper()) {
|
||||||
JSObject *wrapper = aCache->GetWrapperPreserveColor();
|
JSObject *wrapper = aCache->GetWrapperPreserveColor();
|
||||||
if (wrapper) {
|
if (wrapper) {
|
||||||
aCallback(nsIProgrammingLanguage::JAVASCRIPT, wrapper,
|
aCallback(wrapper, "Preserved wrapper", aClosure);
|
||||||
"Preserved wrapper", aClosure);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2783,10 +2783,15 @@ nsDocument::GetActiveElement(nsIDOMElement **aElement)
|
|||||||
getter_AddRefs(focusedWindow));
|
getter_AddRefs(focusedWindow));
|
||||||
// be safe and make sure the element is from this document
|
// be safe and make sure the element is from this document
|
||||||
if (focusedContent && focusedContent->OwnerDoc() == this) {
|
if (focusedContent && focusedContent->OwnerDoc() == this) {
|
||||||
|
if (focusedContent->IsInNativeAnonymousSubtree()) {
|
||||||
|
focusedContent = focusedContent->FindFirstNonNativeAnonymous();
|
||||||
|
}
|
||||||
|
if (focusedContent) {
|
||||||
CallQueryInterface(focusedContent, aElement);
|
CallQueryInterface(focusedContent, aElement);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// No focused element anywhere in this document. Try to get the BODY.
|
// No focused element anywhere in this document. Try to get the BODY.
|
||||||
nsCOMPtr<nsIDOMHTMLDocument> htmlDoc = do_QueryObject(this);
|
nsCOMPtr<nsIDOMHTMLDocument> htmlDoc = do_QueryObject(this);
|
||||||
@ -6632,9 +6637,9 @@ nsDocument::RemoveFromRadioGroup(const nsAString& aName,
|
|||||||
nsCOMPtr<nsIContent> element = do_QueryInterface(aRadio);
|
nsCOMPtr<nsIContent> element = do_QueryInterface(aRadio);
|
||||||
NS_ASSERTION(element, "radio controls have to be content elements");
|
NS_ASSERTION(element, "radio controls have to be content elements");
|
||||||
if (element->HasAttr(kNameSpaceID_None, nsGkAtoms::required)) {
|
if (element->HasAttr(kNameSpaceID_None, nsGkAtoms::required)) {
|
||||||
|
NS_ASSERTION(radioGroup->mRequiredRadioCount != 0,
|
||||||
|
"mRequiredRadioCount about to wrap below 0!");
|
||||||
radioGroup->mRequiredRadioCount--;
|
radioGroup->mRequiredRadioCount--;
|
||||||
NS_ASSERTION(radioGroup->mRequiredRadioCount >= 0,
|
|
||||||
"mRequiredRadioCount shouldn't be negative!");
|
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@ -6685,9 +6690,9 @@ nsDocument::RadioRequiredChanged(const nsAString& aName, nsIFormControl* aRadio)
|
|||||||
if (element->HasAttr(kNameSpaceID_None, nsGkAtoms::required)) {
|
if (element->HasAttr(kNameSpaceID_None, nsGkAtoms::required)) {
|
||||||
radioGroup->mRequiredRadioCount++;
|
radioGroup->mRequiredRadioCount++;
|
||||||
} else {
|
} else {
|
||||||
|
NS_ASSERTION(radioGroup->mRequiredRadioCount != 0,
|
||||||
|
"mRequiredRadioCount about to wrap below 0!");
|
||||||
radioGroup->mRequiredRadioCount--;
|
radioGroup->mRequiredRadioCount--;
|
||||||
NS_ASSERTION(radioGroup->mRequiredRadioCount >= 0,
|
|
||||||
"mRequiredRadioCount shouldn't be negative!");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1711,8 +1711,12 @@ GK_ATOM(onMozTouchMove, "onMozTouchMove")
|
|||||||
GK_ATOM(onMozTouchUp, "onMozTouchUp")
|
GK_ATOM(onMozTouchUp, "onMozTouchUp")
|
||||||
|
|
||||||
// orientation support
|
// orientation support
|
||||||
GK_ATOM(ondeviceorientation, "ondeviceorientation")
|
|
||||||
GK_ATOM(ondevicemotion, "ondevicemotion")
|
GK_ATOM(ondevicemotion, "ondevicemotion")
|
||||||
|
GK_ATOM(ondeviceorientation, "ondeviceorientation")
|
||||||
|
GK_ATOM(ondeviceproximity, "ondeviceproximity")
|
||||||
|
|
||||||
|
// light sensor support
|
||||||
|
GK_ATOM(ondevicelight, "ondevicelight")
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Special atoms
|
// Special atoms
|
||||||
@ -1911,6 +1915,7 @@ GK_ATOM(az, "az")
|
|||||||
GK_ATOM(ba, "ba")
|
GK_ATOM(ba, "ba")
|
||||||
GK_ATOM(crh, "crh")
|
GK_ATOM(crh, "crh")
|
||||||
GK_ATOM(nl, "nl")
|
GK_ATOM(nl, "nl")
|
||||||
|
GK_ATOM(el, "el")
|
||||||
|
|
||||||
// Names for editor transactions
|
// Names for editor transactions
|
||||||
GK_ATOM(TypingTxnName, "Typing")
|
GK_ATOM(TypingTxnName, "Typing")
|
||||||
|
@ -519,8 +519,12 @@ nsresult nsObjectLoadingContent::IsPluginEnabledForType(const nsCString& aMIMETy
|
|||||||
MOZ_ASSERT(thisContent);
|
MOZ_ASSERT(thisContent);
|
||||||
nsIDocument* ownerDoc = thisContent->OwnerDoc();
|
nsIDocument* ownerDoc = thisContent->OwnerDoc();
|
||||||
|
|
||||||
|
nsCOMPtr<nsIDOMWindow> window = ownerDoc->GetWindow();
|
||||||
|
if (!window) {
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
nsCOMPtr<nsIDOMWindow> topWindow;
|
nsCOMPtr<nsIDOMWindow> topWindow;
|
||||||
rv = ownerDoc->GetWindow()->GetTop(getter_AddRefs(topWindow));
|
window->GetTop(getter_AddRefs(topWindow));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
nsCOMPtr<nsIDOMDocument> topDocument;
|
nsCOMPtr<nsIDOMDocument> topDocument;
|
||||||
rv = topWindow->GetDocument(getter_AddRefs(topDocument));
|
rv = topWindow->GetDocument(getter_AddRefs(topDocument));
|
||||||
|
@ -105,7 +105,7 @@
|
|||||||
#include "mozilla/Telemetry.h"
|
#include "mozilla/Telemetry.h"
|
||||||
#include "jsfriendapi.h"
|
#include "jsfriendapi.h"
|
||||||
#include "sampler.h"
|
#include "sampler.h"
|
||||||
#include "mozilla/dom/bindings/XMLHttpRequestBinding.h"
|
#include "mozilla/dom/XMLHttpRequestBinding.h"
|
||||||
#include "nsIDOMFormData.h"
|
#include "nsIDOMFormData.h"
|
||||||
|
|
||||||
#include "nsWrapperCacheInlines.h"
|
#include "nsWrapperCacheInlines.h"
|
||||||
@ -1091,8 +1091,8 @@ nsXMLHttpRequest::StaticAssertions()
|
|||||||
{
|
{
|
||||||
#define ASSERT_ENUM_EQUAL(_lc, _uc) \
|
#define ASSERT_ENUM_EQUAL(_lc, _uc) \
|
||||||
MOZ_STATIC_ASSERT(\
|
MOZ_STATIC_ASSERT(\
|
||||||
bindings::prototypes::XMLHttpRequestResponseType::_lc \
|
XMLHttpRequestResponseTypeValues::_lc \
|
||||||
== bindings::prototypes::XMLHttpRequestResponseType::value(XML_HTTP_RESPONSE_TYPE_ ## _uc), \
|
== XMLHttpRequestResponseType(XML_HTTP_RESPONSE_TYPE_ ## _uc), \
|
||||||
#_uc " should match")
|
#_uc " should match")
|
||||||
|
|
||||||
ASSERT_ENUM_EQUAL(_empty, DEFAULT);
|
ASSERT_ENUM_EQUAL(_empty, DEFAULT);
|
||||||
|
@ -69,8 +69,8 @@
|
|||||||
#include "nsDOMBlobBuilder.h"
|
#include "nsDOMBlobBuilder.h"
|
||||||
#include "nsIPrincipal.h"
|
#include "nsIPrincipal.h"
|
||||||
#include "nsIScriptObjectPrincipal.h"
|
#include "nsIScriptObjectPrincipal.h"
|
||||||
#include "mozilla/dom/bindings/XMLHttpRequestBinding.h"
|
#include "mozilla/dom/XMLHttpRequestBinding.h"
|
||||||
#include "mozilla/dom/bindings/XMLHttpRequestUploadBinding.h"
|
#include "mozilla/dom/XMLHttpRequestUploadBinding.h"
|
||||||
|
|
||||||
#include "mozilla/Assertions.h"
|
#include "mozilla/Assertions.h"
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ class nsXHREventTarget : public nsDOMEventTargetHelper,
|
|||||||
public nsIXMLHttpRequestEventTarget
|
public nsIXMLHttpRequestEventTarget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef mozilla::dom::bindings::prototypes::XMLHttpRequestResponseType::value
|
typedef mozilla::dom::XMLHttpRequestResponseType
|
||||||
XMLHttpRequestResponseType;
|
XMLHttpRequestResponseType;
|
||||||
|
|
||||||
virtual ~nsXHREventTarget() {}
|
virtual ~nsXHREventTarget() {}
|
||||||
@ -170,7 +170,7 @@ public:
|
|||||||
virtual JSObject* WrapObject(JSContext *cx, JSObject *scope,
|
virtual JSObject* WrapObject(JSContext *cx, JSObject *scope,
|
||||||
bool *triedToWrap)
|
bool *triedToWrap)
|
||||||
{
|
{
|
||||||
return mozilla::dom::bindings::prototypes::XMLHttpRequestUpload::Wrap(cx, scope, this, triedToWrap);
|
return mozilla::dom::XMLHttpRequestUploadBinding::Wrap(cx, scope, this, triedToWrap);
|
||||||
}
|
}
|
||||||
nsISupports* GetParentObject()
|
nsISupports* GetParentObject()
|
||||||
{
|
{
|
||||||
@ -202,7 +202,7 @@ public:
|
|||||||
virtual JSObject* WrapObject(JSContext *cx, JSObject *scope,
|
virtual JSObject* WrapObject(JSContext *cx, JSObject *scope,
|
||||||
bool *triedToWrap)
|
bool *triedToWrap)
|
||||||
{
|
{
|
||||||
return mozilla::dom::bindings::prototypes::XMLHttpRequest::Wrap(cx, scope, this, triedToWrap);
|
return mozilla::dom::XMLHttpRequestBinding::Wrap(cx, scope, this, triedToWrap);
|
||||||
}
|
}
|
||||||
nsISupports* GetParentObject()
|
nsISupports* GetParentObject()
|
||||||
{
|
{
|
||||||
|
@ -2972,6 +2972,7 @@ nsCanvasRenderingContext2D::DrawOrMeasureText(const nsAString& aRawText,
|
|||||||
processor.mPt.x -= anchorX * totalWidth;
|
processor.mPt.x -= anchorX * totalWidth;
|
||||||
|
|
||||||
// offset pt.y based on text baseline
|
// offset pt.y based on text baseline
|
||||||
|
processor.mFontgrp->UpdateFontList(); // ensure user font generation is current
|
||||||
NS_ASSERTION(processor.mFontgrp->FontListLength()>0, "font group contains no fonts");
|
NS_ASSERTION(processor.mFontgrp->FontListLength()>0, "font group contains no fonts");
|
||||||
const gfxFont::Metrics& fontMetrics = processor.mFontgrp->GetFontAt(0)->GetMetrics();
|
const gfxFont::Metrics& fontMetrics = processor.mFontgrp->GetFontAt(0)->GetMetrics();
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user