diff options
Diffstat (limited to 'embed')
-rw-r--r-- | embed/ephy-embed.c | 7 | ||||
-rw-r--r-- | embed/ephy-embed.h | 3 | ||||
-rw-r--r-- | embed/mozilla/EphyBrowser.cpp | 128 | ||||
-rw-r--r-- | embed/mozilla/EphyBrowser.h | 3 | ||||
-rw-r--r-- | embed/mozilla/mozilla-embed.cpp | 13 |
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 |