summaryrefslogtreecommitdiffstats
path: root/widget
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2020-01-11 22:41:59 +0100
committerwolfbeast <mcwerewolf@wolfbeast.com>2020-01-11 22:41:59 +0100
commit329d35ab57451a668331667221eef7352ef04ef6 (patch)
treee9cfdb38aa59f09c46df71a856de6ade171f380e /widget
parentd0da27ef572152d1fdd82a9ac15bd5c23ad68160 (diff)
parentcffb44547ae7997e5eaf71c644bd626eeb3bba00 (diff)
downloadUXP-329d35ab57451a668331667221eef7352ef04ef6.tar
UXP-329d35ab57451a668331667221eef7352ef04ef6.tar.gz
UXP-329d35ab57451a668331667221eef7352ef04ef6.tar.lz
UXP-329d35ab57451a668331667221eef7352ef04ef6.tar.xz
UXP-329d35ab57451a668331667221eef7352ef04ef6.zip
Merge branch 'release' into Basilisk-releasev2020.01.12
Diffstat (limited to 'widget')
-rw-r--r--widget/GfxInfoX11.cpp9
-rw-r--r--widget/IMEData.h4
-rw-r--r--widget/gtk/nsClipboard.cpp55
-rw-r--r--widget/gtk/nsClipboard.h5
-rw-r--r--widget/windows/TSFTextStore.cpp15
-rw-r--r--widget/windows/TSFTextStore.h3
-rw-r--r--widget/windows/WinIMEHandler.cpp92
-rw-r--r--widget/windows/WinIMEHandler.h3
8 files changed, 100 insertions, 86 deletions
diff --git a/widget/GfxInfoX11.cpp b/widget/GfxInfoX11.cpp
index 338dcac67..05a2cab1a 100644
--- a/widget/GfxInfoX11.cpp
+++ b/widget/GfxInfoX11.cpp
@@ -187,6 +187,15 @@ GfxInfo::GetData()
note.AppendLiteral(" -- texture_from_pixmap");
note.Append('\n');
+ // illumos/Solaris 10 libc lacks a strcasestr function, but NSPR has
+ // one. A lot of programs just implement one on the spot or use strstr
+ // and a buffer as some kind of workaround. They've been implementing
+ // missing functions lately, though, so this may not be needed much longer.
+
+#ifndef strcasestr
+#define strcasestr PL_strcasestr
+#endif
+
// determine the major OpenGL version. That's the first integer in the version string.
mGLMajorVersion = strtol(mVersion.get(), 0, 10);
diff --git a/widget/IMEData.h b/widget/IMEData.h
index b12497be3..04245df26 100644
--- a/widget/IMEData.h
+++ b/widget/IMEData.h
@@ -300,6 +300,10 @@ struct InputContext final
* compatibility with webapps relying on key listeners. */
bool mMayBeIMEUnaware;
+ /* Whether the owning document of the input element has been loaded
+ * in private browsing mode. */
+ bool mInPrivateBrowsing;
+
bool IsOriginMainProcess() const
{
return mOrigin == ORIGIN_MAIN;
diff --git a/widget/gtk/nsClipboard.cpp b/widget/gtk/nsClipboard.cpp
index eecae3e88..1ae3673b0 100644
--- a/widget/gtk/nsClipboard.cpp
+++ b/widget/gtk/nsClipboard.cpp
@@ -120,24 +120,13 @@ NS_IMETHODIMP
nsClipboard::Observe(nsISupports *aSubject, const char *aTopic, const char16_t *aData)
{
if (strcmp(aTopic, "quit-application") == 0) {
- // application is going to quit, save clipboard content
- Store();
+ // Application is going to quit, save clipboard content
+ gtk_clipboard_store(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
gdk_window_remove_filter(nullptr, selection_request_filter, nullptr);
}
return NS_OK;
}
-nsresult
-nsClipboard::Store(void)
-{
- // Ask the clipboard manager to store the current clipboard content
- if (mGlobalTransferable) {
- GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_store(clipboard);
- }
- return NS_OK;
-}
-
NS_IMETHODIMP
nsClipboard::SetData(nsITransferable *aTransferable,
nsIClipboardOwner *aOwner, int32_t aWhichClipboard)
@@ -152,9 +141,6 @@ nsClipboard::SetData(nsITransferable *aTransferable,
return NS_OK;
}
- // Clear out the clipboard in order to set the new data
- EmptyClipboard(aWhichClipboard);
-
// List of suported targets
GtkTargetList *list = gtk_target_list_new(nullptr, 0);
@@ -163,8 +149,12 @@ nsClipboard::SetData(nsITransferable *aTransferable,
nsresult rv =
aTransferable->FlavorsTransferableCanExport(getter_AddRefs(flavors));
- if (!flavors || NS_FAILED(rv))
+ if (!flavors || NS_FAILED(rv)) {
+ // Clear references to the any old data and let GTK know that it is no
+ // longer available.
+ EmptyClipboard(aWhichClipboard);
return NS_ERROR_FAILURE;
+ }
// Add all the flavors to this widget's supported type.
bool imagesAdded = false;
@@ -232,8 +222,10 @@ nsClipboard::SetData(nsITransferable *aTransferable,
}
rv = NS_OK;
- }
- else {
+ } else {
+ // Clear references to the any old data and let GTK know that it is no
+ // longer available.
+ EmptyClipboard(aWhichClipboard);
rv = NS_ERROR_FAILURE;
}
@@ -373,6 +365,23 @@ nsClipboard::GetData(nsITransferable *aTransferable, int32_t aWhichClipboard)
NS_IMETHODIMP
nsClipboard::EmptyClipboard(int32_t aWhichClipboard)
{
+ if (aWhichClipboard == kSelectionClipboard) {
+ if (mSelectionTransferable) {
+ gtk_clipboard_clear(gtk_clipboard_get(GDK_SELECTION_PRIMARY));
+ MOZ_ASSERT(!mSelectionTransferable);
+ }
+ } else {
+ if (mGlobalTransferable) {
+ gtk_clipboard_clear(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
+ MOZ_ASSERT(!mGlobalTransferable);
+ }
+ }
+
+ return NS_OK;
+}
+
+void
+nsClipboard::ClearTransferable(int32_t aWhichClipboard) {
if (aWhichClipboard == kSelectionClipboard) {
if (mSelectionOwner) {
mSelectionOwner->LosingOwnership(mSelectionTransferable);
@@ -387,8 +396,6 @@ nsClipboard::EmptyClipboard(int32_t aWhichClipboard)
}
mGlobalTransferable = nullptr;
}
-
- return NS_OK;
}
NS_IMETHODIMP
@@ -652,7 +659,7 @@ nsClipboard::SelectionClearEvent(GtkClipboard *aGtkClipboard)
else
return; // THAT AIN'T NO CLIPBOARD I EVER HEARD OF
- EmptyClipboard(whichClipboard);
+ ClearTransferable(whichClipboard);
}
void
@@ -806,7 +813,7 @@ void GetHTMLCharset(guchar * data, int32_t dataLength, nsCString& str)
static void
DispatchSelectionNotifyEvent(GtkWidget *widget, XEvent *xevent)
{
- GdkEvent event;
+ GdkEvent event = {};
event.selection.type = GDK_SELECTION_NOTIFY;
event.selection.window = gtk_widget_get_window(widget);
event.selection.selection = gdk_x11_xatom_to_atom(xevent->xselection.selection);
@@ -822,7 +829,7 @@ DispatchPropertyNotifyEvent(GtkWidget *widget, XEvent *xevent)
{
GdkWindow *window = gtk_widget_get_window(widget);
if ((gdk_window_get_events(window)) & GDK_PROPERTY_CHANGE_MASK) {
- GdkEvent event;
+ GdkEvent event = {};
event.property.type = GDK_PROPERTY_NOTIFY;
event.property.window = window;
event.property.atom = gdk_x11_xatom_to_atom(xevent->xproperty.atom);
diff --git a/widget/gtk/nsClipboard.h b/widget/gtk/nsClipboard.h
index 70c866a01..c3129bf20 100644
--- a/widget/gtk/nsClipboard.h
+++ b/widget/gtk/nsClipboard.h
@@ -39,13 +39,12 @@ private:
static GdkAtom GetSelectionAtom (int32_t aWhichClipboard);
static GtkSelectionData *GetTargets (GdkAtom aWhichClipboard);
- // Save global clipboard content to gtk
- nsresult Store (void);
-
// Get our hands on the correct transferable, given a specific
// clipboard
nsITransferable *GetTransferable (int32_t aWhichClipboard);
+ void ClearTransferable(int32_t aWhichClipboard);
+
// Hang on to our owners and transferables so we can transfer data
// when asked.
nsCOMPtr<nsIClipboardOwner> mSelectionOwner;
diff --git a/widget/windows/TSFTextStore.cpp b/widget/windows/TSFTextStore.cpp
index c80de831c..12b8cd0c1 100644
--- a/widget/windows/TSFTextStore.cpp
+++ b/widget/windows/TSFTextStore.cpp
@@ -1355,7 +1355,9 @@ TSFTextStore::Init(nsWindowBase* aWidget,
return false;
}
- SetInputScope(aContext.mHTMLInputType, aContext.mHTMLInputInputmode);
+ SetInputScope(aContext.mHTMLInputType,
+ aContext.mHTMLInputInputmode,
+ aContext.mInPrivateBrowsing);
// Create document manager
RefPtr<ITfThreadMgr> threadMgr = sThreadMgr;
@@ -3205,9 +3207,15 @@ TSFTextStore::InsertEmbedded(DWORD dwFlags,
void
TSFTextStore::SetInputScope(const nsString& aHTMLInputType,
- const nsString& aHTMLInputInputMode)
+ const nsString& aHTMLInputInputMode,
+ bool aInPrivateBrowsing)
{
mInputScopes.Clear();
+
+ if (aInPrivateBrowsing) {
+ mInputScopes.AppendElement(IS_PRIVATE);
+ }
+
if (aHTMLInputType.IsEmpty() || aHTMLInputType.EqualsLiteral("text")) {
if (aHTMLInputInputMode.EqualsLiteral("url")) {
mInputScopes.AppendElement(IS_URL);
@@ -5688,7 +5696,8 @@ TSFTextStore::SetInputContext(nsWindowBase* aWidget,
if (sEnabledTextStore) {
RefPtr<TSFTextStore> textStore(sEnabledTextStore);
textStore->SetInputScope(aContext.mHTMLInputType,
- aContext.mHTMLInputInputmode);
+ aContext.mHTMLInputInputmode,
+ aContext.mInPrivateBrowsing);
}
return;
}
diff --git a/widget/windows/TSFTextStore.h b/widget/windows/TSFTextStore.h
index 9596510d5..d1431e95d 100644
--- a/widget/windows/TSFTextStore.h
+++ b/widget/windows/TSFTextStore.h
@@ -355,7 +355,8 @@ protected:
ULONG aFilterCount,
const TS_ATTRID* aFilterAttrs);
void SetInputScope(const nsString& aHTMLInputType,
- const nsString& aHTMLInputInputmode);
+ const nsString& aHTMLInputInputmode,
+ bool aInPrivateBrowsing);
// Creates native caret over our caret. This method only works on desktop
// application. Otherwise, this does nothing.
diff --git a/widget/windows/WinIMEHandler.cpp b/widget/windows/WinIMEHandler.cpp
index d44f729c4..9debaa2dd 100644
--- a/widget/windows/WinIMEHandler.cpp
+++ b/widget/windows/WinIMEHandler.cpp
@@ -409,7 +409,7 @@ IMEHandler::OnDestroyWindow(nsWindow* aWindow)
if (!sIsInTSFMode) {
// MSDN says we need to set IS_DEFAULT to avoid memory leak when we use
// SetInputScopes API. Use an empty string to do this.
- SetInputScopeForIMM32(aWindow, EmptyString(), EmptyString());
+ SetInputScopeForIMM32(aWindow, EmptyString(), EmptyString(), false);
}
#endif // #ifdef NS_ENABLE_TSF
AssociateIMEContext(aWindow, true);
@@ -481,8 +481,10 @@ IMEHandler::SetInputContext(nsWindow* aWindow,
}
} else {
// Set at least InputScope even when TextStore is not available.
- SetInputScopeForIMM32(aWindow, aInputContext.mHTMLInputType,
- aInputContext.mHTMLInputInputmode);
+ SetInputScopeForIMM32(aWindow,
+ aInputContext.mHTMLInputType,
+ aInputContext.mHTMLInputInputmode,
+ aInputContext.mInPrivateBrowsing);
}
#endif // #ifdef NS_ENABLE_TSF
@@ -583,82 +585,64 @@ IMEHandler::OnKeyboardLayoutChanged()
void
IMEHandler::SetInputScopeForIMM32(nsWindow* aWindow,
const nsAString& aHTMLInputType,
- const nsAString& aHTMLInputInputmode)
+ const nsAString& aHTMLInputInputmode,
+ bool aInPrivateBrowsing)
{
if (sIsInTSFMode || !sSetInputScopes || aWindow->Destroyed()) {
return;
}
- UINT arraySize = 0;
- const InputScope* scopes = nullptr;
+ AutoTArray<InputScope, 3> scopes;
+
+ if (aInPrivateBrowsing) {
+ scopes.AppendElement(IS_PRIVATE);
+ }
+
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html
if (aHTMLInputType.IsEmpty() || aHTMLInputType.EqualsLiteral("text")) {
if (aHTMLInputInputmode.EqualsLiteral("url")) {
- static const InputScope inputScopes[] = { IS_URL };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_URL);
} else if (aHTMLInputInputmode.EqualsLiteral("email")) {
- static const InputScope inputScopes[] = { IS_EMAIL_SMTPEMAILADDRESS };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_EMAIL_SMTPEMAILADDRESS);
} else if (aHTMLInputInputmode.EqualsLiteral("tel")) {
- static const InputScope inputScopes[] =
- {IS_TELEPHONE_LOCALNUMBER, IS_TELEPHONE_FULLTELEPHONENUMBER};
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_TELEPHONE_LOCALNUMBER);
+ scopes.AppendElement(IS_TELEPHONE_FULLTELEPHONENUMBER);
} else if (aHTMLInputInputmode.EqualsLiteral("numeric")) {
- static const InputScope inputScopes[] = { IS_NUMBER };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_NUMBER);
} else {
- static const InputScope inputScopes[] = { IS_DEFAULT };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_DEFAULT);
}
} else if (aHTMLInputType.EqualsLiteral("url")) {
- static const InputScope inputScopes[] = { IS_URL };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_URL);
} else if (aHTMLInputType.EqualsLiteral("search")) {
- static const InputScope inputScopes[] = { IS_SEARCH };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_SEARCH);
} else if (aHTMLInputType.EqualsLiteral("email")) {
- static const InputScope inputScopes[] = { IS_EMAIL_SMTPEMAILADDRESS };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_EMAIL_SMTPEMAILADDRESS);
} else if (aHTMLInputType.EqualsLiteral("password")) {
- static const InputScope inputScopes[] = { IS_PASSWORD };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_PASSWORD);
} else if (aHTMLInputType.EqualsLiteral("datetime") ||
aHTMLInputType.EqualsLiteral("datetime-local")) {
- static const InputScope inputScopes[] = {
- IS_DATE_FULLDATE, IS_TIME_FULLTIME };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_DATE_FULLDATE);
+ scopes.AppendElement(IS_TIME_FULLTIME);
} else if (aHTMLInputType.EqualsLiteral("date") ||
aHTMLInputType.EqualsLiteral("month") ||
aHTMLInputType.EqualsLiteral("week")) {
- static const InputScope inputScopes[] = { IS_DATE_FULLDATE };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_DATE_FULLDATE);
} else if (aHTMLInputType.EqualsLiteral("time")) {
- static const InputScope inputScopes[] = { IS_TIME_FULLTIME };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_TIME_FULLTIME);
} else if (aHTMLInputType.EqualsLiteral("tel")) {
- static const InputScope inputScopes[] = {
- IS_TELEPHONE_FULLTELEPHONENUMBER, IS_TELEPHONE_LOCALNUMBER };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_TELEPHONE_FULLTELEPHONENUMBER);
+ scopes.AppendElement(IS_TELEPHONE_LOCALNUMBER);
} else if (aHTMLInputType.EqualsLiteral("number")) {
- static const InputScope inputScopes[] = { IS_NUMBER };
- scopes = &inputScopes[0];
- arraySize = ArrayLength(inputScopes);
+ scopes.AppendElement(IS_NUMBER);
}
- if (scopes && arraySize > 0) {
- sSetInputScopes(aWindow->GetWindowHandle(), scopes, arraySize, nullptr, 0,
- nullptr, nullptr);
+ if (!scopes.IsEmpty()) {
+ sSetInputScopes(aWindow->GetWindowHandle(),
+ scopes.Elements(),
+ scopes.Length(),
+ nullptr,
+ 0,
+ nullptr,
+ nullptr);
}
}
diff --git a/widget/windows/WinIMEHandler.h b/widget/windows/WinIMEHandler.h
index c18a4437e..c836e8626 100644
--- a/widget/windows/WinIMEHandler.h
+++ b/widget/windows/WinIMEHandler.h
@@ -144,7 +144,8 @@ private:
static decltype(SetInputScopes)* sSetInputScopes;
static void SetInputScopeForIMM32(nsWindow* aWindow,
const nsAString& aHTMLInputType,
- const nsAString& aHTMLInputInputmode);
+ const nsAString& aHTMLInputInputmode,
+ bool aInPrivateBrowsing);
static bool sIsInTSFMode;
// If sIMMEnabled is false, any IME messages are not handled in TSF mode.
// Additionally, IME context is always disassociated from focused window.