diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
commit | 1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch) | |
tree | 4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/rendering/RenderFileUploadControl.cpp | |
parent | 9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff) | |
download | external_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.cpp | 73 |
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) |