aboutsummaryrefslogtreecommitdiffstats
path: root/embed
diff options
context:
space:
mode:
Diffstat (limited to 'embed')
-rw-r--r--embed/ephy-embed.c7
-rw-r--r--embed/ephy-embed.h3
-rw-r--r--embed/mozilla/EphyBrowser.cpp128
-rw-r--r--embed/mozilla/EphyBrowser.h3
-rw-r--r--embed/mozilla/mozilla-embed.cpp13
5 files changed, 153 insertions, 1 deletions
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 3c51638ae..186f3ef5b 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -386,3 +386,10 @@ ephy_embed_print_preview_navigate (EphyEmbed *embed,
EphyEmbedIFace *iface = EPHY_EMBED_GET_IFACE (embed);
return iface->print_preview_navigate (embed, type, page);
}
+
+gboolean
+ephy_embed_has_modified_forms (EphyEmbed *embed)
+{
+ EphyEmbedIFace *iface = EPHY_EMBED_GET_IFACE (embed);
+ return iface->has_modified_forms (embed);
+}
diff --git a/embed/ephy-embed.h b/embed/ephy-embed.h
index f047b4e4d..71ca925d8 100644
--- a/embed/ephy-embed.h
+++ b/embed/ephy-embed.h
@@ -228,6 +228,7 @@ struct EphyEmbedIFace
EmbedPrintPreviewNavType type,
int page);
void (* activate) (EphyEmbed *embed);
+ gboolean (* has_modified_forms) (EphyEmbed *embed);
};
GType ephy_embed_get_type (void);
@@ -319,6 +320,8 @@ void ephy_embed_print_preview_navigate (EphyEmbed *embed,
/* Misc. utility */
void ephy_embed_activate (EphyEmbed *embed);
+gboolean ephy_embed_has_modified_forms (EphyEmbed *embed);
+
G_END_DECLS
#endif
diff --git a/embed/mozilla/EphyBrowser.cpp b/embed/mozilla/EphyBrowser.cpp
index c8c82c62c..afed11d8a 100644
--- a/embed/mozilla/EphyBrowser.cpp
+++ b/embed/mozilla/EphyBrowser.cpp
@@ -74,6 +74,9 @@
#include "nsIDOMHTMLDocument.h"
#include "nsIDOMHTMLCollection.h"
#include "nsIDOMHTMLElement.h"
+#include "nsIDOMHTMLFormElement.h"
+#include "nsIDOMHTMLInputElement.h"
+#include "nsIDOMHTMLTextAreaElement.h"
#include "nsIDeviceContext.h"
#include "nsIPresContext.h"
#include "nsIAtom.h"
@@ -498,7 +501,6 @@ nsresult EphyBrowser::GetZoom (float *aZoom)
nsresult EphyBrowser::GetDocument (nsIDOMDocument **aDOMDocument)
{
- nsCOMPtr<nsIDOMDocument> domDocument;
return mDOMWindow->GetDocument (aDOMDocument);
}
@@ -867,3 +869,127 @@ nsresult EphyBrowser::GetCommandState (const char *command, PRBool *enabled)
return cmdManager->IsCommandEnabled (command, nsnull, enabled);
}
+
+#define NUM_MODIFIED_TEXTFIELDS_REQUIRED 2
+
+nsresult EphyBrowser::GetDocumentHasModifiedForms (nsIDOMDocument *aDomDoc, PRUint32 *aNumTextFields, PRBool *aHasTextArea)
+{
+ nsCOMPtr<nsIDOMHTMLDocument> htmlDoc = do_QueryInterface(aDomDoc);
+ NS_ENSURE_TRUE (htmlDoc, NS_ERROR_FAILURE);
+
+ nsCOMPtr<nsIDOMHTMLCollection> forms;
+ htmlDoc->GetForms (getter_AddRefs (forms));
+ if (!forms) return NS_OK; /* it's ok not to have any forms */
+
+ PRUint32 formNum;
+ forms->GetLength (&formNum);
+
+ /* check all forms */
+ for (PRUint32 formIndex = 0; formIndex < formNum; formIndex++)
+ {
+ nsCOMPtr<nsIDOMNode> formNode;
+ forms->Item (formIndex, getter_AddRefs (formNode));
+ if (!formNode) continue;
+
+ nsCOMPtr<nsIDOMHTMLFormElement> formElement = do_QueryInterface (formNode);
+ if (!formElement) continue;
+
+ nsCOMPtr<nsIDOMHTMLCollection> formElements;
+ formElement->GetElements (getter_AddRefs (formElements));
+ if (!formElements) continue;
+
+ PRUint32 elementNum;
+ formElements->GetLength (&elementNum);
+
+ /* check all input elements in the form for user input */
+ for (PRUint32 elementIndex = 0; elementIndex < elementNum; elementIndex++)
+ {
+ nsCOMPtr<nsIDOMNode> domNode;
+ formElements->Item (elementIndex, getter_AddRefs (domNode));
+ if (!domNode) continue;
+
+ nsCOMPtr<nsIDOMHTMLTextAreaElement> areaElement = do_QueryInterface (domNode);
+ if (areaElement)
+ {
+ nsAutoString default_text, user_text;
+ areaElement->GetDefaultValue (default_text);
+ areaElement->GetValue (user_text);
+ if (Compare (user_text, default_text) != 0)
+ {
+ *aHasTextArea = PR_TRUE;
+ return NS_OK;
+ }
+
+ continue;
+ }
+
+ nsCOMPtr<nsIDOMHTMLInputElement> inputElement = do_QueryInterface(domNode);
+ if (!inputElement) continue;
+
+ nsAutoString type;
+ inputElement->GetType(type);
+
+ if (type.EqualsIgnoreCase("text"))
+ {
+ nsAutoString default_text, user_text;
+ inputElement->GetDefaultValue (default_text);
+ inputElement->GetValue (user_text);
+ if (Compare (user_text, default_text) != 0)
+ {
+ (*aNumTextFields)++;
+ if (*aNumTextFields >= NUM_MODIFIED_TEXTFIELDS_REQUIRED)
+ {
+ return NS_OK;
+ }
+ }
+ }
+ }
+ }
+
+ return NS_OK;
+}
+
+nsresult EphyBrowser::GetHasModifiedForms (PRBool *modified)
+{
+ *modified = PR_FALSE;
+
+ nsCOMPtr<nsIDocShell> rootDocShell = do_GetInterface (mWebBrowser);
+ NS_ENSURE_TRUE (rootDocShell, NS_ERROR_FAILURE);
+
+ nsCOMPtr<nsISimpleEnumerator> enumerator;
+ rootDocShell->GetDocShellEnumerator(nsIDocShellTreeItem::typeContent,
+ nsIDocShell::ENUMERATE_FORWARDS,
+ getter_AddRefs(enumerator));
+ NS_ENSURE_TRUE (enumerator, NS_ERROR_FAILURE);
+
+ PRBool hasMore;
+ PRBool hasTextArea = PR_FALSE;
+ PRUint32 numTextFields = 0;
+ while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore)
+ {
+ nsCOMPtr<nsISupports> element;
+ enumerator->GetNext (getter_AddRefs(element));
+ if (!element) continue;
+
+ nsCOMPtr<nsIDocShell> docShell = do_QueryInterface (element);
+ if (!docShell) continue;
+
+ nsCOMPtr<nsIContentViewer> contentViewer;
+ docShell->GetContentViewer (getter_AddRefs(contentViewer));
+ if (!contentViewer) continue;
+
+ nsCOMPtr<nsIDOMDocument> domDoc;
+ contentViewer->GetDOMDocument (getter_AddRefs (domDoc));
+
+ nsresult result;
+ result = GetDocumentHasModifiedForms (domDoc, &numTextFields, &hasTextArea);
+ if (NS_SUCCEEDED (result) &&
+ (numTextFields >= NUM_MODIFIED_TEXTFIELDS_REQUIRED || hasTextArea))
+ {
+ *modified = PR_TRUE;
+ break;
+ }
+ }
+
+ return NS_OK;
+}
diff --git a/embed/mozilla/EphyBrowser.h b/embed/mozilla/EphyBrowser.h
index e5ed2e5f5..40101ce44 100644
--- a/embed/mozilla/EphyBrowser.h
+++ b/embed/mozilla/EphyBrowser.h
@@ -119,6 +119,8 @@ public:
nsresult GetDocumentUrl (nsCString &url);
nsresult GetTargetDocumentUrl (nsCString &url);
+ nsresult GetHasModifiedForms (PRBool *modified);
+
nsCOMPtr<nsIWebBrowser> mWebBrowser;
private:
@@ -135,6 +137,7 @@ private:
nsresult SetZoomOnDocshell (float aZoom, nsIDocShell *DocShell);
nsresult GetSHistory (nsISHistory **aSHistory);
nsresult GetContentViewer (nsIContentViewer **aViewer);
+ nsresult GetDocumentHasModifiedForms (nsIDOMDocument *aDomDoc, PRUint32 *aNumTextFields, PRBool *aHasTextArea);
};
#endif
diff --git a/embed/mozilla/mozilla-embed.cpp b/embed/mozilla/mozilla-embed.cpp
index f333c8768..15b88938b 100644
--- a/embed/mozilla/mozilla-embed.cpp
+++ b/embed/mozilla/mozilla-embed.cpp
@@ -786,6 +786,18 @@ impl_get_encoding_info (EphyEmbed *embed)
return info;
}
+static gboolean
+impl_has_modified_forms (EphyEmbed *embed)
+{
+ MozillaEmbedPrivate *mpriv = MOZILLA_EMBED(embed)->priv;
+ nsresult result;
+
+ PRBool modified;
+ result = mpriv->browser->GetHasModifiedForms (&modified);
+
+ return modified == PR_TRUE ? TRUE : FALSE;
+}
+
static void
mozilla_embed_location_changed_cb (GtkMozEmbed *embed,
MozillaEmbed *membed)
@@ -1121,6 +1133,7 @@ ephy_embed_iface_init (EphyEmbedIFace *iface)
iface->print_preview_close = impl_print_preview_close;
iface->print_preview_n_pages = impl_print_preview_n_pages;
iface->print_preview_navigate = impl_print_preview_navigate;
+ iface->has_modified_forms = impl_has_modified_forms;
}
void