Index: pdf/pdfium/pdfium_engine.cc |
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc |
index e8c164b03ac0dd2f8066ef7b385e59a8803d1449..2a128ba9e42d48b9942c2d627e655f45c93c5ac1 100644 |
--- a/pdf/pdfium/pdfium_engine.cc |
+++ b/pdf/pdfium/pdfium_engine.cc |
@@ -611,6 +611,10 @@ PDFiumEngine::~PDFiumEngine() { |
FPDFAvail_Destroy(fpdf_availability_); |
} |
+void PDFiumEngine::ClientDestroyed() { |
+ client_ = NULL; |
+} |
+ |
int PDFiumEngine::GetBlock(void* param, unsigned long position, |
unsigned char* buffer, unsigned long size) { |
DocumentLoader* loader = static_cast<DocumentLoader*>(param); |
@@ -660,6 +664,8 @@ void PDFiumEngine::PluginSizeUpdated(const pp::Size& size) { |
void PDFiumEngine::ScrolledToXPosition(int position) { |
CancelPaints(); |
+ if (!client_) |
+ return; |
int old_x = position_.x(); |
position_.set_x(position); |
@@ -669,6 +675,8 @@ void PDFiumEngine::ScrolledToXPosition(int position) { |
void PDFiumEngine::ScrolledToYPosition(int position) { |
CancelPaints(); |
+ if (!client_) |
+ return; |
int old_y = position_.y(); |
position_.set_y(position); |
@@ -757,11 +765,11 @@ bool PDFiumEngine::HandleDocumentLoad(const pp::URLLoader& loader) { |
} |
pp::Instance* PDFiumEngine::GetPluginInstance() { |
- return client_->GetPluginInstance(); |
+ return client_ ? client_->GetPluginInstance() : NULL; |
} |
pp::URLLoader PDFiumEngine::CreateURLLoader() { |
- return client_->CreateURLLoader(); |
+ return client_ ? client_->CreateURLLoader() : pp::URLLoader(); |
} |
void PDFiumEngine::AppendPage(PDFEngine* engine, int index) { |
@@ -777,6 +785,9 @@ void PDFiumEngine::AppendPage(PDFEngine* engine, int index) { |
pp::Size new_page_size = GetPageSize(index); |
if (curr_page_size != new_page_size) |
LoadPageInfo(true); |
+ if (!client_) |
+ return; |
+ |
client_->Invalidate(GetPageScreenRect(index)); |
} |
@@ -821,7 +832,7 @@ void PDFiumEngine::OnPendingRequestComplete() { |
for (size_t i = 0; i < pending_pages_.size(); ++i) { |
if (CheckPageAvailable(pending_pages_[i], &still_pending)) { |
update_pages = true; |
- if (IsPageVisible(pending_pages_[i])) |
+ if (client_ && IsPageVisible(pending_pages_[i])) |
client_->Invalidate(GetPageScreenRect(pending_pages_[i])); |
} |
} |
@@ -831,6 +842,8 @@ void PDFiumEngine::OnPendingRequestComplete() { |
} |
void PDFiumEngine::OnNewDataAvailable() { |
+ if (!client_) |
+ return; |
client_->DocumentLoadProgress(doc_loader_.GetAvailableData(), |
doc_loader_.document_size()); |
} |
@@ -852,7 +865,7 @@ void PDFiumEngine::OnDocumentComplete() { |
// already downloaded. |
FPDFAvail_IsPageAvail(fpdf_availability_, i, &download_hints_); |
need_update = true; |
- if (IsPageVisible(i)) |
+ if (client_ && IsPageVisible(i)) |
client_->Invalidate(GetPageScreenRect(i)); |
} |
if (need_update) |
@@ -875,11 +888,14 @@ void PDFiumEngine::FinishLoadingDocument() { |
FORM_DoPageAAction(new_page, form_, FPDFPAGE_AACTION_OPEN); |
} |
- if (doc_) // This can only happen if loading |doc_| fails. |
+ if (doc_ && client_) // This can only happen if loading |doc_| fails. |
client_->DocumentLoadComplete(pages_.size()); |
} |
void PDFiumEngine::UnsupportedFeature(int type) { |
+ if (!client_) |
+ return; |
+ |
std::string feature; |
switch (type) { |
case FPDF_UNSP_DOC_XFAFORM: |
@@ -985,6 +1001,9 @@ pp::Resource PDFiumEngine::PrintPages( |
pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF( |
const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, |
const PP_PrintSettings_Dev& print_settings) { |
+ if (!client_) |
+ return pp::Buffer_Dev(); |
+ |
if (!page_range_count) |
return pp::Buffer_Dev(); |
@@ -1107,6 +1126,9 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF( |
} |
pp::Buffer_Dev PDFiumEngine::GetFlattenedPrintData(const FPDF_DOCUMENT& doc) { |
+ if (!client_) |
+ return pp::Buffer_Dev(); |
+ |
int page_count = FPDF_GetPageCount(doc); |
bool flatten_succeeded = true; |
for (int i = 0; i < page_count; ++i) { |
@@ -1211,6 +1233,8 @@ void PDFiumEngine::FitContentsToPrintableAreaIfRequired( |
void PDFiumEngine::SaveSelectedFormForPrint() { |
FORM_ForceToKillFocus(form_); |
+ if (!client_) |
+ return; |
client_->FormTextFieldFocusChange(false); |
} |
@@ -1257,6 +1281,9 @@ PDFiumPage::Area PDFiumEngine::GetCharIndex( |
} |
bool PDFiumEngine::OnMouseDown(const pp::MouseInputEvent& event) { |
+ if (!client_) |
+ return false; |
+ |
if (event.GetButton() != PP_INPUTEVENT_MOUSEBUTTON_LEFT) |
return false; |
@@ -1368,6 +1395,9 @@ bool PDFiumEngine::OnMouseUp(const pp::MouseInputEvent& event) { |
} |
bool PDFiumEngine::OnMouseMove(const pp::MouseInputEvent& event) { |
+ if (!client_) |
+ return false; |
+ |
int page_index = -1; |
int char_index = -1; |
PDFiumPage::Area area = GetCharIndex(event, &page_index, &char_index, NULL); |
@@ -1489,6 +1519,9 @@ bool PDFiumEngine::OnMouseMove(const pp::MouseInputEvent& event) { |
} |
bool PDFiumEngine::OnKeyDown(const pp::KeyboardInputEvent& event) { |
+ if (!client_) |
+ return false; |
+ |
if (last_page_mouse_down_ == -1) |
return false; |
@@ -1538,6 +1571,9 @@ bool PDFiumEngine::OnChar(const pp::KeyboardInputEvent& event) { |
} |
void PDFiumEngine::StartFind(const char* text, bool case_sensitive) { |
+ if (!client_) |
+ return; |
+ |
// We can get a call to StartFind before we have any page information (i.e. |
// before the first call to LoadDocument has happened). Handle this case. |
if (pages_.empty()) |
@@ -1652,6 +1688,9 @@ void PDFiumEngine::SearchUsingICU(const base::string16& term, |
bool first_search, |
int character_to_start_searching_from, |
int current_page) { |
+ if (!client_) |
+ return; |
+ |
base::string16 page_text; |
int text_length = pages_[current_page]->GetCharCount(); |
if (character_to_start_searching_from) { |
@@ -1686,6 +1725,9 @@ void PDFiumEngine::SearchUsingICU(const base::string16& term, |
} |
void PDFiumEngine::AddFindResult(const PDFiumRange& result) { |
+ if (!client_) |
+ return; |
+ |
// Figure out where to insert the new location, since we could have |
// started searching midway and now we wrapped. |
size_t i; |
@@ -1713,6 +1755,9 @@ void PDFiumEngine::AddFindResult(const PDFiumRange& result) { |
} |
bool PDFiumEngine::SelectFindResult(bool forward) { |
+ if (!client_) |
+ return false; |
+ |
if (find_results_.empty()) { |
NOTREACHED(); |
return false; |
@@ -1784,6 +1829,9 @@ void PDFiumEngine::StopFind() { |
} |
void PDFiumEngine::UpdateTickMarks() { |
+ if (!client_) |
+ return; |
+ |
std::vector<pp::Rect> tickmarks; |
for (size_t i = 0; i < find_results_.size(); ++i) { |
pp::Rect rect; |
@@ -1818,6 +1866,9 @@ void PDFiumEngine::RotateCounterclockwise() { |
} |
void PDFiumEngine::InvalidateAllPages() { |
+ if (!client_) |
+ return; |
+ |
selection_.clear(); |
find_results_.clear(); |
@@ -1947,6 +1998,9 @@ void PDFiumEngine::SetGrayscale(bool grayscale) { |
} |
void PDFiumEngine::OnCallback(int id) { |
+ if (!client_) |
+ return; |
+ |
if (!timers_.count(id)) |
return; |
@@ -1977,6 +2031,8 @@ bool PDFiumEngine::GetPrintScaling() { |
void PDFiumEngine::AppendBlankPages(int num_pages) { |
DCHECK(num_pages != 0); |
+ if (!client_) |
+ return; |
if (!doc_) |
return; |
@@ -2029,6 +2085,9 @@ void PDFiumEngine::AppendBlankPages(int num_pages) { |
} |
void PDFiumEngine::LoadDocument() { |
+ if (!client_) |
+ return; |
+ |
// Check if the document is ready for loading. If it isn't just bail for now, |
// we will call LoadDocument() again later. |
if (!doc_ && !doc_loader_.IsDocumentComplete() && |
@@ -2079,6 +2138,9 @@ bool PDFiumEngine::TryLoadingDoc(bool with_password, |
void PDFiumEngine::GetPasswordAndLoad() { |
getting_password_ = true; |
DCHECK(!doc_ && FPDF_GetLastError() == FPDF_ERR_PASSWORD); |
+ if (!client_) |
+ return; |
+ |
client_->GetDocumentPassword(password_factory_.NewCallbackWithOutput( |
&PDFiumEngine::OnGetPasswordComplete)); |
} |
@@ -2100,6 +2162,9 @@ void PDFiumEngine::OnGetPasswordComplete(int32_t result, |
void PDFiumEngine::ContinueLoadingDocument( |
bool has_password, |
const std::string& password) { |
+ if (!client_) |
+ return; |
+ |
ScopedUnsupportedFeature scoped_unsupported_feature(this); |
bool needs_password = false; |
@@ -2148,6 +2213,9 @@ void PDFiumEngine::ContinueLoadingDocument( |
} |
void PDFiumEngine::LoadPageInfo(bool reload) { |
+ if (!client_) |
+ return; |
+ |
pending_pages_.clear(); |
pp::Size old_document_size = document_size_; |
document_size_ = pp::Size(); |
@@ -2323,6 +2391,9 @@ int PDFiumEngine::StartPaint(int page_index, const pp::Rect& dirty) { |
bool PDFiumEngine::ContinuePaint(int progressive_index, |
pp::ImageData* image_data) { |
+ if (!client_) |
+ return false; |
+ |
#if defined(OS_LINUX) |
g_last_instance_id = client_->GetPluginInstance()->pp_instance(); |
#endif |
@@ -2353,6 +2424,9 @@ bool PDFiumEngine::ContinuePaint(int progressive_index, |
void PDFiumEngine::FinishPaint(int progressive_index, |
pp::ImageData* image_data) { |
+ if (!client_) |
+ return; |
+ |
int page_index = progressive_paints_[progressive_index].page_index; |
pp::Rect dirty_in_screen = progressive_paints_[progressive_index].rect; |
FPDF_BITMAP bitmap = progressive_paints_[progressive_index].bitmap; |
@@ -2546,7 +2620,7 @@ int PDFiumEngine::GetRenderingFlags() const { |
int flags = FPDF_LCD_TEXT | FPDF_NO_CATCH; |
if (render_grayscale_) |
flags |= FPDF_GRAYSCALE; |
- if (client_->IsPrintPreview()) |
+ if (client_ && client_->IsPrintPreview()) |
flags |= FPDF_PRINTING; |
return flags; |
} |
@@ -2641,13 +2715,15 @@ PDFiumEngine::SelectionChangeInvalidator::~SelectionChangeInvalidator() { |
} |
} |
- for (size_t i = 0; i < old_selections_.size(); ++i) { |
- if (!old_selections_[i].IsEmpty()) |
- engine_->client_->Invalidate(old_selections_[i]); |
- } |
- for (size_t i = 0; i < new_selections.size(); ++i) { |
- if (!new_selections[i].IsEmpty()) |
- engine_->client_->Invalidate(new_selections[i]); |
+ if (engine_->client_) { |
+ for (size_t i = 0; i < old_selections_.size(); ++i) { |
+ if (!old_selections_[i].IsEmpty()) |
+ engine_->client_->Invalidate(old_selections_[i]); |
+ } |
+ for (size_t i = 0; i < new_selections.size(); ++i) { |
+ if (!new_selections[i].IsEmpty()) |
+ engine_->client_->Invalidate(new_selections[i]); |
+ } |
} |
engine_->OnSelectionChanged(); |
} |
@@ -2703,6 +2779,7 @@ void PDFiumEngine::SetCurrentPage(int index) { |
} |
most_visible_page_ = index; |
#if defined(OS_LINUX) |
+ if (client_) |
g_last_instance_id = client_->GetPluginInstance()->pp_instance(); |
#endif |
if (most_visible_page_ != -1 && called_do_document_action_) { |
@@ -2863,6 +2940,9 @@ void PDFiumEngine::Form_Invalidate(FPDF_FORMFILLINFO* param, |
return; |
} |
+ if (!engine->client_) |
+ return; |
+ |
pp::Rect rect = engine->pages_[page_index]->PageToScreen( |
engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right, |
bottom, engine->current_rotation_); |
@@ -2896,6 +2976,9 @@ int PDFiumEngine::Form_SetTimer(FPDF_FORMFILLINFO* param, |
int elapse, |
TimerCallback timer_func) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return -1; |
+ |
engine->timers_[++engine->next_timer_id_] = |
std::pair<int, TimerCallback>(elapse, timer_func); |
engine->client_->ScheduleCallback(engine->next_timer_id_, elapse); |
@@ -2960,6 +3043,9 @@ int PDFiumEngine::Form_GetRotation(FPDF_FORMFILLINFO* param, FPDF_PAGE page) { |
void PDFiumEngine::Form_ExecuteNamedAction(FPDF_FORMFILLINFO* param, |
FPDF_BYTESTRING named_action) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
+ |
std::string action(named_action); |
if (action == "Print") { |
engine->client_->Print(); |
@@ -3004,6 +3090,8 @@ void PDFiumEngine::Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param, |
void PDFiumEngine::Form_DoURIAction(FPDF_FORMFILLINFO* param, |
FPDF_BYTESTRING uri) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
engine->client_->NavigateTo(std::string(uri), false); |
} |
@@ -3013,6 +3101,8 @@ void PDFiumEngine::Form_DoGoToAction(FPDF_FORMFILLINFO* param, |
float* position_array, |
int size_of_array) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
engine->client_->ScrollToPage(page_index); |
} |
@@ -3037,6 +3127,9 @@ int PDFiumEngine::Form_Alert(IPDF_JSPLATFORM* param, |
}; |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return ALERT_RESULT_CANCEL; |
+ |
std::string message_str = |
base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(message)); |
if (type == ALERT_TYPE_OK) { |
@@ -3062,12 +3155,15 @@ int PDFiumEngine::Form_Response(IPDF_JSPLATFORM* param, |
FPDF_BOOL password, |
void* response, |
int length) { |
+ PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return -1; |
+ |
std::string question_str = base::UTF16ToUTF8( |
reinterpret_cast<const base::char16*>(question)); |
std::string default_str = base::UTF16ToUTF8( |
reinterpret_cast<const base::char16*>(default_response)); |
- PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
std::string rv = engine->client_->Prompt(question_str, default_str); |
base::string16 rv_16 = base::UTF8ToUTF16(rv); |
int rv_bytes = rv_16.size() * sizeof(base::char16); |
@@ -3082,6 +3178,9 @@ int PDFiumEngine::Form_GetFilePath(IPDF_JSPLATFORM* param, |
void* file_path, |
int length) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return -1; |
+ |
std::string rv = engine->client_->GetURL(); |
if (file_path && rv.size() <= static_cast<size_t>(length)) |
memcpy(file_path, rv.c_str(), rv.size()); |
@@ -3098,6 +3197,10 @@ void PDFiumEngine::Form_Mail(IPDF_JSPLATFORM* param, |
FPDF_WIDESTRING bcc, |
FPDF_WIDESTRING message) { |
DCHECK(length == 0); // Don't handle attachments; no way with mailto. |
+ PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
+ |
std::string to_str = |
base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(to)); |
std::string cc_str = |
@@ -3109,7 +3212,6 @@ void PDFiumEngine::Form_Mail(IPDF_JSPLATFORM* param, |
std::string message_str = |
base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(message)); |
- PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
engine->client_->Email(to_str, cc_str, bcc_str, subject_str, message_str); |
} |
@@ -3125,6 +3227,8 @@ void PDFiumEngine::Form_Print(IPDF_JSPLATFORM* param, |
// No way to pass the extra information to the print dialog using JavaScript. |
// Just opening it is fine for now. |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
engine->client_->Print(); |
} |
@@ -3132,15 +3236,19 @@ void PDFiumEngine::Form_SubmitForm(IPDF_JSPLATFORM* param, |
void* form_data, |
int length, |
FPDF_WIDESTRING url) { |
+ PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
std::string url_str = |
base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(url)); |
- PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
engine->client_->SubmitForm(url_str, form_data, length); |
} |
void PDFiumEngine::Form_GotoPage(IPDF_JSPLATFORM* param, |
int page_number) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return; |
engine->client_->ScrollToPage(page_number); |
} |
@@ -3148,6 +3256,9 @@ int PDFiumEngine::Form_Browse(IPDF_JSPLATFORM* param, |
void* file_path, |
int length) { |
PDFiumEngine* engine = static_cast<PDFiumEngine*>(param); |
+ if (!engine->client_) |
+ return -1; |
+ |
std::string path = engine->client_->ShowFileSelectionDialog(); |
if (path.size() + 1 <= static_cast<size_t>(length)) |
memcpy(file_path, &path[0], path.size() + 1); |