OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "pdf/out_of_process_instance.h" | 5 #include "pdf/out_of_process_instance.h" |
6 | 6 |
7 #include <algorithm> // for min/max() | 7 #include <algorithm> // for min/max() |
8 #define _USE_MATH_DEFINES // for M_PI | 8 #define _USE_MATH_DEFINES // for M_PI |
9 #include <cmath> // for log() and pow() | 9 #include <cmath> // for log() and pow() |
10 #include <math.h> | 10 #include <math.h> |
(...skipping 30 matching lines...) Expand all Loading... |
41 #include "ppapi/cpp/var_array.h" | 41 #include "ppapi/cpp/var_array.h" |
42 #include "ppapi/cpp/var_dictionary.h" | 42 #include "ppapi/cpp/var_dictionary.h" |
43 #include "ui/events/keycodes/keyboard_codes.h" | 43 #include "ui/events/keycodes/keyboard_codes.h" |
44 | 44 |
45 #if defined(OS_MACOSX) | 45 #if defined(OS_MACOSX) |
46 #include "base/mac/mac_util.h" | 46 #include "base/mac/mac_util.h" |
47 #endif | 47 #endif |
48 | 48 |
49 namespace chrome_pdf { | 49 namespace chrome_pdf { |
50 | 50 |
51 // URL reference parameters. | |
52 // For more possible parameters, see RFC 3778 and the "PDF Open Parameters" | |
53 // document from Adobe. | |
54 const char kDelimiters[] = "#&"; | |
55 const char kNamedDest[] = "nameddest"; | |
56 const char kPage[] = "page"; | |
57 | |
58 const char kChromePrint[] = "chrome://print/"; | 51 const char kChromePrint[] = "chrome://print/"; |
59 const char kChromeExtension[] = | 52 const char kChromeExtension[] = |
60 "chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai"; | 53 "chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai"; |
61 | 54 |
62 // Dictionary Value key names for the document accessibility info | 55 // Dictionary Value key names for the document accessibility info |
63 const char kAccessibleNumberOfPages[] = "numberOfPages"; | 56 const char kAccessibleNumberOfPages[] = "numberOfPages"; |
64 const char kAccessibleLoaded[] = "loaded"; | 57 const char kAccessibleLoaded[] = "loaded"; |
65 const char kAccessibleCopyable[] = "copyable"; | 58 const char kAccessibleCopyable[] = "copyable"; |
66 | 59 |
67 // Constants used in handling postMessage() messages. | 60 // Constants used in handling postMessage() messages. |
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1066 void OutOfProcessInstance::DocumentLoadComplete(int page_count) { | 1059 void OutOfProcessInstance::DocumentLoadComplete(int page_count) { |
1067 // Clear focus state for OSK. | 1060 // Clear focus state for OSK. |
1068 FormTextFieldFocusChange(false); | 1061 FormTextFieldFocusChange(false); |
1069 | 1062 |
1070 DCHECK(document_load_state_ == LOAD_STATE_LOADING); | 1063 DCHECK(document_load_state_ == LOAD_STATE_LOADING); |
1071 document_load_state_ = LOAD_STATE_COMPLETE; | 1064 document_load_state_ = LOAD_STATE_COMPLETE; |
1072 UserMetricsRecordAction("PDF.LoadSuccess"); | 1065 UserMetricsRecordAction("PDF.LoadSuccess"); |
1073 | 1066 |
1074 // Note: If we are in print preview mode the scroll location is retained | 1067 // Note: If we are in print preview mode the scroll location is retained |
1075 // across document loads so we don't want to scroll again and override it. | 1068 // across document loads so we don't want to scroll again and override it. |
1076 if (!IsPrintPreview()) { | 1069 if (IsPrintPreview()) { |
1077 int initial_page = GetInitialPage(url_); | |
1078 if (initial_page >= 0) | |
1079 ScrollToPage(initial_page); | |
1080 } else { | |
1081 AppendBlankPrintPreviewPages(); | 1070 AppendBlankPrintPreviewPages(); |
1082 OnGeometryChanged(0, 0); | 1071 OnGeometryChanged(0, 0); |
1083 } | 1072 } |
1084 | 1073 |
1085 pp::VarDictionary message; | 1074 pp::VarDictionary message; |
1086 message.Set(pp::Var(kType), pp::Var(kJSLoadProgressType)); | 1075 message.Set(pp::Var(kType), pp::Var(kJSLoadProgressType)); |
1087 message.Set(pp::Var(kJSProgressPercentage), pp::Var(100)) ; | 1076 message.Set(pp::Var(kJSProgressPercentage), pp::Var(100)) ; |
1088 PostMessage(message); | 1077 PostMessage(message); |
1089 | 1078 |
1090 if (!full_) | 1079 if (!full_) |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 | 1286 |
1298 const PPB_URLLoaderTrusted* trusted_interface = | 1287 const PPB_URLLoaderTrusted* trusted_interface = |
1299 reinterpret_cast<const PPB_URLLoaderTrusted*>( | 1288 reinterpret_cast<const PPB_URLLoaderTrusted*>( |
1300 pp::Module::Get()->GetBrowserInterface( | 1289 pp::Module::Get()->GetBrowserInterface( |
1301 PPB_URLLOADERTRUSTED_INTERFACE)); | 1290 PPB_URLLOADERTRUSTED_INTERFACE)); |
1302 if (trusted_interface) | 1291 if (trusted_interface) |
1303 trusted_interface->GrantUniversalAccess(loader.pp_resource()); | 1292 trusted_interface->GrantUniversalAccess(loader.pp_resource()); |
1304 return loader; | 1293 return loader; |
1305 } | 1294 } |
1306 | 1295 |
1307 int OutOfProcessInstance::GetInitialPage(const std::string& url) { | |
1308 size_t found_idx = url.find('#'); | |
1309 if (found_idx == std::string::npos) | |
1310 return -1; | |
1311 | |
1312 const std::string& ref = url.substr(found_idx + 1); | |
1313 std::vector<std::string> fragments; | |
1314 Tokenize(ref, kDelimiters, &fragments); | |
1315 | |
1316 // Page number to return, zero-based. | |
1317 int page = -1; | |
1318 | |
1319 // Handle the case of http://foo.com/bar#NAMEDDEST. This is not explicitly | |
1320 // mentioned except by example in the Adobe "PDF Open Parameters" document. | |
1321 if ((fragments.size() == 1) && (fragments[0].find('=') == std::string::npos)) | |
1322 return engine_->GetNamedDestinationPage(fragments[0]); | |
1323 | |
1324 for (size_t i = 0; i < fragments.size(); ++i) { | |
1325 std::vector<std::string> key_value; | |
1326 base::SplitString(fragments[i], '=', &key_value); | |
1327 if (key_value.size() != 2) | |
1328 continue; | |
1329 const std::string& key = key_value[0]; | |
1330 const std::string& value = key_value[1]; | |
1331 | |
1332 if (base::strcasecmp(kPage, key.c_str()) == 0) { | |
1333 // |page_value| is 1-based. | |
1334 int page_value = -1; | |
1335 if (base::StringToInt(value, &page_value) && page_value > 0) | |
1336 page = page_value - 1; | |
1337 continue; | |
1338 } | |
1339 if (base::strcasecmp(kNamedDest, key.c_str()) == 0) { | |
1340 // |page_value| is 0-based. | |
1341 int page_value = engine_->GetNamedDestinationPage(value); | |
1342 if (page_value >= 0) | |
1343 page = page_value; | |
1344 continue; | |
1345 } | |
1346 } | |
1347 return page; | |
1348 } | |
1349 | |
1350 void OutOfProcessInstance::SetZoom(double scale) { | 1296 void OutOfProcessInstance::SetZoom(double scale) { |
1351 double old_zoom = zoom_; | 1297 double old_zoom = zoom_; |
1352 zoom_ = scale; | 1298 zoom_ = scale; |
1353 OnGeometryChanged(old_zoom, device_scale_); | 1299 OnGeometryChanged(old_zoom, device_scale_); |
1354 } | 1300 } |
1355 | 1301 |
1356 std::string OutOfProcessInstance::GetLocalizedString(PP_ResourceString id) { | 1302 std::string OutOfProcessInstance::GetLocalizedString(PP_ResourceString id) { |
1357 pp::Var rv(pp::PDF::GetLocalizedString(this, id)); | 1303 pp::Var rv(pp::PDF::GetLocalizedString(this, id)); |
1358 if (!rv.is_string()) | 1304 if (!rv.is_string()) |
1359 return std::string(); | 1305 return std::string(); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1414 pp::Point OutOfProcessInstance::BoundScrollOffsetToDocument( | 1360 pp::Point OutOfProcessInstance::BoundScrollOffsetToDocument( |
1415 const pp::Point& scroll_offset) { | 1361 const pp::Point& scroll_offset) { |
1416 int max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); | 1362 int max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); |
1417 int x = std::max(std::min(scroll_offset.x(), max_x), 0); | 1363 int x = std::max(std::min(scroll_offset.x(), max_x), 0); |
1418 int max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); | 1364 int max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); |
1419 int y = std::max(std::min(scroll_offset.y(), max_y), 0); | 1365 int y = std::max(std::min(scroll_offset.y(), max_y), 0); |
1420 return pp::Point(x, y); | 1366 return pp::Point(x, y); |
1421 } | 1367 } |
1422 | 1368 |
1423 } // namespace chrome_pdf | 1369 } // namespace chrome_pdf |
OLD | NEW |