summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderFileUploadControl.cpp
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:15 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:15 -0800
commit1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch)
tree4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/rendering/RenderFileUploadControl.cpp
parent9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff)
downloadexternal_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.zip
external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.gz
external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.bz2
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'WebCore/rendering/RenderFileUploadControl.cpp')
-rw-r--r--WebCore/rendering/RenderFileUploadControl.cpp73
1 files changed, 50 insertions, 23 deletions
diff --git a/WebCore/rendering/RenderFileUploadControl.cpp b/WebCore/rendering/RenderFileUploadControl.cpp
index 64088f7..fe9772e 100644
--- a/WebCore/rendering/RenderFileUploadControl.cpp
+++ b/WebCore/rendering/RenderFileUploadControl.cpp
@@ -21,12 +21,14 @@
#include "config.h"
#include "RenderFileUploadControl.h"
+#include "FileList.h"
#include "FrameView.h"
#include "GraphicsContext.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "Icon.h"
#include "LocalizedStrings.h"
+#include "Page.h"
#include "RenderButton.h"
#include "RenderText.h"
#include "RenderTheme.h"
@@ -71,17 +73,11 @@ RenderFileUploadControl::~RenderFileUploadControl()
m_fileChooser->disconnectClient();
}
-void RenderFileUploadControl::setStyle(RenderStyle* newStyle)
+void RenderFileUploadControl::styleDidChange(RenderStyle::Diff diff, const RenderStyle* oldStyle)
{
- // Force text-align to match the direction
- if (newStyle->direction() == LTR)
- newStyle->setTextAlign(LEFT);
- else
- newStyle->setTextAlign(RIGHT);
-
- RenderBlock::setStyle(newStyle);
+ RenderBlock::styleDidChange(diff, oldStyle);
if (m_button)
- m_button->renderer()->setStyle(createButtonStyle(newStyle));
+ m_button->renderer()->setStyle(createButtonStyle(style()));
setReplaced(isInline());
}
@@ -92,7 +88,7 @@ void RenderFileUploadControl::valueChanged()
RefPtr<FileChooser> fileChooser = m_fileChooser;
HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(node());
- inputElement->setValueFromRenderer(fileChooser->filename());
+ inputElement->setFileListFromRenderer(fileChooser->filenames());
inputElement->onChange();
// only repaint if it doesn't seem we have been destroyed
@@ -100,23 +96,36 @@ void RenderFileUploadControl::valueChanged()
repaint();
}
+bool RenderFileUploadControl::allowsMultipleFiles()
+{
+ HTMLInputElement* input = static_cast<HTMLInputElement*>(node());
+ return !input->getAttribute(multipleAttr).isNull();
+}
+
void RenderFileUploadControl::click()
{
- m_fileChooser->openFileChooser(node()->document());
+ Frame* frame = node()->document()->frame();
+ if (!frame)
+ return;
+ Page* page = frame->page();
+ if (!page)
+ return;
+ page->chrome()->runOpenPanel(frame, m_fileChooser);
}
void RenderFileUploadControl::updateFromElement()
{
HTMLInputElement* inputElement = static_cast<HTMLInputElement*>(node());
-
+ ASSERT(inputElement->inputType() == HTMLInputElement::FILE);
+
if (!m_button) {
m_button = new HTMLFileUploadInnerButtonElement(document(), inputElement);
m_button->setInputType("button");
m_button->setValue(fileButtonChooseFileLabel());
- RenderStyle* buttonStyle = createButtonStyle(style());
- RenderObject* renderer = m_button->createRenderer(renderArena(), buttonStyle);
+ RefPtr<RenderStyle> buttonStyle = createButtonStyle(style());
+ RenderObject* renderer = m_button->createRenderer(renderArena(), buttonStyle.get());
m_button->setRenderer(renderer);
- renderer->setStyle(buttonStyle);
+ renderer->setStyle(buttonStyle.release());
renderer->updateFromElement();
m_button->setAttached();
m_button->setInDocument(true);
@@ -130,9 +139,11 @@ void RenderFileUploadControl::updateFromElement()
m_button->setDisabled(true);
#endif
- // This only supports clearing out the filename, but that's OK because for
+ // This only supports clearing out the files, but that's OK because for
// security reasons that's the only change the DOM is allowed to make.
- if (inputElement->value().isEmpty() && !m_fileChooser->filename().isEmpty()) {
+ FileList* files = inputElement->files();
+ ASSERT(files);
+ if (files && files->isEmpty() && !m_fileChooser->filenames().isEmpty()) {
m_fileChooser->clear();
repaint();
}
@@ -144,11 +155,11 @@ int RenderFileUploadControl::maxFilenameWidth() const
- (m_fileChooser->icon() ? iconWidth + iconFilenameSpacing : 0));
}
-RenderStyle* RenderFileUploadControl::createButtonStyle(RenderStyle* parentStyle) const
+PassRefPtr<RenderStyle> RenderFileUploadControl::createButtonStyle(const RenderStyle* parentStyle) const
{
- RenderStyle* style = getPseudoStyle(RenderStyle::FILE_UPLOAD_BUTTON);
+ RefPtr<RenderStyle> style = getCachedPseudoStyle(RenderStyle::FILE_UPLOAD_BUTTON);
if (!style) {
- style = new (renderArena()) RenderStyle;
+ style = RenderStyle::create();
if (parentStyle)
style->inheritFrom(parentStyle);
}
@@ -157,7 +168,7 @@ RenderStyle* RenderFileUploadControl::createButtonStyle(RenderStyle* parentStyle
// without this setWhiteSpace.
style->setWhiteSpace(NOWRAP);
- return style;
+ return style.release();
}
void RenderFileUploadControl::paintObject(PaintInfo& paintInfo, int tx, int ty)
@@ -261,11 +272,27 @@ void RenderFileUploadControl::calcPrefWidths()
setPrefWidthsDirty(false);
}
-void RenderFileUploadControl::receiveDroppedFile(const String& filename)
+void RenderFileUploadControl::receiveDroppedFiles(const Vector<String>& paths)
{
- m_fileChooser->chooseFile(filename);
+ if (allowsMultipleFiles())
+ m_fileChooser->chooseFiles(paths);
+ else
+ m_fileChooser->chooseFile(paths[0]);
+}
+
+String RenderFileUploadControl::buttonValue()
+{
+ if (!m_button)
+ return String();
+
+ return m_button->value();
}
+String RenderFileUploadControl::fileTextValue()
+{
+ return m_fileChooser->basenameForWidth(style()->font(), maxFilenameWidth());
+}
+
HTMLFileUploadInnerButtonElement::HTMLFileUploadInnerButtonElement(Document* doc, Node* shadowParent)
: HTMLInputElement(doc)
, m_shadowParent(shadowParent)