Skip to content

Commit

Permalink
#405: picker init and callback
Browse files Browse the repository at this point in the history
  • Loading branch information
classilla committed Jun 25, 2018
1 parent 582f5a0 commit 2f7aef6
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 2 deletions.
72 changes: 70 additions & 2 deletions dom/html/HTMLInputElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,39 @@ nsColorPickerShownCallback::Done(const nsAString& aColor)

NS_IMPL_ISUPPORTS(nsColorPickerShownCallback, nsIColorPickerShownCallback)

HTMLInputElement::nsDatePickerShownCallback::nsDatePickerShownCallback(
HTMLInputElement* aInput, nsIDatePicker* aDatePicker)
: mDatePicker(aDatePicker)
, mInput(aInput)
{
}

NS_IMETHODIMP
HTMLInputElement::nsDatePickerShownCallback::Done(int16_t aResult)
{
mInput->PickerClosed();

if (aResult == nsIDatePicker::returnCancel) {
return NS_OK;
}

nsAutoString date;
nsresult rv = mDatePicker->GetSelectedDate(date);
NS_ENSURE_SUCCESS(rv, rv);

// The text control frame (if there is one) isn't going to send a change
// event because it will think this is done by a script.
// So, we can safely send one by ourself.
mInput->SetValue(date); // set value
return nsContentUtils::DispatchTrustedEvent(mInput->OwnerDoc(),
static_cast<nsIDOMHTMLInputElement*>(mInput.get()),
NS_LITERAL_STRING("change"), true,
false);
}

NS_IMPL_ISUPPORTS(HTMLInputElement::nsDatePickerShownCallback,
nsIDatePickerShownCallback)

bool
HTMLInputElement::IsPopupBlocked() const
{
Expand Down Expand Up @@ -578,8 +611,43 @@ HTMLInputElement::InitTimePicker()
nsresult
HTMLInputElement::InitDatePicker()
{
NS_WARNING("InitDatePicker NYI");
return NS_ERROR_FAILURE;
if (mPickerRunning) {
NS_WARNING("Just one nsIDatePicker is allowed");
return NS_ERROR_FAILURE;
}

nsCOMPtr<nsIDocument> doc = OwnerDoc();

nsCOMPtr<nsPIDOMWindow> win = doc->GetWindow();
if (!win) {
return NS_ERROR_FAILURE;
}

if (IsPopupBlocked()) {
win->FirePopupBlockedEvent(doc, nullptr, EmptyString(), EmptyString());
return NS_OK;
}

nsCOMPtr<nsIDatePicker> datePicker = do_CreateInstance("@mozilla.org/datepicker;1");
if (!datePicker) {
return NS_ERROR_FAILURE;
}

nsAutoString initialValue;
GetValueInternal(initialValue);
nsresult rv = datePicker->Init(win, EmptyString()); // title NYI
NS_ENSURE_SUCCESS(rv, rv);
rv = datePicker->SetDefaultDate(initialValue);

nsCOMPtr<nsIDatePickerShownCallback> callback =
new nsDatePickerShownCallback(this, datePicker);

rv = datePicker->Open(callback);
if (NS_SUCCEEDED(rv)) {
mPickerRunning = true;
}

return rv;
}

nsresult
Expand Down
19 changes: 19 additions & 0 deletions dom/html/HTMLInputElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "mozilla/dom/HTMLInputElementBinding.h"
#include "mozilla/dom/Promise.h"
#include "nsIFilePicker.h"
#include "nsIDatePicker.h"
#include "nsIContentPrefService2.h"
#include "mozilla/Decimal.h"
#include "nsContentUtils.h"
Expand Down Expand Up @@ -1461,6 +1462,24 @@ class HTMLInputElement final : public nsGenericHTMLFormElementWithState,
nsCOMPtr<nsIFilePicker> mFilePicker;
RefPtr<HTMLInputElement> mInput;
};

class nsDatePickerShownCallback
: public nsIDatePickerShownCallback
{
virtual ~nsDatePickerShownCallback()
{ }

public:
nsDatePickerShownCallback(HTMLInputElement* aInput,
nsIDatePicker* aDatePicker);
NS_DECL_ISUPPORTS

NS_IMETHOD Done(int16_t aResult) override;

private:
nsCOMPtr<nsIDatePicker> mDatePicker;
RefPtr<HTMLInputElement> mInput;
};
};

} // namespace dom
Expand Down

0 comments on commit 2f7aef6

Please sign in to comment.